【Unity】【AssetBundle】ヤバいAssetBundleを錬成しないために気を付けるべき3つのこと

UnityのAssetBundleは便利な仕組みですが、何も考えずに作っていると、すごく容量の大きいAssetBundleができてしまったり、
一つのAssetBundleが他のAssetBundleに紐づいていてたくさんのAssetBundleをロードしなければならなくなってしまったりします。
この記事では、そんなヤバいAssetBundleを作らないために気をつけるべきことをまとめます。

Unity2018.3.9

AssetBundleを細かく分けて重複して含まれるAssetを無くす

例えばいま、あるPrefabとそれが参照するMaterialがあるとします。

f:id:halya_11:20190402160637p:plain

それぞれに別のAssetBundle名を付けてビルドすると別々のAssetBundleが生成されて、
PrefabのAssetbundle側に「これはMaterialに依存していますよ」という情報が付加されます。
AssetBundle Browserで見るとこんな感じです。

f:id:halya_11:20190402160851p:plain

ここでMaterialのAssetBundle名を外すと、Materialが自動的にPrefabのAssetBundleにまとめられます。

f:id:halya_11:20190402160919p:plain

AssetBundleをまとめるとファイル数が減るのでメリットがあるのですが、重複に注意が必要になります。

たとえば先ほどのMaterialを他のPrefab(Prefab2)からも参照するように変更します。
Prefab2には先ほどのPrefabとは別のAssetBundle名を付けます。
すると、MaterialがPrefabにもPrefab2にも重複して含まれてしまいます。

f:id:halya_11:20190402160954p:plain

同じリソースを別々のデータとしてコピーして保存しているので、これは無駄です。
今回はMaterialだからいいものの、例えばフォントファイルがテキストを使うごとにコピーされていたりしたら大変な容量になります。

ちなみにAssetBundleBrowserではこのようなAssetBundleに警告を出してくれます。

f:id:halya_11:20190402161037p:plain

重複を防ぐためには、とにかくAssetBundleを細かく分けることです。
全てのAssetを1個1個別のAssetBundleにしておけば、とりあえず重複はなくなります。

ただし、組み込みのAssetから参照されるAssetについては例外的に重複しても仕方がない場合があります。
これについては下記にまとめています。

light11.hatenadiary.com

細かすぎるAssetBundleはまとめる

さて前節のようにすべてのAssetを別々のAssetBundleにすると、重複は解消されますがファイル数が増大します。
また必然的にAssetBundle同士の依存関係も複雑になっていきます。

その結果、下記のスライド(p.61)のように大規模プロジェクトではAssetBundleの読み込み時間が長くなってしまいます。

【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例

このような場合には重複に注意しながらAssetBundleをまとめていく必要があります。
まとめ方はケースバイケースな上に地味な作業になりますが、重要な最適化です。

AssetBundle同士の依存関係に要注意

また、AssetBundle同士の依存関係をしっかり把握しておくことも大切です。
たとえばいろんなメッシュやモーションを持つFBXがAssetBundle化されているとします。

f:id:halya_11:20190402163141p:plain

そしてこのFBXのある一つのメッシュだけを参照したPrefabを作ります。
このとき、Prefabが使用しているのは一つのメッシュだけですが、
そのメッシュはFBXのAssetBundleに属しているので、多数のメッシュを持つこのAssetBundleがロードされてしまいます。

他にも、アニメーションイベントにいろんなPrefabが紐づいていたり、
同じアトラスに含まれるSpriteに違うAssetBundle名を付けたせいでアトラスが重複したりするので、
リソース設計時に依存関係をしっかり理解・設計することが大切です。

関連

light11.hatenadiary.com

light11.hatenadiary.com