AssetBundleを明らかにする(その弐)

前回の記事「AssetBundleを明らかにする(その壱)」で、主に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で設定されている場合、冗長性を回避するために依存関係を確立します。

インクリメンタルリリースをサポートします。つまり、アセットが変更されて再パッケージされると、コンテンツが変更されていない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も同じであるため、お互に置き換えることができます。

携帯電話とタブレットのある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を設定するときにこの問題に注意する必要があります。

●5.xでShader stripping機能は追加されました。パッケージすると、アセット内のShaderは、デフォルトで現在シーンのLightmapとFogの設定に従ってコードが剥離されます。つまり、空きシーンにパッケージしたら、Bundle内のShaderはLightmapとFogのサポートを失い、実行時にライトマップとフォグが失われます。Edit->Project Settings->Graphics内のshader StrippingにあるmodesをManualに変更し、対応するmodeを選択すれば回避できます。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com