AssetBundleまったく分からない人向けのAssetBundleのメンタルモデル

僕自身も大規模ゲーム開発での運用経験は無いので、雰囲気で書いています。間違ってたら教えて下さい。

# はじめに
ともかくUnity5.3以前の記事は全部古いので参考にしないこと、
サンプルコードにWWW.LoadFromCacheOrDownload が使われてたら古いです。webrequestベースが今後は基準らしいです。
→webrequestはUnity2017.2以降であれば問題無さそうです。5系は、つらい…
参考:Unity5.x系ではAndroidのlocalfile内アクセスがコケる
https://forum.unity.com/threads/unitywebrequest-for-local-files-on-android-failure.441655/

このページを読んでいるということは頼れる社内のアセットバンドル便利ライブラリやロードシステム秘伝のタレ、AssetBundle職人さんのアテが無い人だと思います。つらいっすよね…一緒に頑張りましょうね…

### おすすめの実践的な2択
- シンプルな買い切りアプリでアップデートしない → https://github.com/kamanii24/AssetBundleManager これ使う
- 運用前提のアプリでアップデートしていく → https://github.com/sassembla/Autoya これ使う。導入記事書きました。 https://qiita.com/neon-izm/items/27326106738cee2fff69


# 「AssetBundleに対応しておいて」と言われたら何をやらなければいけないのか
大きく分けて以下の3個の実装を考える必要があります。

1. UnityEditor上でAssetBundleを作って、所定のサーバにアップロードすること

2. 実行環境から 1.で置いたAssetBundleをローカルのどこかにダウンロードすること

3. ゲームプレイ中にAssetBundleに逃がしたリソースが必要になった時に、2のダウンロード済みAssetBundleからロード、展開してゲーム内に登場させること

この中で1.については色んなツールや知見がインターネットにも公開されてます。
2.については、最悪の場合は起動直後のシーンで全部ダウンロードする、みたいな仕組みを入れてしまえば荒っぽいですが何とかなります。(ダウンロードキャッシュの存在を確認して、バージョン判定して、とかは必要です)
3. については「個々のゲームによってAssetBundleに逃がしたリソースが必要になるタイミングやシチュエーションが異なる」という理由から **実用的なサンプルがほとんど公開されていません.** 

段々頭が痛くなってきますね。（このページを見せて「大変なんでやらなくて済みませんかね？」と聞いてみましょう）

### 補足
1.を最初からローカルに置く事は出来ますが、実際的にファイルサイズを減らす上の効果は無いのでほとんど使われていません。
2. を行わずに都度サーバ上のAssetBunldeから直接解凍してシーンに読み込む実装も可能ですが、絶対にお勧めしません。
3. は本当に大変で、シーンをアセットバンドル化して参照を明示的に外してやる、とかビルドスクリプトでチェックを掛けないと、AssetBundleに逃がしたはずがビルド内にも同一リソースが含まれたままで**ビルドサイズ減らなくて完全な無駄** みたいな事があります。ありました。はい。

# AssetBundleのメンタルモデル
機能的には上にあげた3個を実装すれば良いんですが、実際運用していくプロジェクトの場合は作った後のアップデートやバグ修正パッチの事を考えなければいけません。一旦実装の話は置いて、どんなメンタルモデルを頭の中に持っておけば良いかの話をします。

AssetBundleはUnityでパッチを作れる仕組みですよ。というのは半分当たりで半分外れでは無いかと思います。
そもそもアセットバンドルはC#のスクリプトなどを含めることが出来ません。なので **バグ修正をアセットバンドルで配信はしません**。**シェーダーも大体アセットバンドルに含めません**

一般的にはモデルやテクスチャや音楽データなどの **ファイルサイズが大きめのデータ類** をアセットバンドルにします。

じゃあパッチでスクリプトのバグを直すにはどうするの？という話ですが、普通にビルドした実行ファイルを配信します。
その実行ファイルからも、過去に配信したアセットバンドルを使い回してダウンロードもしくはキャッシュしてそのまま遊ぶことが出来るので、結果的にパッチのサイズを抑えることが出来ます。

## ふんわりとした例
600MBくらいのバイナリになるプロジェクトがあったとして
最初にロジック,シーンデータ100MB(ver1)+アセットバンドル500MB(ver1)で作って置くと

