ランタイムでのカタログの管理
Addressables システムでは、デフォルトでランタイム時に自動的にカタログが管理されます。リモートカタログを使用してアプリケーションをビルドした場合、Addressables システムは、新しいカタログがアップロードされているかどうかを自動的に確認し、アップロードされていれば、新しいバージョンをダウンロードしてメモリにロードします。
追加のカタログをランタイム時にロードすることができます。例えば、互換性のある別のプロジェクトで作成されたカタログをロードして、そのプロジェクトでビルドされた Addressable (アドレス指定可能) アセットをロードできます ([複数のプロジェクトからのコンテンツのロード] を参照してください)。
Addressables システムのデフォルトのカタログ更新動作を変更する場合は、自動確認をオフにし、手動で更新を確認することができます。[カタログの更新] を参照してください。
追加のカタログのロード
追加のコンテンツカタログをホスティングサービスまたはローカルファイルシステムからロードするには、Addressables.LoadContentCatalogAsync を使用します。これは、ロードするカタログの場所を指定するだけで実行できます。カタログをロードする操作が終了したら、新しいカタログにあるキーを使用して、任意の Addressables ロード関数を呼び出すことができます。
カタログと同じ URL にカタログハッシュファイルを用意すると、Addressables でセカンダリカタログがキャッシュされます。後でクライアントアプリケーションがカタログをロードするとき、ハッシュが変更されている場合は、新しいバージョンのカタログのみがダウンロードされます。
Note
- ハッシュファイルは、カタログと同じ場所に同じ名前で存在している必要があります。パスの拡張子だけが異なるようにします。
- LoadContentCatalogAsync には autoReleaseHandle パラメーターがあります。システムで新しいリモートカタログをダウンロードするには、ロードしようとしているカタログを指す、以前の LoadContentCatalogAsync 呼び出しがすべて解放されている必要があります。そうでない場合は、操作キャッシュにあるコンテンツカタログロード操作が選択されます。キャッシュされた操作が選択された場合、新しいリモートカタログはダウンロードされません。autoReleaseHandle パラメーターを true に設定すると、操作が完了後に操作キャッシュに残らないようにすることができます。
いったんロードしたカタログはアンロードできません。ただし、ロードされたカタログを更新することはできます。カタログを更新する前に、カタログをロードした操作の操作ハンドルを解放する必要があります。詳細については、[カタログの更新] を参照してください。
一般的に、カタログをロードした後に操作ハンドルを保持する意味はありません。以下の例に示すように、カタログのロード時に autoReleaseHandle
パラメーターを true に設定すると、操作ハンドルを自動的に解放することができます。
public IEnumerator Start()
{
//Load a catalog and automatically release the operation handle.
AsyncOperationHandle<IResourceLocator> handle
= Addressables.LoadContentCatalogAsync("path_to_secondary_catalog", true);
yield return handle;
//...
}
Note
Addressables 設定の Catalog Download Timeout プロパティを使用すると、カタログのダウンロードのタイムアウトを指定できます。
カタログの更新
カタログハッシュファイルが使用可能な場合、Addressables はカタログのロード時にハッシュを確認して、指定された URL にあるカタログのバージョンが、キャッシュされたバージョンよりも新しいかどうかを判定します。必要に応じて、デフォルトのカタログ確認をオフにし、カタログを更新するときに Addressables.UpdateCatalogs 関数を呼び出すことができます。LoadContentCatalogAsync を使用してカタログを手動でロードした場合は、カタログを更新する前に操作ハンドルを解放する必要があります。
UpdateCatalog 関数を呼び出すと、操作が終了するまで、他のすべての Addressable リクエストがブロックされます。UpdateCatalogs から返された操作ハンドルは、操作が終了したらすぐに解放できます (または、autoRelease
パラメーターを true に設定できます)。
カタログのリストを指定せずに UpdateCatalog を呼び出した場合は、現在ロードされているすべてのカタログで更新が必要かどうかが確認されます。
IEnumerator UpdateCatalogs()
{
AsyncOperationHandle<List<IResourceLocator>> updateHandle
= Addressables.UpdateCatalogs();
yield return updateHandle;
Addressables.Release(updateHandle);
}
また、Addressables.CheckForCatalogUpdates を直接呼び出して、更新を含むカタログのリストを取得してから、更新を実行することもできます。
IEnumerator CheckCatalogs()
{
List<string> catalogsToUpdate = new List<string>();
AsyncOperationHandle<List<string>> checkForUpdateHandle
= Addressables.CheckForCatalogUpdates();
checkForUpdateHandle.Completed += op => { catalogsToUpdate.AddRange(op.Result); };
yield return checkForUpdateHandle;
if (catalogsToUpdate.Count > 0)
{
AsyncOperationHandle<List<IResourceLocator>> updateHandle
= Addressables.UpdateCatalogs(catalogsToUpdate);
yield return updateHandle;
Addressables.Release(updateHandle);
}
Addressables.Release(checkForUpdateHandle);
}
Important
カタログを更新するとき、関連する AssetBundle から既にコンテンツがロードされている場合は、ロードされた AssetBundle と更新されたバージョンとの間で競合が発生することがあります。Addressable 設定で Unique Bundle Ids オプションを有効にすると、ランタイム時にバンドル ID の競合が発生する可能性を排除できます。ただし、このオプションを有効にすると、通常、コンテンツ更新の実行時に再ビルドする必要のある AssetBundle の数が増加します。詳細については、[コンテンツ更新ビルド] を参照してください。もう 1 つの対処方法は、更新が必要なすべてのコンテンツと AssetBundle を最初にアンロードすることですが、この操作には時間がかかる可能性があります。