Unity の AssetBundle 関連に調べてみたら闇が深いことがわかってきた

Unity の AssetBundle の使い方だとか運用方法について調べているのですが、色々と闇が深いことがわかってきました。
...どうやって運用するのが良いのだろうか...

混乱中ではありますが、自分の頭のなかを整理するつもりでメモを残しておこうと思います。

Unity Technologie が公開している AssetBundleManager は処理の流れを把握するためには良い

Asset Store から、Unity Technologies が公開している『AssetBundle Manager & Example Scenes』というアセットが公開されている。
AssetBundle の読み込みから使い方までの基礎を把握するためにはソースコードに目を通すのが良いと思う。

『Unity エキスパート養成読本』では、"第5章 アセットバンドルのロードシステム" としてAssetBundle の使い方が解説されているが、内容は Unity Technologies の AssetBundleManager の改変版を利用して解説を行っている。
参照元として Unity Technologies の AssetBundleManager を利用していると書いてあれば違った読み方が出来たと思うのだが、この本だけ読んでAssetBundle のことを理解しようとしても混乱してしまうと思う。

Bitbucket でも Unity Technologies が AssetBundleDemo を公開しているが、Asset Store から入手できるものの機能追加版といった感じになっており、単純に処理の流れを把握するために参照するのは辛い。

どうも Asset Store から入手できる AssetBundleManager が広く知れ渡ったサンプルとして利用されているようで、この亜種みたいなソースコードが色々と出回っているようだ。

Unity が公式で使いやすい AssetBundleManager を公開すれば良いんじゃないのか?なんてことも考えたのだが、色々と調べていくうちに要件に応じて使い方を変えなければいけないのでサンプルとしてしか提供できないんだとわかってきた。

Unityエキスパート養成読本[ゲーム開発の現場で役立つノウハウ満載! ] (Software Design plus)

Unityエキスパート養成読本[ゲーム開発の現場で役立つノウハウ満載! ] (Software Design plus)

WWW.LoadFromCacheOrDownload はよく考えて導入したほうが良さそう

AssetBundle の闇の大部分がこの WWW.LoadFromCacheOrDownload にあると思う。
このキャッシュが使いにくく感じる原因としては、

  • キャッシュのバージョン管理で新しいバージョンがDLされても古いバージョンが残り続ける
  • キャッシュの個別削除を行うことができない(トリッキーなコードを書く必要がある)
  • (デフォルト)150日でキャッシュが削除される

といった点が挙がる。

前述の AssetBundleManager では、基本的に WWW.LoadFromCacheOrDownload を使うように実装されているので、キャッシュシステムを自前でどうにかしたい場合にはソースコードに修正を加えていく必要がある。

(私は)アプリのAssetBundle に対する要件が詰まってから実装方針を詰めることにする。

(参考)
AssetBundle の管理について

このエントリーは、AssetBundle の運用方針を示してくれる良エントリーだと思う。

Caching.ready は、キャッシュサイズによっては時間がかかるらしい

WWW.LoadFromCacheOrDownload を利用する場合、Caching.ready が true になるまで待たないとキャッシュの読み込みに失敗することがあるらしい。

そして、AssetBundle を大量にキャッシュする場合、Caching.ready が true になるまで時間がかかってしまうようだ。

月次更新などで増え続けるような追加外部リソースなどをキャッシュしておければ便利かと考えていたが、あまりにも時間がかかるようだったら自前でキャッシュシステムを作ってしまった方が良いのかもしれない。

[http://japan.unity3d.com/unite/unite2016/files/DAY1_1800_Room1_Ebata.pdf:title=
学校では教えてくれないアセットバンドルのしくみ]

AssetBundle の依存関係は Manifest で管理されている

以前のバージョン(5.2?)では、依存関係の管理は全て自前で行う必要があったらしいので、Manifest が導入されて随分と状況が改善されたようだ。

AssetBundleManager では、AssetBundleManifest.GetAllDependencies() を利用して依存関係のある AssetBundle を抽出してロード用のキューに積んでいくような実装がされている。

サーバから AssetBundle をダウンロードしてくる場合、パスなりで依存関係を解決できるような運用方法を考えておく必要がありそうだ。

馬鹿正直に考えてしまうと、追加データなどの情報が抜き放題になってしまいそうなので、うまい管理方法を考えておく必要がある。

AssetBundle の暗号化は自前で行う必要がある

このぐらいは Unity が公式でサポートしても良さそうだと思うのだが、現状は用意されていない。

AssetBundleの暗号化について図でまとめてみた

Assetの暗号化について

これらのエントリーはとても参考になると思う。

まとめ

わりと軽い気持ちで調べ始めたのですが、調べていくと考えることが多いことがわかってきました。
後から対応していくとなると結構大変そうなので早いうちにカタを付けてしまいたいところです。

(参考)
UnityのAssetBundleについて調べたメモ