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

(:3[kanのメモ帳]

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

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

Unity エディタ拡張

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


この記事でのバージョン
Unity 5.4.0f3


はじめに

以前、Resources以外からアセットをロードする方法を紹介しました。



その時、AssetDatabaseを使えばResources以外からもアセットをロードできるが、

Resources.LoadAllのようにディレクトリ内全てのファイルをロードするメソッドはない

という話で終わりました。


なので今回はResources以外のディレクトリにある全てのファイルをロードする方法

Resources以外のディレクトリからファイルをロードする便利クラスのご紹介です!


なお、エディタ上のみの動作ですのであしからず。


System.IO.Directory.GetFiles

Resources以外のディレクトリにある全てのファイルをロードする方法は、

System.IO.Directory.GetFilesを使ってディレクトリ内の全ファイルのパスを取得、

取得したパスとAssetDatabase.LoadAssetAtPathを使ってアセットを取得する。

という感じです。


例えばAssets/FileLoadというディレクトリにある全Objectを取得するコードは以下の通り。

string directoryPath = "Assets/FileLoad";
List<Object> assetList = new List<Object> ();

//指定したディレクトリに入っている全ファイルを取得(子ディレクトリも含む)
string[] filePathArray = Directory.GetFiles (directoryPath, "*", SearchOption.AllDirectories);

//取得したファイルの中からアセットだけリストに追加する
foreach (string filePath in filePathArray) {
  Object asset = AssetDatabase.LoadAssetAtPath<Object>(filePath);
  if(asset != null){
    assetList.Add (asset);
  }
}


System.IO.Directory.GetFilesでパスを取得した時点では

metaファイル等もObject以外も含まれていますが、それらのObject以外のファイルは

AssetDatabase.LoadAssetAtPathでは取得出来ずにnullになるので間引くことができます。


NonResources

以前の記事と上記の内容をまとめて、Resourcesクラスのように

Resourcesディレクトリ以外からもLoadやLoadAll出来るNonResources作りました。


なお、名前はNonResourcesですが、Resourcesディレクトリからも普通にロードできます。



このNonResourcesをEditorディレクトリに入れれば、以下のような感じで

簡単にResourcesディレクトリ以外からロードできるようになります。

//単体ロード(Assets直下にあるimgという画像ファイルをロード)
Object  obj     = NonResources.Load         ("Assets/img.png");//Objectで取得
Texture texture = NonResources.Load<Texture>("Assets/img.png");//Textureで取得

//複数ロード(Assets直下にあるImageというディレクトリ内にある全ファイルをロード)
List<Object>  objList     = NonResources.LoadAll         ("Assets/Image");//全Objectを取得
List<Texture> textureList = NonResources.LoadAll<Texture>("Assets/Image");//全Textureを取得