「最初からオブジェクトを全部配置するんじゃなくて、後から生成して登場させたいな…」
Unityで開発を進めていると、そんな考えに至る人も多いと思います。
例えばシューティングゲームを作るとしたら「ステージ中盤で中ボスを登場させたい」などでしょうか?
実はResourcesクラスのLoad関数を使えば、これを簡単に実現することができます。
というわけで、今回はResourcesクラスのLoad関数について見てきましょう!
これを理解し使えるようになると、例えばプロジェクトのRresourcesフォルダからプレハブを取得し動的にオブジェクト生成する!
なんてことが行えるようになりますよ!
Unityで作品を作る上で避けては通れない項目です。
ぜひマスターしてしまいましょう!
Resourcesクラスとは?
Resourcesクラスとは一言でいえば「resourcesフォルダの中にあるプレハブなどを取得するためのクラス」と言えます。
プロジェクトに存在する「Resourcesという名前のフォルダーの中身」から色々と取得できるわけですね!
非常に便利そうです。
早速試してみましょう!
Resourcesクラスを使う下準備をしよう!
まずは試すための下準備をしましょう。
とはいえやっていることとしては、以下のような内容です。
①Resourcesフォルダの作成
②取得してくるプレハブの作成
③スクリプト実行用のオブジェクト作成
理解できる人は、飛ばしてしまっても構いません。
まずはフォルダを作ろう!
まずはフォルダを作成しましょう。
Projectウィンドウ上で右クリック→Create→Folderでフォルダを新規に作成しましょう。
またフォルダの名前は、Resourcesに変更しましょう。
テスト用にprefabを作ろう!
テスト用に、Resourcesフォルダの中にCubeプレハブを作っておきましょうか。
プレハブの作り方がわからない人は、以下のリンクからプレハブについておさらいしておきましょう。
プログラムを準備しよう
今回は以下の画像のように、CreateManagerオブジェクトを用意し、CreateManagerスクリプトを紐付けています。
Resources.Loadで動的に取得をしよう!
では実際に利用してみましょう。
ここからはプログラムに入ってきます。
プログラムでResourcesクラスを使おう!
Resourcesクラスを使うだけならば非常に簡単です。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CreateManager : MonoBehaviour { // 初期化 void Start () { // ResourcesフォルダからCubeプレハブのオブジェクトを取得 GameObject obj = (GameObject)Resources.Load ("Cube"); } }
上記のようなプログラムを記述すればそれだけでCubeプレハブを取得できます。
重要なのは以下の一文だけです。
GameObject obj = (GameObject)Resources.Load ("Cube");
引数にプレハブ名を指定すれば、それだけで取得が可能なわけですね!
しかし取得しただけでは、あまり利用価値はありません。
生成まで行って、初めてゲーム中のオブジェクトとして使用可能になるからです。
基本的に、次に紹介するInstantiateとペアで使うことになるでしょう。
Instantiateと組み合わせて動的生成
では取得したプレハブで、オブジェクトを生成してみましょうか。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CreateManager : MonoBehaviour { // 初期化 void Start () { GameObject obj = (GameObject)Resources.Load ("Cube"); // プレハブを元にオブジェクトを生成する GameObject instance = (GameObject)Instantiate(obj, new Vector3(0.0f,0.0f,0.0f), Quaternion.identity); } }
実行結果は以下となります。
実行前はなかったCubeオブジェクトが生成されました!
ちゃんとプレハブを元にCubeオブジェクトが作成されていますね!
またInstantiate関数の詳細は以下のリンクの記事をご確認ください。
もっと詳しくなろう!
※この辺りは初心者の方はスルーしても構いません。いつか必要になったらその時学びましょう。
Resourcesクラスにはまだ機能があります。
その一部をついでに見ていきましょう!
メモリ解放
ResourcesクラスのLoad関数は先ほど見ましたが、他にもいくつか関数が用意されています。
その一つがメモリ解放の関数です。
プログラムは実行されるとメモリ上に展開されます。
いろいろなものをどんどん読み込んでいくとその使用量も増えていき、圧迫し処理が遅くなってしまいます。
そんな時、使っていない情報を破棄することでメモリ上に空きを作る。
これをメモリ解放と言います。
ここで説明するのは以下の関数です。
Resources.UnloadUnusedAssets();
この関数は「使用していないアセットをアンロードする」関数です。
Resources.Load関数で大量に読み込んだりして、メモリを圧迫してしまった場合は、手動での定期解放を検討してもよいかもしれません。
非同期読み込み
ここでは詳細までは触れませんがResources.LoadAsync関数を利用することで非同期読み込みも可能です。
非同期読み込みを実装できれば、例えば「NowLoading」のような演出なども行えるようになります。
そういったことに着手するタイミングでは、再度この辺りについて学んでみましょう。
逆に言えばその時までは、こういうことも出来るんだと覚えておくレベルで問題ないでしょう。
まとめ
今回は、リソースの読み込み周りについて非常に簡単に見てきました。
まだまだ奥の深い項目ですが、とりあえず使用できるまで、学んでいただけていれば幸いです。
まずはResourcesクラスで動的生成を使いこなし作品の質を高めましょう。