この記事でのバージョン
Unity 5.3.4f1 Personal
AssetDatabase
Resourcesディレクトリ以外からアセットをロードしたい時などは
AssetDatabaseが使えます。
アセットをロードするメソッドは一つではないため、一つずつ紹介してきます。
なお、AssetDatabaseを使う時はusing UnityEditor;が必要なのでご注意ください。
LoadAssetAtPath
まず最初は一番シンプルなLoadAssetAtPathです。
以下のようにロードするアセットのクラスとパス(拡張子も必要)を指定してロードします。
//Assets直下のBack.pngというテクスチャを取得する Texture texture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/Back.png");
なお、アセットが存在しないとエラーが出ます。
LoadMainAssetAtPath
LoadAssetAtPathと似ているものに、LoadMainAssetAtPathがあります。
これは型が指定できず、Object形式でロードします。
//Assets直下のBack.pngというテクスチャをObject型で取得する。 Object texture = AssetDatabase.LoadMainAssetAtPath("Assets/Back.png");
これもアセットが存在しないとエラーが出ます。
LoadAllAssetsAtPath
続いてはLoadAllAssetsAtPathです。
名前的にResources.LoadAllを想像したんですが、機能は全然違いました。
例えば以下のような感じで、Rigidbody2DとBoxCollider2Dが付いてるParentというオブジェクトに
Child1とChild2という子がいるような構成でPrefabを作り、Assets直下に置いたとします。
なお、Child1と2にもRigidbody2DとBoxCollider2Dが付いています。
その状態で以下のようなコードでLoadAllAssetsAtPathを実行すると、
foreach (var item in AssetDatabase.LoadAllAssetsAtPath("Assets/Parent.prefab")) { Debug.Log(item.name + " : " + item.GetType().ToString()); }
ParentやChildのコンポーネントを全て取得します。
つまり指定したアセットとその子のコンポーネントを全て取得するようにです。
なお、ディレクトリを指定してもディレクトリ内のアセットは取得できませんでした。
また、指定したパスにアセットが存在しなくても、エラーにならずに空のObject[]が返ってきました。
LoadAllAssetRepresentationsAtPath
LoadAllAssetsAtPathと似ているものに、LoadAllAssetRepresentationsAtPathがあります。
これは指定したアセットの子だけを取得します。
LoadAllAssetsAtPathと同様の条件で、
以下のようなコードでLoadAllAssetRepresentationsAtPathを実行すると、
foreach (var item in AssetDatabase.LoadAllAssetRepresentationsAtPath("Assets/Parent.prefab")) { Debug.Log(item.name + " : " + item.GetType().ToString()); }
Child1とChild2だけ取得します。
これも、ディレクトリを指定してもディレクトリ内のアセットは取得できず、
指定したパスにアセットが存在しなくても、エラーにならずに空のObject[]が返ってきました。
おわりに
見た限り、Resources.LoadAllのように
ディレクトリ内全てのアセットをロードするみたいなものはありませんでした。
なので、そういう処理をしたい場合はSystem.IO.Directory.GetFilesで各アセットのパスを取得、
そのパスからLoadAssetAtPathを使う、みたいな感じの事をする必要がありそうです。
-----------------------------追記
Resources以外からアセットをロードする便利クラス作りました!