16878
下記手順でアセットバンドルを作成したのですが、  
CreateFormFileを使用してLoadする方法がわかりません。

●アセットバンドル作成側  
1.新しくシーンを作成しCameraの下にCanvasを作り、Canvasの下にButtonを作成しました。  
2.Canvas以下をプレハブとし、そのPrefabにInspector上でAssetBandleの名前をtestcanvas  
としました。  
3.

```

        BuildPipeline.BuildAssetBundles("Assets/BundleOutPut/");
    
```

メソッドにてアセットバンドルを作成し、  
Assets/BundleOutPut/ の下に下記４つのファイルができました。  
**BundleOutPut**  
**BundleOutPut.manifest**  
**testcanvas**  
**testcanvas.manifest**

●アセットバンドルロード側  
作成したBundleOutPutをAssetsの下のStreamingAssetsに置き  
下記のソースでロードしてみたのですがエラーメッセージが表示されます。

```

        public void CreateFileAssetBundleFileLoad()
        {
        string path = "file://" + Application.streamingAssetsPath + "/" 
        + "BundleOutPut";
        AssetBundle NoCompress = 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ではない方に入っていると認識しています。
CC BY-SA 3.0
2015-03-29T10:28:06.370
8528
2015-09-23T13:28:46.097
5261
question
c# unity3d
Unity5のアセットバンドル作成とロード
>
> 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でファイルを読んでもオブジェクトは取得できないので気をつけてください。  
詳しくは以下のサイトを参考にしてください。  
<http://qiita.com/satotin/items/7a481c69230e9393401b>
CC BY-SA 3.0
2015-09-23T13:28:46.097
16878
2015-09-23T13:28:46.097
12383
8528
answer