はじめに
当ブログで紹介してきた Addressable Asset System に関する記事を 140 件以上まとめました
注意
古いバージョン(1.6.2 など)のころに書いた記事も混ざっているため
最新のバージョンだと既に動かないプログラムが紹介されていたりする可能性があります
目次
TIPS
- カタログの種類
- 例外を検知する方法
- ビルドのキャッシュの保存先
- すべてのラベルを取得する方法
- .gitignore の設定
- 事前ダウンロードする方法
- 詳細なログ出力を有効にする方法
- 実行時エラーログを無効化する方法
- プラットフォーム情報を取得する方法
- デフォルトの Profile の各パス
- 初期化を任意のタイミングで行いたい場合
- 差分ビルドが必要なエントリを取得する方法
- 依存している Unity Package
- 設定が変更された時に呼び出されるイベント
- ビルドできるファイルかどうかを確認する方法
- ビルドした時にビルド結果の詳細を出力する方法
- キャッシュの保存場所や保存期間を変更する方法
- テンプレートとグループの設定が等しいか確認するクラス
- 指定したアドレスが読み込めるかどうか確認する方法
- ダウンロード対象のアセットバンドルの容量を取得する方法
- 指定したアドレスに紐づくアセットが存在するか確認する方法
- AssetReference からアドレスを取得する方法
- カタログをダウンロードする時に使用される Provider
- Profile の各種パスには自作の静的プロパティを指定できる
- 現在の Play Mode Script の名前を取得する方法
- アセットバンドルのダウンロード URL をカスタマイズする方法
- カタログがビルドされている箇所、ランタイムで読み込まれている箇所
- リモートカタログがキャッシュされるフォルダ(Windows 10)
- LoadAssetAsync に存在しないアドレスやラベルを指定した場合
- StreamingAssets の link.xml を読み込むスクリプト
- DownloadDependenciesAsync の引数に渡せる key
- Basic 認証が設定されたサーバからリモートカタログをダウンロードする方法
- IResourceLocation を Json 形式で出力するための構造体
- ゲームをビルドする時に自動で Addressables のビルドを実行する方法
- Unity を再生した時やアセットバンドルをビルドした時に呼び出されるコールバック
- StreamingAssets の catalog.json を読み込むスクリプト
- ExceptionHandler で例外が出力されたキーと型をログ出力するサンプル
- StreamingAssets の settings.json を読み込むスクリプト
- AddressableAssetsData フォルダ以下のアセットはビルドに含まれない
- Bundle Naming を Filename にした時にどのようにパッキングされるか
- Addressables.LoadContentCatalogAsync の引数に渡すパス
- BuildPath や RuntimePath などを参照するとどのような文字列を取得できるか
- Resources フォルダや Build Settings に登録しているシーンを含めない方法
- CheckForCatalogUpdates や UpdateCatalogs の基本的な使い方
- Library/com.unity.addressables フォルダをバージョン管理に含める方法
- AssetBundleRequestOptions でハッシュ値や CRC、ビルドサイズを取得できる
- Asset Group の Inspector で Advanced Options を常に開いた状態にしたい場合
- Bundle Naming を Use Hash of Filename にした時に生成されるハッシュを取得する方法
- AddressablesImpl.hasStartedInitialization をリフレクションで false にする方法
- AddressableAssetEntry.SetAddress はアドレスが変更された時のみ処理が実行されるようになっている
- BuildScriptBase を継承したインスタンスを Addressable Groups の Build メニューに追加する方法
- InitializeAsync を実行したときに InternalIdTransformFunc で呼び出される InternalId
- 各グループの BundledAssetGroupSchema の Build Path や Load Path の名前を取得するサンプル
- アプリビルド時に StreamingAssetsCopy フォルダ以下のアセットが StreamingAssets フォルダに自動で追加される
- PlatformMappingService.GetAddressablesPlatformInternal をリフレクションで参照する関数
トラブルシューティング
- Unsaved scenes
- SBP ErrorUnsavedChanges
- アセットを変更していないのにビルドに時間がかかる場合
- InitializeAsync を複数回呼び出したい場合
- グループの設定を変更してビルドしても設定が反映されない場合
- PercentComplete が正常な値を返してくれない場合
- 従来のアセットバンドル名の仕組みを使用していると表示される警告
- ビルドすると定期的に数 KB の GC Alloc が発生する場合
- グループの GUID が重複している状態でビルドした時に出るエラー
- InitializeAsync が完了しない現象に遭遇した時のメモ
- 2回目以降の InitializeAsync で進行不能になった場合
- 無効なファイルや Unity がサポートしていないファイルを無視する方法
- ROM で InitializeAsync 時にエラーが発生した時のメモ
- GetDownloadSizeAsync に失敗する現象に遭遇した時のメモ
- 再生に時間がかかる場合は AssetReference が原因の可能性がある
- ローカルカタログを圧縮する場合にビルドログがアプリに含まれないようにする方法
- アドレスが重複している状態でアセットバンドルをビルドした時に出力されたエラー
- InitializeAsync でリモートカタログが読み込めなかった場合も成功になる
- シーンのアセットバンドルの読み込みに失敗した場合にもシーンの読み込み処理に進んでしまいエラーと例外が発生する
- IOException: Directory Library/BuildCache\XXXX is not empty
- Error while downloading Asset Bundle: CRC Mismatch に遭遇した時のメモ
- DontDestroyOnLoad したゲームオブジェクトが参照しているアセットやスクリプトが Missing になってしまう現象の対応方法
- Player content must be built before entering play mode with packed data.
- 1.7.4 だと AddressableAssetSettings の設定を Inspector で変更して Ctrl + S を押しても保存されない
- DownloadDependenciesAsync で AsyncOperationHandle.PercentComplete が正常な値を返してくれない場合のメモ
- Broken text PPtr in file(XXXX.unity). Local file identifier (YYYY) doesn't exist!
- ArgumentException: Asset 'Assets/__DELETED_GUID_Trash/XXXX' is not a valid Asset or Scene.
- MissingMethodException: Default constructor not found for type UnityEngine.ResourceManagement.AsyncOperations.ProviderOperation
エディタ拡張
- グループを作成するエディタ拡張
- ビルドのキャッシュを削除するエディタ拡張
- グループ名を昇順でソートするエディタ拡張
- エディタ拡張で ビルド・クリーンを実行する方法
- 全ラベルをクリップボードにコピーするエディタ拡張
- リモートカタログのキャッシュを削除するエディタ拡張
- 全アドレスをクリップボードにコピーするエディタ拡張
- 全グループ名をクリップボードにコピーするエディタ拡張
- デフォルト以外のすべてのグループを削除するエディタ拡張
- リモートカタログのキャッシュのフォルダを開くエディタ拡張
- Play Mode Script を変更するエディタ拡張
- エディタ拡張で Profile の情報を取得するサンプル
- デフォルト以外のすべての空のグループを削除するエディタ拡張
- アセットやフォルダにラベルを割り当てる・解除するエディタ拡張
- アセットが削除された時にグループを更新しないようにするエディタ拡張
- アセットやフォルダにアドレスを割り当ててグループに追加するエディタ拡張
- カタログに記述されているアセットバンドルの一覧をログ出力するエディタ拡張
- AddressableAssetsWindow を再描画するエディタ拡張
- すべての Missing Reference なグループを削除するエディタ拡張
- BundledAssetGroupSchema.BundleNaming を変更するエディタ拡張
- Windows でダウンロードしたアセットバンドルのキャッシュが保存されるフォルダを開くエディタ拡張
- BundledAssetGroupSchema.AssetBundleProviderType を変更するエディタ拡張
- BundledAssetGroupSchema の Build Path と Load Path を変更するエディタ拡張
- Git で Clone や Pull した時に AddressableAssetSettings.asset が変更状態になる現象を防ぐエディタ拡張
エラーハンドリング
- リモートカタログが破損していないか確認する例
- ローカルカタログの読み込みに失敗したか確認する例
- リモートカタログのダウンロードの通信に失敗したか確認する例
- リモートカタログを更新する時にメインスレッドが止まらないようにする方法
- リモートカタログのダウンロード時にディスクの空き容量が不足していないか確認する例
- ストレージの空き容量が不足している時にリモートカタログをダウンロードしても正常に動作するように
- LoadScene でアセットバンドルの読み込みに失敗した時に進行不能にならないようにする方法
- 通信環境が悪い状態でサーバからアセットバンドルのダウンロードに失敗した時に内部で例外が出ないようにする方法
- 通信環境が悪い状態でサーバからアセットバンドルのダウンロードに失敗した時に内部で例外が出ないようにする方法
- UpdateCatalogs で通信環境が悪いなどの理由でリモートカタログのダウンロードに失敗した場合内部で NullReferenceException が発生する
高速化
- カタログのサイズを減らす方法
- アセットバンドルの読み込み速度を改善する方法
- CRC を無効にするとアセットバンドルの読み込みが速くなる場合がある
- ローカルカタログを読み込む時にメインスレッドが止まらないようにする方法
- カタログの JSON を読み込む時にメインスレッドが止まらないようにする方法
- リモートカタログをキャッシュに保存する時にメインスレッドが止まらないようにする方法
- リモートカタログの更新が存在するか確認する時にメインスレッドが止まらないようにする方法
- Android において ローカルアセットバンドルの読み込みにも UnityWebRequest を使用すると読み込みが速くなる場合がある
Android
- Android の Play Asset Delivery に対応する公式サンプル
- Android で リモートカタログのキャッシュを削除するスクリプト
- リモートカタログやアセットバンドルは Android でどこに保存されるか
- Android において StreamingAssets から読み込んだアセットバンドルがキャッシュに保存されない現象に関するメモ
検証
- 依存関係が増えるほどビルド時間がどのくらい長くなるか
- アセットバンドルを圧縮するかどうかでビルド時間が変わるか
- アセットバンドルをまとめた時と別々にした時でビルド時間にどのくらい差が出るか
- フォルダにアドレスを振った場合とファイルごとにアドレスを振った場合で違いはあるか
テスト
- 重複しているアドレスが存在しないか確認するテストコード
- AddressableAssetGroup に登録されているエントリが重複していないか確認するテストコード
- AddressableAssetSettings に登録されているグループが重複していないか確認するテストコード