AssetBundleを明らかにする（その弐）

前回の記事[「AssetBundleを明らかにする（その壱）」](https://qiita.com/UWATechnology/items/f04241f14d4add3389c1)で、主に4.xバージョンでのAssetBundle管理メカニズムを分析しました。では、5.xバージョンでの変更は何ですか？

---
#AssetBundleパッケージ（5.x）基礎
##基本紹介
###(1)唯一API
public static AssetBundleManifest BuildAssetBundles(string outputPath,
BuildAssetBundleOptions      assetBundleOptions = BuildAssetBundleOptions.None,
BuildTarget targetPlatform = BuildTarget.WebPlayer);

BuildPipeline.BuildAssetBundlesをコールすると、エンジンはアセットのassetbundleNameプロパティ（以下、abNameと呼びます）に従ってパッケージを自動的にバッチ処理し、Bundleとアセット間の依存関係を自動的に確立します。
###（2）パッケージングルール
アセットのInpectorインターフェイスの下部に一つのabNameを設定できます。全てのabName（パスを含む）は一つのBundleに対応します。つまり、同じabNameを持つアセットが一つのBundleに配置されます。依存アセットが異なるabNameで設定されている場合、冗長性を回避するために依存関係を確立します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a5ca6252-4536-60d1-63fe-a1d59811916f.png)
インクリメンタルリリースをサポートします。つまり、アセットが変更されて再パッケージされると、コンテンツが変更されていないBundleは自動的にスキップします。したがって、4.xと比較すると、Bundleの更新時間が大幅に短縮しています。
###（3）新しいパッケージオプション
前に述べた5.xにデフォルトで有効になっている3つのオプション（アセットの完全性を確保するために使用されるCompleteAssets：、アセットの依存項を収集するために使用されるCollectDependencies、アセットの固定IDを維持するために使用されるDeterministicAssetBundle）以外に、次のオプションが5.xに追加されました。

**●ForceRebuildAssetBundle**
すべてのAssetBundleファイルを強制的に開くために使用されます。

**●IgnoreTypeTreeChanges**
AssetBundleが更新時にTypeTreeの変更を無視するかどうかを決定するために使用されます。

**●AppendHashToAssetBundleName**
AssetBundleファイル名の後にHash値を追加するために使用します。このオプションをオンにすると、ファイル名によって更新されたBundleコンテンツを直接判別できます（4.xでは、通常、バイナリと他の方法で判断する必要がありますが、場合によっては コンテンツが変更されずに再パッケージ化された場合でも、バンドルバイナリは変更されます）。

4.xと違うのは、モバイルプラットフォームに対して、5.xにデフォルトでTypeTree情報をAssetBundleに書き込めるため。モバイルプラットフォームのDisableWriteTypeTreeオプションも意味のあるものになります。
###（4）Manifestファイル
一般的に、4.xバージョンでAssetBundle間の依存関係を記録し、実行時にそれらを使用するために、自分で配置ファイルを維持する必要があります。5.xバージョンでは、Manifestファイルはこの過程を減少できます。
###（5）Variantパラメーター
Variantパラメーターを使用すると、AssetBundleの「マルチ解像度サポート」を簡単に実行できます。詳細な説明については、以下を参照してください。

---
#AssetBundleパッケージ（5.x）進級
新しいシステムでは、次の2つの便利な新機能が追加されました。これにより、開発者に高効率を連れてあげるかもしれません。

###（1）Manifestファイル
パッケージする後に生成されたフォルダでは、各Bundleは関する情報を記録する一つのmanifestファイルに対応しますが、このようなmanifestはインクリメンタルパッケージングでのみ使用されます。同時に、同じ名前のmanifestファイルと対するBundleファイルはルートディレクトリに生成します。このBundleを通じて実行しますと、一つのAssetbundleManifestオブジェクトを取得できます。また、すべてのBundleとそれに依存するBundleは、このオブジェクトが提供するインターフェイスを介して取得できます。
###（2）バリアントパラメータ
アセットのInspectorインターフェイスの下で、abNameだけでなく、Variantも指定できます。パッケージする時にVariantはBundle名の後にサフィックスとして追加されます。異なるvariantのBundleにある同じabNameのアセットは必ず1対1で対応している必要があり、Bundle内のIDも同じであるため、お互に置き換えることができます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f0e647b6-81ec-8a47-84a8-0fa8cde62a9e.png)
携帯電話とタブレットのあるUIインターフェイスで解像度の異なる2セットのテクスチャ、シェーダー、文字ヒントを採用する必要がある場合、Variantの特性を通じて、2つのフォルダーを作成し、2セットの異なるアセットを配置して、アセット名は一対一に対応させます。そして2つのフォルダーに同じabNameと異なるvariantを設定し、UIインターフェイスにabNameを設定して、パッケージしたら完成します。実行時に、適切な依存パッケージを選択してロードし、後でUIインターフェイスをロードする時に、ロードされた依存パッケージに従って対応するバージョンが表示されます。

---
##開発者への注意
●abNameは、スクリプトを使用して設定およびクリアすることも、AssetBundleBuild配列を作成してパッケージ化することもできます。

●新メカニズムのパッケージ化はAssetbundle.mainAssetを指定できないため、mainAssetを介してアセットを直接取得することはできなくなりました。

●DisableWriteTypeTreeをオンにすると、AssetBundleとUnityバージョンの間で互換性の問題が発生する可能性がありますが、Bundleが小さくなり、読み込み速度もわずかに向上します。

●Prefab間に依存関係はありません。つまり、Prefab-AとPrefab-Bが同じテクスチャを引用して異なるabNameを設定しましたが、共有テクスチャがabNameを設定しなければ、Prefab-AとPrefab-Bが別々にパッケージしたと認められ、各Bundleには共有テクスチャが含まれています。したがって、UGUIを使用してSprite Packerを開く場合、AtlasはabNameをマークできないため、UIインターフェイスPrefabのabNameを設定するときにこの問題に注意する必要があります。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/0cf44603-11f3-4cb6-44e3-9700f7d7890e.png)
●5.xでShader stripping機能は追加されました。パッケージすると、アセット内のShaderは、デフォルトで現在シーンのLightmapとFogの設定に従ってコードが剥離されます。つまり、空きシーンにパッケージしたら、Bundle内のShaderはLightmapとFogのサポートを失い、実行時にライトマップとフォグが失われます。Edit->Project Settings->Graphics内のshader StrippingにあるmodesをManualに変更し、対応するmodeを選択すれば回避できます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/2a27df8c-a123-ec8a-d763-9e9e8713f7a7.png)

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com