Minute前回、AssetBundleを利用する際に考慮すべきことを記事にしましたが、その実例を紹介したいと思います。全体的に何を考慮すべきなのかを知りたい人は、前の記事「AssetBundle設計コトハジメ」を見てください。1AssetBundle。同時利用することが確定しているAssetは、複数まとめてAssetBundle化します。こんなイメージでAssetをロードする側が、非同期でAssetのロードを待ち、そのAssetがアプリ内(Resources/)からロードされるのか、ダウンロードが必要なのかは基本的に意識しないつくりにしています。そのため、Resources以下に配置するAssetのパスとAssetBundleのパスは同一にする、というルールにしています。例:「hoge/hogehoge.png」の場合、以下のようになります。:Resources/hoge/hogehoge.pngダウンロードする場合のAssetBundleのパス:https/xxx/hoge/hogehoge.assetbundle複数Assetを1つのAssetBundleにする場合は、ディレクトリ名をAssetBundle名にします。例:「chara01/hoge.pngとchara01/fuga.png」を一つのAssetBundleに含める場合、以下のようになります。Resources/chara01/fuga.pngダウンロードする場合のAssetBundleのパス:https/xxx/chara01.assetbundleこのように、パスやリソースのロードを工夫することで、アプリ内(Resources/)に配置するAssetとダウンロードするAsset(別ディレクトリ)を簡単に入れ替えられるようにしています。この構成から察するかもしれませんが、ダウンロードするタイミングは、Assetが必要になった(ロード要求をした)タイミングになります。アプリ起動時など、特定のタイミングでダウンロードを済ませて起きたい場合は、予めダウンロードするAssetのリストを作っておき、そのタイミングでまとめてロードする、といった使い方も可能です。●Unloadするタイミング前述のとおり、今回はAssetBundleに含まれるAssetはすべて同時利用されるのと、Unity5.3から登場したLZ4形式なら必要な分だけしかメモリを消費しないため、Assetをロード後にすぐUnloadするのではなく、Assetへの参照がなくなった時点でUnloadするようにしています。LZ4(端末に保存、ロード時)」となります。今のところダウンロードするリソースの量はそれほど多くない予定ですが、バージョン管理の仕組みなどは用意したため、後でAssetBundle.LoadFromFileを使った実装に変える、というのも比較的容易にできるようにつくったつもりです。1AssetBundleのため、指定したディレクトリ以下にあるAssetはAssetBundle名を自動で設定しています。ディレクトリ単位でAssetBundleにしたい場合は、エディタ拡張のメニューで設定を変更します。Onにするとディレクトリ名のAssetBundleに対象Assetが含まれるようになります※特定のルールが決まったディレクトリはAssetImporterで自動設定していますEditorWindowを利用して、AssetImporterのassetBundleName、assetBundleVariant、userDataあたりを設定しています。参考:https://docs.unity3d.com/ja/current/ScriptReference/EditorWindow.htmlhttps://docs.unity3d.com/jp/current/ScriptReference/AssetImporter.htmlAssetBundle名の命名規則とこの対応で、手入力によるAssetBundle名の設定は撲滅しています。AssetBundleビルドからアプリにダウンロードされるまでのフローは以下のようになります。1Assetbundleビルド(図左上)専用マシンを用意して、AssetBundleの対象ファイルを追加したり変更する際は、そのマシンで行うようにしています。することで、UnityのAssetBundleビルドが差分だけ走るようにしています。(git経由で別マシンからプッシュしたAssetは再度AssetBundleビルドが走ってしまったり、ファイルの更新日時も変わってしまって管理しづらいため)ビルド時に、更新されたAssetBundleの更新日時を元に、AssetBundle毎のバージョンを上げていきます。2アップロード(図左下)AssetBundleビルド後に更新があったAssetBundleはワンクリックでサーバへアップできるようにしています。この際に、AssetBundleのバージョン情報をcsvファイルに吐き出して、git経由でAPIサーバが参照するDBに登録します。アプリからはこのバージョンを参照してダウンロード判定を行います。3端末からのAPI通信時(図右下)アプリからサーバに通信を行う際に、AssetBundle(リソース)のバージョンチェックを行います。新しいバージョンが登録されている場合、そのリストを取得します。4リソース(Asset)ロード時(図右上)Assetをロードする際に、3で取得したバージョンをチェックし、未ダウンロードの場合や新しいAssetBundleがサーバ上にある場合、ダウンロードした後にAssetをロードします。ダウンロード対象のAssetじゃない場合はアプリ内(Resources)からロードします。●依存関係とAssetBundleManifestAssetBundleビルド時にできるAssetBundleManifestから、独自の管理ファイルを作成しています。用途としては、AssetBundleManifestと同じく依存関係の管理と、バージョン管理、AssetとAssetBundleの紐付けを確認するためのものです。・不要になったAssetBundleを削除する仕組み・同時ダウンロード数の制御となります。