管理がややこしいAssetBundle の代替として待ち望まれていた新しいAddressable Asset System。
たしかに触ってみると、簡単に外部データを作成しているようですが、「入門」の情報は多いものの、
具体的に何があって、何をどうすればいいのかよく分からない印象を受けました。
(Addressable Asset System で調べるととりあえずの導入は沢山出てきます。)
ここでは Addressable Asset System v 1.16.1 をベースに読み解いていこうと思います。
※Addressableは、Scriptable Build Pipeline, AssetBundle, Unity Web Request, Unity Web Request AssetBundle に依存しています。
※Addressableを更新することで、いままであったものが無くなる、なかったものが増えることは行われていく可能性がありますので、ご注意ください。
まず、何がどうなってるんだかマニュアル読んでも分からないです。使う側がソースの内容を読みながらここまで調べる必要が出てくるのはいかがなものかなと思います。(まだソース読めるだけマシにはなっていますが…。)
使う側としてここを知っておけばいい、という情報が足りないので不親切さを感じます。
1.Addressable Asset System ってなに?
ここでは簡単にしか触れません。入門辺りは多くのサイトで書かれているのでそちらを参考にしたほうが良いでしょう。
簡単にいうと、内部でも外部でも同じ方法で読み込めるシステムを作ってみたよ、というイメージでいいのではないでしょうか。昔から使われているResources/StreamingAssetsは内部に入れとく用データ、AssetBundleは外部に出す用データというイメージですので、それらを同じように参照できるようにしたものというイメージで良いと思います。
概要は以下が一番分かりやすい印象でした。
2.Addressable Asset System用語
カタログ(Catalog) / catalog.json
どんなファイルが格納されているか、いわゆる旧manifest.jsonに似たようなものですが読み込み方法も指定されています。
プロバイダ(Provider)
読み込み方法。サーバ上から読み込むのか、StreamingAssetsから読み込むのか、などの指定。
コンテンツ(Contents) / xxxx.bundle
別称バンドル(bundle)、と呼んでいるものです。
上記用語は、「1.Addressable Asset System ってなに?」の参照先にイメージしやすい図があります。
出力後に出来るデータ郡
ローカル用情報
出力先 : {プロジェクト名}\Library\com.unity.addressables\aa\{OS}\
catalog.json
プロバイダID,インスタンスプロバイダ、シーンプロバイダ、リソースプロバイダなどの情報が格納されています。(ContentCatalogData.cs ContentCatalogDataの内容)
Jsonで読める部分がありますが、読めない部分は何が入っているかソースを読むしかないようです。
m_KeyDataString
base64で、デコードしてみるとバンドル名とCRC、バンドル内アセット名が入っていることを確認できます。最初4バイトがキーの数、そこからはバケットサイズ(m_BucketDataStringの情報)分だけのデータを読み込みます。object型にしてContantsLocation.m_Dataへ渡していますが、内容物は「string,uint32,uint16,int32,hash128,type」「カスタムアトリビュート」などの情報のようです。(SerializationUtility::WriteObjectToByteList参照)
m_BucketDataString
base64で、最初の4バイトはキーの数、そこからキーの数x8バイト(4バイト:オフセット情報 4バイト:エントリ数)+エントリ数x4バイト(インデックス数)
m_EntryDataString
internalId,provider,依存数,依存hash,エクストラデータIndex,キー情報、タイプ情報
m_ExtraDataString
ContentCatalogDataEntryの拡張データ
link.xml
Project Settings -> Player で Managed Stripping Level を高く指定すると、本来消してはいけないソースやシェーダーを、AssetBundleでのみ使用しているからと削除する可能性があります。それを防ぐための依存情報です。これをUnity側のプロジェクトに入れることで、無駄なデータとして削除することがないようにしたxml情報です。
settings.json
ほぼほぼAddressableAssetSettings内の共通情報が含まれています
出力先 : {プロジェクト名}\Library\com.unity.addressables\aa\{OS}\{OS名}\
xxx.bundle
AssetBundle化されたデータ群
出力先 : {プロジェクト名}\Library\com.unity.addressables\{OS}\
addressables_content_state.bin
コンテンツアップデートの際に必要な情報(AddressablesContentStateクラス)が入っています。
(playerVersion(AddressableAssetSettings.PlayerVersion),editorVersion(Unityエディタのバージョン),StaticContentとマークされたビルド内のすべてのアセットの依存関係情報,リモートカタログのパス(更新されたカタログを探すために知っている唯一の場所です), ビルド用に作成されたアセットバンドルに関する情報
外部用情報
Localではないものを出力する際、別に出力されるものがあります。Remoteの出力先などに書き出されます。
書き込み中…
3.Addressable Groupsはなんなの?
ファイルをまとめる際の基準となる情報の一覧。でいいと思います。
以下のような形での持ちかたが違う場合にAddressableGroupが複数個出来上がるイメージです。
Comtent Packing & Loading
Build and Load Paths
どこへ出力・どこから読み込みしたいのかの設定
Advance Options
Compression
Uncompressed : 無圧縮
LZ4 : LZMAよりディスク容量は大きいが読み込み早い
LZMA : ディスク容量は少ないがLZ4より読み込み遅い)にしたい
Include In Build
バンドルをビルドする際に影響範囲に入れる。
(これヤヤコシイですよね。アプリビルドに入れるかのフラグだと思ってしまいます)
Force Unique Provider
BundledAssetGroupSchema内のGetAssetCachedProviderId, GetBundleCachedProviderId の文字列が以下のように変化します
false : {BundledAssetProviderType.Value.FullName}
true : {BundledAssetProviderType.Value.FullName}_{Group.Guid}
BundledAssetGroupSchemaは、AddressableAssetGroup/AddressableAssetGroupTemplateのScriptableObjectが保持してます。
AssetGroupTemplates/Packed Assets
AssetGroups/Built in Data
AssetGroups/Default Local Group
上記データで設定は出来るよう(Built in Dataは隠されていますが)なのですが、ProviderのGUIDをつけてユニークにするメリットが良く分からないので分かったら追記します。
UseAssetBundleCache
trueの場合、アセットバンドルのハッシュ値を使用して、バンドルをダウンロードする代わりにローカルキャッシュからロードできるかどうかを判断します。 (リモートアセットバンドルにのみ適用されます)
UseAssetBundleCrc
trueの場合、アセットバンドルのCRC(Cyclic Redundancy Check)を使用して整合性をチェックします。これは、ローカルバンドルとリモートバンドルの両方に使用できます。
UseAssetBundleCrcForCachedBundles
キャッシュ済みアセットバンドルのCRC(Cyclic Redundancy Check)を使用して整合性をチェックします。
TimeOut
UnityWebRequest時のタイムアウト時間。
0の場合はタイムアウトなし、のはずです。
Chunked Transfer
Unity2019.3以降で非推奨になりました。
UnityWebRequestシステムがHTTP / 1.1チャンク転送エンコーディング方式を採用する必要があるかどうかを示します。 (リモートアセットバンドルにのみ適用されます)
RedirectLimit
「RedirectLimitExceeded」システムエラーで停止する前に、このUnityWebRequestがたどるリダイレクトの数を示します。 (リモートアセットバンドルにのみ適用されます)
RetryCount
リクエストが再試行される回数を示します。
BuildPath
出力先
LoadPath
読み込み先
BundleMode
PackTogether : シーンとアセットは別にしつつも、なるべく一緒にしようとします
PackSeperately : エントリごとにバンドルを作成します。これは、すべてのサブエントリが同じバンドルに移動するため、各エントリがフォルダである場合に役立ちます。
PackTogetherByLabel : ラベルの一意のセットごとにバンドルを作成します。ラベルなし、ラベルA、ラベルAとB、ラベルBのアセットがある場合、4つのバンドルになります。
AssetBundleProviderType
AssetBundleProvider : internalIdが「http」で始まる場合、UnityWebRequestAssetBundleAPIを介してバンドルをロードします。そうでない場合は、AssetBundle.LoadFromFileAsyncを介してバンドルをロードします。
Assets from AssetDatabase Provider : AssetDatabaseAPIを介してロードされたアセットを提供します。このプロバイダーはエディターでのみ使用可能であり、高速反復またはプレイモードでのアセットバンドルのシミュレーションに使用されます。
Sprite from Atlas Provider : アトラススプライト専用プロバイダ。
Assets from Bundle Provider : アセットバンドルに保存されているアセットを提供します。
Json Asset Provider : JSONシリアル化テキストを要求されたオブジェクトに変換します。
Assets from Legacy Resources:Resources.LoadAsyncAPIを介してロードされたアセットを提供します。
Text Data Provider : ローカルまたはリモートのURLから生のテキストを提供します。
Virtual AssetBudnle Provider : アセットバンドルの読み込み動作をシミュレートします。内部的にはAssetDatabaseAPIを使用します。このプロバイダーはエディターでのみ機能します
Assets from Virtual AssetBudnles : キャッシュをバイパスしながら必要なダウンロードサイズを計算するために使用されるAssetBundleRequestOptionsのカスタムバージョン。将来的には、仮想キャッシュが実装される可能性があります。
Content Catalog Provide : コンテンツカタログのプロバイダー。このプロバイダーは、ハッシュファイルを使用して、カタログの新しいバージョンをダウンロードする必要があるかどうかを判断します。
BundleNaming
FileName : バンドル名にハッシュを含めません
Append Hash to Filename : ハッシュをバンドル名に追加します
Use Hash of AssetBundle : バンドル名に指定されたハッシュのみを使用します
Use Hash of Filename : バンドル名にファイル名のハッシュのみを使用します
Resources and Buit In Scenes
Include Resources Floders : チェック有り⇒Resourcesを内包します
Include Build Settings Scenes : アプリの「ビルド設定」に入っているシーンを内包します
全てAddressableで参照するなら上記はONで良いと思いますが、
大体は外部アセットなどで使用されておりAPIは直接呼んでいると思うので、
わざわざAddressable管理する必要はあまりなさそうですね。
さて、Addressables Group 画面に戻りましょう。
Window/AssetManagement/Addressables/Group を選択すると出てくる、「Addressable Groups」ウィンドウ。
「Create Addressables Settings」ボタンを押下することで、Addressable設定を作るようです
作ってみると、Assets/直下にAddressableAssetDataディレクトリがガッツリScriptableObjectが12個作られ、いきなり???な状況に。
えっまず何して何見ればいいの?Addressable Groupsウィンドウの情報も変わって情報が多すぎて混乱します。
まずAddressableGroupsウィンドウを触りたい気持ちを抑え、 Assets/Addressables/AddressableAssetData/ ディレクトリの中を見ていきます。
2.Default Object のScriptableObject
DefaultObject : AddressableAssetSettings のguidを保存しており、EditorBuildSettings.AddConfigObjectで「com.unity.addressableassets」と紐付けされているようです。保存先は以下で、EditorBuildSettings.TryGetConfigObject(com.unity.addressableassets, out AddressableAssetSettingsDefaultObject)をすれば取得できるようになります。
保存先:{ProjectName}/ProjectSettings/EditorBuildSettings.asset
テキストエディタで開くと中身に追加されていました。
com.unity.addressableassets: {fileID: 11400000, guid: fb8dce3a874728f48815eecd4acd0302,
3.AddressableAssetSettings のScriptableObject
AddressableAssetSettings : Addressable Groups が、Addressable Asset Systemの「Create Addressables Settings」が出るか出ないかの大元です。
ディレクトリを変えていた場合、他スクリプタブルオブジェクトごとAssets直下に作り直すため、Asset直下の構成はソースコードを直接いじらない限りやめたほうが良さそうです。
さて、AddressableAssetSettingsには以下ScriptableObjectが紐付けられています。
・DataBuilders/BuildScript…
・AssetGroupTemplates/PackageAssets
上記はScriptableObjectを自身でコピペして、追加することが可能なようです。
なので、それらはそれらで見ればいいため、AddressableAssetSettingsのみで設定できる項目を一つずつ見ていきましょう。
Profile
Profile In Use : バンドルのビルド先、接続先の設定を変えられます。
Catalog
Disable Catalog Update on Startup : カタログの更新をAddressable初期化時に行わないフラグです。オフにしているとInitializeAsync時に更新が走るようです。
Player Version Override : カタログは時間が記述されます。(catalog_xxxx)これをバージョンで上書き出来ますよ。という機能です。v1と書けば、(catalog_v1)が出来上がります。
Compress Local Catalog : ローカルカタログの圧縮。どうせ少ない量ですし多くなってからONにしても問題ないと思います。
Build Remote Catalog : 外部出力する際は必須のような気がしますが、フラグをOFFった利用方法はあるのでしょうか。
General
Send Profiler Events : プロファイラーにイベントを飛ばすようになるようです
Log Runtime Exceptions : ランタイムエラーの場合にログを出力するようです
Custom certificate handler : カスタム証明書の処理に使用するクラス。このタイプは、UnityEngine.Networking.CertificateHandlerから継承する必要があります。
Unique Bundle IDs : 一意のバンドルIDを確保するには、これをtrueに設定します。バンドルIDの重複を許可するには、falseに設定します。
Contiguous Bundles : 設定されている場合、ソースアセットの順序に基づいてアセットをバンドルに連続してパックします。これにより、アセットの読み込み時間が改善されます。 1.12.1より古いバージョンのAddressablesでバンドルを構築していて、バンドルの変更を最小限に抑えたい場合は、これを無効にします。
Max Concurrent Web Requests : 同時Webリクエストの最大数。この値は1から1024に丸められます。
Build and Play Mode Scripts : エディタでの再生時のモード郡
Use Asset Database(faster) : AssetDatabaseを利用した、AssetBundleを使用しない読み込み
Simulate Groups (advanced): バンドルを介してロードされたかのように、アセットデータベースからロードされるエミュレーション機能。多分あまり使われない。
Use Existing Build (requires built groups):アセットバンドル作ってRemoteへアクセスできる状態でないと確認できないモード。
Default Build Script : 設定アセットのGUIDのみをPlayerPrefsに保存します。すべてのカタログデータは、必要に応じて設定から直接生成されます。
Asset Group Templates : アセットグループのテンプレート
Initialization Objects : ランタイム初期化を提供するためのIObjectInitializationDataProviderインターフェイスを実装するScriptableObjectsのリスト。
とりあえずパラメータだけは羅列できましたかね…?なんのデータがどこに入っているのかの参考になれば幸いです。
参考URL
Manual
Addressables are here!
Unity Forum Addressable is so confusing 🙁
Make the same build load different version of bundles
元のドキュメントも読んでいるんですが、おかしいところもあり日本語での説明助かりました!
なんか更新頻度も含めて、まだこなれているpackageではないですよね..それでも代替案があまりないから使ってますが..
Thank you!!1
WindowsからMacへ移行する際にビルドしたAddressablesのカタログバージョンを変えたらWin(cat1.0)からつくったデータももMac(cat2.0)から作ったデータも両立してくれました。
MacとWinから出るSaveDataは少し違うような気がします。