バグ修正をしたバージョン1.1を配信したいときに、ロジック,シーンデータ100MB(ver1.1)を配信するだけで、アセットバンドルはver1の物をそのまま使い回す事が出来ます。
ver1から遊んでいたユーザからすると、1.1へのアップデートを100MBインストールしたら、残りはダウンロード済でキャッシュ済みのver1のアセットバンドルのまま遊べる、というわけです。

じゃあバージョン1.2でBGMが差し替わりです。みたいな時に、「アセットバンドル全体を置き換えになるので500MBのパッチになります！」となるのは辛すぎますよね。なのでアセットバンドル自体も全体で1個にするわけではなく、種類別や登場シーン別などで何種類にも小分けしておくのが良いです。（極端な例だと1アセットで1アセットバンドル、というプロジェクトもあります）


# 最近のアセットバンドル系の便利ライブラリ群
AssetBundleをまともに運用するために便利なライブラリが作られているので以下を全部入れることを推奨します。

### AssetBundleGraphTool  
https://bitbucket.org/Unity-Technologies/assetbundlegraphtool/
アセットバンドルの名前を手で付けてたら死んでしまうので必須。
AssetBundleBrowserと共存するならScriptDefineSymbolsで「ASSETBUNDLE_BROWSER_INSTALLED」指定が必要です。  
面白い使い方をするならここを参照  
http://sassembla.github.io/Public/2016:12:23%2000-00-00/2016:12:23%2000-00-00.html  


Unite2017Tokyoでも紹介セッションがありましたが、講演資料がデモを含まないので **絶対に** 動画を見た方が良いです。
https://www.youtube.com/watch?v=33V9Dl3X8Aw


### AssetBundleManager  
https://bitbucket.org/Unity-Technologies/assetbundledemo
Unity社製、シミュレーションモードで使うサーバを立てられる。UnityAssetStoreで配信中のバージョンは古すぎるので使わないこと

### AssetBundleBrowser  
https://github.com/Unity-Technologies/AssetBundles-Browser
アセットバンドルのビルドも出来る。アセットバンドルの中身を表示できるので重複チェックや依存関係チェックに必須。


### AssetBundleManager  
https://github.com/kamanii24/AssetBundleManager  
kamanii24さん作、日本語コメントと最小限の手間でダウンロード+シーン内読み込みシステムを作れる(2,3に対応)

### Autoya
https://github.com/sassembla/Autoya  
LoadAssetBundleOnMemoryの中で未取得だったらダウンロードもしてくれたり、依存関係を解決しつつ展開してくれたり、めっちゃ実戦向けなライブラリが入ってます(2,3に対応)
AssetGraphToolとAutoyaを組み合わせたパッケージが配布されているので、Autoyaだけで全部なんとかなります！！！！

やばい！！！べんり！！！！みんなこれ使おう！！！！
という事で紹介記事を書きました。
https://qiita.com/neon-izm/items/27326106738cee2fff69

# アセットバンドルのやばい点
- アセットバンドルからのダウンロードや参照が必要になるかどうかはゲームによって全部変わるので、ロードシステムを大体自作する羽目になります…

- アセットバンドルに含めたリソースをシーンからも参照していると全然ビルド時のバイナリサイズが減りません。めちゃくちゃつらいです。

上記便利ライブラリを突っ込んだ空のプロジェクトに、UnityAssetStoreで適当に買える大きめの完成プロジェクトデータを使って素振り、練習をした方が良いです。手を動かした時間が正義です。あと、配信を確かめるための適当なVPSサーバもあった方が良いです…

今はまだこうやってUnity社謹製のツール群があるんですが、昔の人達は一体どうやってやってたんでしょう、凄い…

# 将来の話
Unite Europe 2017 - AssetBundles: current and future
https://www.youtube.com/watch?v=qGULjJV7Kh0
でこの辺のカスタムローダー書いたりするつらい仕事が将来無くなりそうな新しいAssetBunlde(Adressable Asset System)のデモをしてました。

このAdressable Assetが導入されて安定して使える近い将来に、上記で書いていたアセットバンドル周りの技術やノウハウの重要度は減りそうなので、それまでAssetBunldeに近寄らなくて済むなら近寄らないでおきましょう…やらなきゃいけない人、一緒に頑張っていきましょう！
(新しいAdressableAssetSystemはUnity2018.2以降対応です)