UnityのAssetBundleは便利な仕組みですが、何も考えずに作っていると、すごく容量の大きいAssetBundleができてしまったり、
一つのAssetBundleが他のAssetBundleに紐づいていてたくさんのAssetBundleをロードしなければならなくなってしまったりします。
この記事では、そんなヤバいAssetBundleを作らないために気をつけるべきことをまとめます。
Unity2018.3.9
AssetBundleを細かく分けて重複して含まれるAssetを無くす
例えばいま、あるPrefabとそれが参照するMaterialがあるとします。
それぞれに別のAssetBundle名を付けてビルドすると別々のAssetBundleが生成されて、
PrefabのAssetbundle側に「これはMaterialに依存していますよ」という情報が付加されます。
AssetBundle Browserで見るとこんな感じです。
ここでMaterialのAssetBundle名を外すと、Materialが自動的にPrefabのAssetBundleにまとめられます。
AssetBundleをまとめるとファイル数が減るのでメリットがあるのですが、重複に注意が必要になります。
たとえば先ほどのMaterialを他のPrefab(Prefab2)からも参照するように変更します。
Prefab2には先ほどのPrefabとは別のAssetBundle名を付けます。
すると、MaterialがPrefabにもPrefab2にも重複して含まれてしまいます。
同じリソースを別々のデータとしてコピーして保存しているので、これは無駄です。
今回はMaterialだからいいものの、例えばフォントファイルがテキストを使うごとにコピーされていたりしたら大変な容量になります。
ちなみにAssetBundleBrowserではこのようなAssetBundleに警告を出してくれます。
重複を防ぐためには、とにかくAssetBundleを細かく分けることです。
全てのAssetを1個1個別のAssetBundleにしておけば、とりあえず重複はなくなります。
ただし、組み込みのAssetから参照されるAssetについては例外的に重複しても仕方がない場合があります。
これについては下記にまとめています。
細かすぎるAssetBundleはまとめる
さて前節のようにすべてのAssetを別々のAssetBundleにすると、重複は解消されますがファイル数が増大します。
また必然的にAssetBundle同士の依存関係も複雑になっていきます。
その結果、下記のスライド(p.61)のように大規模プロジェクトではAssetBundleの読み込み時間が長くなってしまいます。
【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例
このような場合には重複に注意しながらAssetBundleをまとめていく必要があります。
まとめ方はケースバイケースな上に地味な作業になりますが、重要な最適化です。
AssetBundle同士の依存関係に要注意
また、AssetBundle同士の依存関係をしっかり把握しておくことも大切です。
たとえばいろんなメッシュやモーションを持つFBXがAssetBundle化されているとします。
そしてこのFBXのある一つのメッシュだけを参照したPrefabを作ります。
このとき、Prefabが使用しているのは一つのメッシュだけですが、
そのメッシュはFBXのAssetBundleに属しているので、多数のメッシュを持つこのAssetBundleがロードされてしまいます。
他にも、アニメーションイベントにいろんなPrefabが紐づいていたり、
同じアトラスに含まれるSpriteに違うAssetBundle名を付けたせいでアトラスが重複したりするので、
リソース設計時に依存関係をしっかり理解・設計することが大切です。