読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Resources以外からアセットをロードする【Unity】【エディタ拡張】

Unity エディタ拡張

このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.3.4f1 Personal


はじめに

今回はResourcesディレクトリ以外から何かしらのアセットをロードする時の方法です。

なお、エディタ上でしか機能しないのであしからず。つまり、エディタ拡張の時用ですな。


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が付いています。


f:id:kan_kikuchi:20160419135828p:plain


その状態で以下のようなコードでLoadAllAssetsAtPathを実行すると、

foreach (var item in AssetDatabase.LoadAllAssetsAtPath("Assets/Parent.prefab")) {
  Debug.Log(item.name + " : " + item.GetType().ToString());
} 


ParentやChildのコンポーネントを全て取得します。


f:id:kan_kikuchi:20160419135908p:plain


つまり指定したアセットとその子のコンポーネントを全て取得するようにです。

なお、ディレクトリを指定してもディレクトリ内のアセットは取得できませんでした。


また、指定したパスにアセットが存在しなくても、エラーにならずに空のObject[]が返ってきました。


LoadAllAssetRepresentationsAtPath

LoadAllAssetsAtPathと似ているものに、LoadAllAssetRepresentationsAtPathがあります。

これは指定したアセットの子だけを取得します。


LoadAllAssetsAtPathと同様の条件で、


f:id:kan_kikuchi:20160419135828p:plain


以下のようなコードでLoadAllAssetRepresentationsAtPathを実行すると、

foreach (var item in AssetDatabase.LoadAllAssetRepresentationsAtPath("Assets/Parent.prefab")) {
  Debug.Log(item.name + " : " + item.GetType().ToString());
}


Child1とChild2だけ取得します。


f:id:kan_kikuchi:20160419135858p:plain


これも、ディレクトリを指定してもディレクトリ内のアセットは取得できず

指定したパスにアセットが存在しなくても、エラーにならずに空のObject[]が返ってきました。


おわりに

見た限り、Resources.LoadAllのように

ディレクトリ内全てのアセットをロードするみたいなものはありませんでした。


なので、そういう処理をしたい場合はSystem.IO.Directory.GetFilesで各アセットのパスを取得、

そのパスからLoadAssetAtPathを使う、みたいな感じの事をする必要がありそうです。


-----------------------------追記

Resources以外からアセットをロードする便利クラス作りました!