Unityのアセットバンドルの利用方法をメモ
アセットストアよりAssetBundle Manager & Example Scenesをダウンロードしてインポート。
Asset Bundle Managerに関してはまず下記を読んでおく。
ここが変わる!Unity 5のスマホ開発 ~アセットバンドル、ビルド、プラグイン~
メモ
- Local Asset Bundle Serverを実行時に
Win32Exception: ApplicationName='”C:/Program Files/Unity5.3.5p2/Editor\Data\MonoBleedingEdge\bin\mono.exe”‘エラー
が出る。=>一度Build AssetBundleを実行するとエラーが発生しなくなる - Local Asset Bundle Serverは内部でAssetBundleServer.exeが実行されPort7888のウェブサーバーとして機能する。プロジェクトフォルダ内の\AssetBundlesはhttp://localhost:7888/に対応。他のプロジェクトでビルドしたアセットをテストで利用したい場合はSimulationモードではなく、AssetBundleServerを利用すること。
- Asset Bundle Managerは二重ロードや依存解決してくれるコードが含まれていて便利なラッパー。
- アセットバンドルにはスクリプトを含めることができない
Asset Bundleを体験して理解するために、一連の流れを試してみる
ABProject1で作成したPrefabアセットを、ABProject2で読み込んでみる
ABProject1にて(アセットバンドル作成)
- Asset StoreからAssetBundle Manager & Example Scenesをインポート
- アセットをビルド(Assets – AssetBundles – BuildAssetbundles)
- Windowsの場合は\ABProject1\AssetBundles\Windows以下にビルドされたアセットが作成される。
ABProject2にて(アセットバンドル読み込み)
- Asset StoreからAssetBundle Manager & Example Scenesをインポート
- アセットをビルド(Assets – AssetBundles – BuildAssetbundles)をダミー実行する。これを初回行わないとLocalAssetBundleServerがエラーを吐く
- ABProject1で作成したアセットファイルをABProject2フォルダにコピーする
コピーファイル:ab1、ab1.manifest
コピー元:\ABProject1\AssetBundles\Windows
コピー先:\ABProject2\AssetBundles\Windows - LocalAssetBundleServerを起動
- アセットロード用のスクリプトを設定
LoadAssetsスクリプトを任意のオブジェクト(今回はLoaderと名付けた空オブジェクト)に貼り付ける
Asset Bundle Name:ビルドするときに名付けたアセット名
Asset Name:復元するアセット化したPrefabの名前 - 実行すると、アセットバンドル化したPrefabが読み込まれます
動作を含むオブジェクトをアセットバンドル化して配信したい
アセットバンドルには通常の方法ではスクリプトを含めることができません。アセットバンド化する際にはスクリプトの参照情報のみビルドされます。つまり、スクリプトファイルは、アセット読み込み側プロジェクトにも予め用意しておかなくてはいけません。
特殊な方法としてスクリプトをDLL化して配信するという方法がありますが今回は扱いません。下記のサイトに方法がありますので、参考に。
ゲームをビルドした後でもスクリプト(機能)を追加する(テラシュールブログ)
How to compile script to include it to AssetBundle?(Unity Forum)
動きを含むアセットを配信する一番簡単な方法はPlaymakerなどビジュアルスクリプティングソリューションを用いることのように思います。Playmakerで設定したオブジェクトの挙動はビルド時にアセットバンドル化されるため配信可能です。読み込み側プロジェクトにもPlaymakerをインストールしておけば、配信先でも動作します。ものすごく簡単で便利。
アセットバンドルのキャッシュに関して
AssetBundle Manager & Example ScenesのLoadAssets.csスクリプトは内部でLoadFromCacheOrDownload関数をもちいてアセットをダウンロードしています。既に読み込んだことのあるAssetbundle名のアセットは、LoadAssets.csスクリプトもLoadFromCacheOrDownload関数もキャッシュから読み込みます。つまり、普通にビルドするアセットバンドルを更新して配信するだけでは、そのアセットが新しいものなのかどうか判断してくれません。
キャッシュをクリアするには
- LoadFromCacheOrDownloadの引数でバージョンを指定する。(キャッシュした時より大きい番号を指定すると再読込する)
- Caching.CleanCache();関数でキャッシュをクリアする
アップロードされているmanifestファイル更新されている時だけアセット本体ダウンロードしなおしてくれればいいのに。。。自作するかな。
スクリプト経由でAssetBundleNameを付加する方法
とりあえず、ここまで。後々追記予定。