【Unity】AssetBundle シミュレーターの作り方について
AssetBundleをメインで使用して開発するのは良いのですが、コンテンツを変更するたびにビルドが必要になるので若干面倒くさい所があります。一応、Unity 5からのビルドパイプラインでは、内包するコンテンツに変化がなければ再ビルドしない設計になっていますが、数が数だと非常に時間がかかります。
できればResourcesのように、毎回ビルドせずともロード出来るのが望ましいのです。
なので、今回はAssetBundleの内包するアセットをビルドせずロードする機能を作成してみようと思います。
なお、今回の記事はキャッシュシステムを自作してる人の場合です。
Unity標準のキャッシュシステムを使用していたり、AsssetBundle Managerの運用に気持ち悪さを感じないのであれば、AssetBundle Managerを使うのをお薦めします。
(AssetBundle Simulatorもありますし)
AssetBundle シミュレーター
機能の概要
機能はAssetBundleから取得するアセット群を、普通にプロジェクトから取得するといった感じです。
機能
- AssetBundleを構築せずともアセットの読込が可能
- 変更した内容は即反映
- AssetBundle読込モードに切替可能(の機能を自作出来る)
- 要するに、最終的にAssetBundleへ移行出来るResources
制限
- Variantは非対応
- 依存関係は常に解決した状態でロードされる
- AssetBundleとシミュレーターで依存関係を混ぜる事は出来ない
- あくまでシミュレーター
StreamedSceneAssetBundleの呼出モドキ
まずはStreamedSceneAssetBundleについてです。
通常Sceneをロードする場合にはBuildSettingsにシーンを設定する必要がありますが、AssetBundleはBuildSettingsにSceneを登録しなくても呼べます。なので、以下のメソッドで呼び出します。
下のメソッドであれば、BuildSettingsに登録しなくても呼べます。
- UnityEditor.EditorApplication.LoadLevelAdditiveInPlayMode
- UnityEditor.EditorApplication.LoadLevelInPlayMode
- UnityEditor.EditorApplication.LoadLevelAdditiveAsyncInPlayMode
- UnityEditor.EditorApplication.LoadLevelAsyncInPlayMode
AssetBundleに格納したシーンを取得するには、
- AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName
を使用します。
引数にAssetBundle名とシーン名を指定するとリストの最初にシーンのパスが格納されているので、後はEditorApplication.LoadLevel云々でロードすればOKです。
AssetBundle.LoadAssetモドキ
アセットの呼出はある意味Sceneよりシンプルです。
まずはSceneと同様に、AssetBundle名とAsset名でファイルパスを取得します。
- AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName
取得したパスに対して、以下のAPIでオブジェクトを取得します。
- UnityEditor.AssetDatabase.LoadAssetAtPath<T>
これをAssetBundle.LoadAssetsで取得した感じに、 GameObject.Instantiate.してやれば、インスタンスが生成出来ます。
AssetBundle.LoadAllAssetsモドキ
LoadAllAssetsは少し異なります。まず、指定のAssetBundle名が設定されているアセットを全部取得するAPIで、AssetBundle内(に入る予定の)アセットを全て取得します。
- UnityEditor.AssetDatabase.GetAssetPathsFromAssetBundle
後は取得したアセット全てをリストに格納して、Arrayで返します(LoadAllAssetsがArrayの為)
サンプル
試しに作ってみたサンプルです。
define symbolesにASSETBUNDLE_SIMULATORを設定すればシミュレーターモード、消せばStreamingAssetsからAssetBundleを取得します。
実際に使うときは、こんな感じです。