AssetBundleにて依存先と依存元を分割すれば、ロード時間やアセットのメモリ使用量等を上手く節約出来ます。
ただ、このアセットの分割でえすが分割されないケースがあります。
AssetBundleを分割する
AssetBundleが分割されないケース
AssetBundleが分割されないケースは、以下の様な手順で確認出来ます。
- まずボールのモデルをprefab、シーンをsceneのAssetBundleに設定します。
- 次に、ステージ上の全てのアセットにstaticを設定します。
- 後はstageシーンをAssetBundleからロードすると、prefab assetbundleを読み込まなくともモデルが含まれています。
BatchingStaticしたメッシュは結合する
この謎を解く鍵は、ロードしたアセットのメッシュをよく見ると分かります。通常であれば、メッシュを読み込む場合、読み込み先のメッシュが指定されます。今回の場合RollerBallが指定されているはずです。
しかし実行時にはCombine Meshと差し替わっています。
今回の重要な事は、Batching Staticを設定している事です。staticにチェックを入れると、Lightmap staticやNavmeshStaticの他、全てのstaticにチェックが入ります。
ここでbatching staticに設定されているアセットは、ビルド時に結合(実際にメッシュを結合する訳では無い模様)され、参照元のメッシュとは異なるメッシュとして登録されるみたいです。そのため、今回紹介したような事象が起こった…という訳です。
実際にcombine meshを確認すると、見事に結合されてます。
実際にbatching staticを外すと、ちゃんと期待通りに動作します。ただしbatcingは効きにくくなるので、そこはケースバイケースで。
ちなみに、この現象はたぶん「シーンをAssetBundle化した」場合起こります。static設定はあくまで「シーン内で静的であること」が前提みたいなので、prefabにstaticを設定してもコレは起こらないと思います。
結構ゲームを見てると「とりあえずstatic」付けてる人は多いですが、実際にはOccluder staticやLightmap Static等、ちゃんと判断して設定する必要がある項目もあるので、注意が必要かなと思わなくも。