この記事でのバージョン
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を取得