Unity でテクスチャや音などをゲームオブジェクトに適用する際、エディタにあるインスペクタ欄で操作すると思う。基本的に使用するファイルは予めセットしないといけない。ファイル数が多いと大変。
それとは別に Resources フォルダに入れたファイルはスクリプトから Resources クラスによりアクセスする事ができます。
例えば以下のような感じ。
// テクスチャー
// Resources/Textures/HogeTexture を読み込んで NGUI の UITexture に適用している
GameObject.Find("Image").GetComponent<UITexture>().mainTexture
= Resources.Load("Textures/HogeTexture") as Texture2D;
// オーディオクリップ
audio.clip = Resources.Load ("Sounds/HogeSound") as AudioClip
// テキスト
// Resources 直下にある HogeText を読み込む
TextAsset textAsset = Resources.Load("HogeText") as TextAsset;
// プレハブを Resources からインスタンス化してみる
GameObject hoge = Instantiate(Resources.Load ("Prefabs/HogePrefab")) as GameObject;
複数のファイルを読み込む場合は Resources.LoadAll が利用できる。
GameObject[] textures = Resources.LoadAll("Textures");
// 型指定で読み込む時はジェネリック使える
Texture2D[] textures = Resources.LoadAll<Texture2D>("Textures");
使わないものは Unlaod する
リソース沢山読み込むとやはりメモリも使うので、使わなくなったアセットがありそうなら Resources.UnloadUnusedAssets() を呼ぶ。(らしいんだけど、ちょっと今手元に Pro ライセンスなくてプロファイラで確認できない)
Resources.UnloadUnusedAssets();
Resources フォルダは複数使用できる
Resources フォルダはどこに配置しても良く、さらに複数存在していても良いらしい。
ハマケン100%開発: Unity: Resourcesフォルダが複数ある時の読み込みテスト
複数あっても1つの Resources フォルダとして扱うようだ。
ファイル名が重複したらどっちが来るのか謎だし管理が面倒な事になりそうだけど...。
Resources の欠点
Resources 以下に保存したファイルは使用しなくてもビルドに含まれてしまうので管理しないと無駄にバイナリのサイズが大きくなる。
また、巨大なファイルや大量のファイルを一度に読み込むとゲームが止まるっぽい。
もう一つの問題は、この処理を非同期で実行することができない事。
色々調べて分かったけど、どうもResources.Loadを別スレッドに乗せて実行することが
出来ないらしい。なので必然的に(大きい||大量なファイル)を読み込む際はゲームが停止する。
ロードの待ち時間を短くする(その3/Resources.Load) - テラシュールブログ
Resources を利用したほうが都合が良いファイルだけにとどめておいたほうが良いと思う。
コメント