テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】AssetBundle シミュレーターの作り方について

AssetBundleをメインで使用して開発するのは良いのですが、コンテンツを変更するたびにビルドが必要になるので若干面倒くさい所があります。一応、Unity 5からのビルドパイプラインでは、内包するコンテンツに変化がなければ再ビルドしない設計になっていますが、数が数だと非常に時間がかかります。

 できればResourcesのように、毎回ビルドせずともロード出来るのが望ましいのです。

 

なので、今回はAssetBundleの内包するアセットをビルドせずロードする機能を作成してみようと思います。

 

なお、今回の記事はキャッシュシステムを自作してる人の場合です。
Unity標準のキャッシュシステムを使用していたり、AsssetBundle Managerの運用に気持ち悪さを感じないのであれば、AssetBundle Managerを使うのをお薦めします。
(AssetBundle Simulatorもありますし)

tsubakit1.hateblo.jp

 

AssetBundle シミュレーター

 

機能の概要

機能はAssetBundleから取得するアセット群を、普通にプロジェクトから取得するといった感じです。

 

機能

  • AssetBundleを構築せずともアセットの読込が可能
  • 変更した内容は即反映
  • AssetBundle読込モードに切替可能(の機能を自作出来る)
  • 要するに、最終的にAssetBundleへ移行出来るResources

制限

  • Variantは非対応
  • 依存関係は常に解決した状態でロードされる
  • AssetBundleとシミュレーターで依存関係を混ぜる事は出来ない
  • あくまでシミュレーター

StreamedSceneAssetBundleの呼出モドキ

f:id:tsubaki_t1:20160830005557g:plain

まずはStreamedSceneAssetBundleについてです。

通常Sceneをロードする場合にはBuildSettingsにシーンを設定する必要がありますが、AssetBundleはBuildSettingsにSceneを登録しなくても呼べます。なので、以下のメソッドで呼び出します。

下のメソッドであれば、BuildSettingsに登録しなくても呼べます。

  • UnityEditor.EditorApplication.LoadLevelAdditiveInPlayMode
  • UnityEditor.EditorApplication.LoadLevelInPlayMode
  • UnityEditor.EditorApplication.LoadLevelAdditiveAsyncInPlayMode 
  • UnityEditor.EditorApplication.LoadLevelAsyncInPlayMode

f:id:tsubaki_t1:20160830012118j:plain

AssetBundleに格納したシーンを取得するには、

  • AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName

を使用します。

引数にAssetBundle名とシーン名を指定するとリストの最初にシーンのパスが格納されているので、後はEditorApplication.LoadLevel云々でロードすればOKです。

AssetBundle.LoadAssetモドキ

f:id:tsubaki_t1:20160830011524g:plain

アセットの呼出はある意味Sceneよりシンプルです。

まずはSceneと同様に、AssetBundle名とAsset名でファイルパスを取得します。

  • AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName

取得したパスに対して、以下のAPIでオブジェクトを取得します。

  • UnityEditor.AssetDatabase.LoadAssetAtPath<T> 

これをAssetBundle.LoadAssetsで取得した感じに、 GameObject.Instantiate.してやれば、インスタンスが生成出来ます。

f:id:tsubaki_t1:20160830012041j:plain

AssetBundle.LoadAllAssetsモドキ

LoadAllAssetsは少し異なります。まず、指定のAssetBundle名が設定されているアセットを全部取得するAPIで、AssetBundle内(に入る予定の)アセットを全て取得します。

  • UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle 

後は取得したアセット全てをリストに格納して、Arrayで返します(LoadAllAssetsがArrayの為)

f:id:tsubaki_t1:20160830012018j:plain

 

サンプル

試しに作ってみたサンプルです。

define symbolesにASSETBUNDLE_SIMULATORを設定すればシミュレーターモード、消せばStreamingAssetsからAssetBundleを取得します。

gist.github.com

 

実際に使うときは、こんな感じです。

f:id:tsubaki_t1:20160830012557j:plain

gist.github.com

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp