質問: AssetBundle.CreateFromFile(path); Instantiate(NoCompress.mainAsset); } ``` エラーメッセージ:Error while reading AssetBundle header! エラーメッセージ:NullReferenceException: Object reference not set to an instance of an object ●質問 ・Unity4.xと違い拡張子がUnity3dではないアセットバンドルが作成されるのですが、 Unity5からは拡張子がUnity3dでなくてもロードできるのでしょうか? ・AssetBundle.CreateFromFile(path)でロードする時に必要なファイルは manifestが拡張子についていない側をパス付きでロードすれば良いでしょうか? AssetBundle自体はmanifestではない方に入っていると認識しています。
回答: > > Unity4.xと違い拡張子がUnity3dではないアセットバンドルが作成されるのですが、Unity5からは拡張子がUnity3dでなくてもロードできるのでしょうか? > > > はい。Unity5からは拡張子は任意のもので大丈夫です。 > > AssetBundle.CreateFromFile(path)でロードする時に必要なファイルはmanifestが拡張子についていない側をパス付きでロードすれば良いでしょうか? > > > はい。manifestがないほうをロードしてください。 ただし質問内容の使い方ではいくつか問題があります。 まず、CreateFromFile()は非圧縮のアセットバンドルしか使用することができません。 BuildPipeline.BuildAssetBundles()にてBuildAssetBundleOptionsを指定しない場合はNoneになってしまうため、非圧縮用のオプションを指定してください。 ``` BuildPipeline.BuildAssetBundles("Assets/BundleOutPut/", BuildAssetBundleOptions.UncompressedAssetBundle); ``` 読み込みパスを指定する際に、"file://"の記述がありますが、これはWWWクラスを用いてローカルファイルのパスを指定する際に使うものです。 CreateFromFile()はローカルファイルを取得する関数なので"file://"は必要ありません。 testcanvasのアセットバンドルを読み込む場合は、LoadAsset関数を使って以下のとおりにすることで読み込めます。 ``` string path = Application.streamingAssetsPath + "/"; AssetBundle ab = AssetBundle.CreateFromFile( path + "testcanvas" ); foreach( var assetName in ab.GetAllAssetNames() ) { var asset = ab.LoadAsset< GameObject >( assetName ); GameObject.Instantiate( asset ); } ``` BuildPipeline.BuildAssetBundles()関数で指定したフォルダ名と同名のファイル(今回の場合はBundleOutPut)は複数のAssetBundleを作成した場合の、全AssetBundleのパスと関係性の記述されたファイルですので、このファイルそのものをLoadAssetでファイルを読んでもオブジェクトは取得できないので気をつけてください。 詳しくは以下のサイトを参考にしてください。