Top > ComputerGraphics > Unity > Tips > Script > DynamicAssetsLoading
Last-modified: Mon, 22 Jul 2013 06:02:04 HADT
Counter:29161 Today:14 Yesterday:6 Online:4
このエントリーをはてなブックマークに追加

スクリプトからアセットを読み込む

About

プログラムの実行中にスクリプトからアセットを読み込みたい場合などがあります。その方法について取りまとめていきます。

How To

Resources.Loadを用いた読み込み

UnityのAssetsフォルダ内に登録済みのアセットを読み込むには、Resourcesクラスを利用します。読み込んだアセットはObjectとして与えられるため、適切なクラスにキャストするなどの操作が必要になります。サンプルではテクスチャを読み込んでいますが、これはGameObject、例えばPrefabやモデルデータを読み込むこともできます。

Texture2D tex2d = Resources.Load("アセット名") as Texture2D;

Resourcesクラスを用いたアセットの読み込みは、"Resourcesフォルダ"以下に配置されるアセットしか読み込むことができません。しかしながら検証した結果、先のサンプルコードのような実装環境下では、次の2つのようなパターンで読み込みできることが分かりました。

  • "Assets/Resources/アセット"
  • "Assets/Textures/Resources/アセット"

また"Assets/Resources/Textures/アセット"となるアセットを読み込む場合には、次のように、Resources以降のパスを指定します。

Texture2D tex2d = Resources.Load("Textures/アセット名") as Texture2D;

Unityのアセット名やそのファイルパスはバックスラッシュ(¥)を利用できません。

WWWクラスを利用する方法であれば"Resourcesフォルダ"に限定されることがなくなります。

Resources.LoadAllを用いた読み込み

特定のフォルダに含まれるアセット(リソース)をすべて読み込みたい場合は、"Resources.LoadAllメソッド"を利用します。メソッドの基本的な扱い方については、Resources.Loadと同様です。しかしながら、複数のアセットを読み込むとき、読み込まれたObjectが、どんな種類のアセットであるか分からなくなる問題があります。例えば、GameObjectなのかTextureなのかMaterialなのか分からない場合があります。Objectにはnameプロパティが与えられていますが、nameを確認して、そのObjectがどんなリソースであるかを判断することは非効率です。(この問題は、対象とするフォルダに含まれるアセットが全て同じ種類のアセットであることが分かっている場合には発生しません。)

そこでLoadAllメソッドに設けられた2つ目の引数を利用します。2つ目の引数にはSystem.Typeを指定し、読み込むアセットをその種類のアセットに限定します。サンプルではGameObjectとしましたが、必要に応じてTextureやMaterialに変更することも考えられます。こうすることで特定のアセットのみを読み込むことができます。

Object[] gameObjectArray = Resources.LoadAll("対象のフォルダ",typeof(GameObject));

GameObjectを指定すると、モデルとPrefabとが読み込まれます(他にも読み込まれるかも)。Modelにはふつう、それに付随するリソースが合せて管理されているため、読み込む対象を上手く限定する(しない)必要があるかもしれません。

Resources.LoadAssetAtPathを利用するパターン

Resources.Loadメソッドに類似するメソッド、Rssources.LoadAssetAtPathメソッドは(Unity)Editorでのみ有効なメソッドです。したがってこのメソッドを利用してアセットを読み込む方法はあまり良い方法とは言えません。可能な限り回避するべきです。実行ファイルやWebプレイヤーではこのメソッドは必ずnullを返す仕様になっています(いるようです)。