依存関係の事前ロード
コンテンツをリモート配布するときは、アプリケーションで必要となる前に依存関係をダウンロードすることで、感覚的なパフォーマンスの向上が可能な場合があります。例えば、プレイヤーが初めてゲームを開始したときに、必要なコンテンツを起動時にダウンロードして、ゲームのプレイ中にコンテンツを待つ必要がないようにすることができます。
依存関係のダウンロード
ある Addressable キーのロードに必要なすべての依存関係を、アプリケーションとともにインストールされたローカルコンテンツまたはダウンロードキャッシュから使用できるようにするには、Addressables.DownloadDependenciesAsync メソッドを使用します。
string key = "assetKey";
// Check the download size
AsyncOperationHandle<long> getDownloadSize = Addressables.GetDownloadSizeAsync(key);
yield return getDownloadSize;
//If the download size is greater than 0, download all the dependencies.
if (getDownloadSize.Result > 0)
{
AsyncOperationHandle downloadDependencies = Addressables.DownloadDependenciesAsync(key);
yield return downloadDependencies;
}
Tip
一連のアセットを事前にダウンロードする場合は、それらのアセットに "preload" などの同一のラベルを割り当て、Addressables.DownloadDependenciesAsync を呼び出すときにそれをキーとして使用できます。Addressables は、ラベルの付いたアセットを含むすべての AssetBundle を、まだ使用可能でなければ (アセットの依存関係を含むバンドルとともに) ダウンロードします。
進捗状況
AsyncOperationHandle インスタンスには、進捗状況を調べる方法が 2 通り用意されています。
- AsyncOperationHandle.PercentComplete: 終了したサブ操作の割合 (%) を報告します。例えば、ある操作のタスクを実行するために 6 つのサブ操作が使用される場合、
PercentComplete
は、これらのサブ操作の 3 つが終了したときに操作全体の 50% が完了したことを示します (各操作でロードされるデータの量は関係ありません)。 - AsyncOperationHandle.GetDownloadStatus: 合計ダウンロードサイズに対する割合 (%) を報告する DownloadStatus 構造体を返します。例えば、ある操作に 6 つのサブ操作があり、最初のサブ操作が合計ダウンロードサイズの 50% を占める場合、
GetDownloadStatus
は、最初のサブ操作が終了したときに操作の 50% が完了したことを示します。
以下の例は、GetDownloadStatus を使用して、ダウンロード中にステータスを確認し、進捗状況イベントを送信する方法を示しています。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.ResourceManagement.AsyncOperations;
internal class PreloadWithProgress : MonoBehaviour
{
public string preloadLabel = "preload";
public UnityEvent<float> ProgressEvent;
public UnityEvent<bool> CompletionEvent;
private AsyncOperationHandle downloadHandle;
IEnumerator Start()
{
downloadHandle = Addressables.DownloadDependenciesAsync(preloadLabel, false);
float progress = 0;
while (downloadHandle.Status == AsyncOperationStatus.None)
{
float percentageComplete = downloadHandle.GetDownloadStatus().Percent;
if (percentageComplete > progress * 1.1) // Report at most every 10% or so
{
progress = percentageComplete; // More accurate %
ProgressEvent.Invoke(progress);
}
yield return null;
}
CompletionEvent.Invoke(downloadHandle.Status == AsyncOperationStatus.Succeeded);
Addressables.Release(downloadHandle); //Release the operation handle
}
}
1 つ以上のアセットをロードするためにダウンロードする必要のあるデータの量を調べるには、Addressables.GetDownloadSizeAsync を呼び出すことができます。
AsyncOperationHandle<long> getDownloadSize =
Addressables.GetDownloadSizeAsync(key);
この操作が完了すると、その Result はダウンロードする必要のあるバイト数を表します。必要な AssetBundle がすべて Addressables でキャッシュされている場合、Result はゼロになります。
Result オブジェクトを読み取った後は、ダウンロード操作ハンドルを必ず解放してください。ダウンロード操作の結果にアクセスする必要がない場合は、以下の例に示すように、autoReleaseHandle
パラメーターを true に設定することで自動的にハンドルを解放できます。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
internal class Preload : MonoBehaviour
{
public IEnumerator Start()
{
yield return Addressables.DownloadDependenciesAsync("preload", true);
}
}
依存関係キャッシュの消去
Addressables によってキャッシュされた AssetBundle をすべて消去する場合は、Addressables.ClearDependencyCacheAsync を呼び出します。この関数は、キーで識別されるアセットを含むキャッシュされた AssetBundle と、それらのアセットの依存関係を含むすべてのバンドルを消去します。
ClearDependencyCacheAsync では、指定したキーに関連するアセットバンドルのみが消去されます。コンテンツカタログを更新したことにより、キーが存在しなくなったり、同じ AssetBundle に依存しなくなったりすると、参照されなくなったこれらのバンドルは、([キャッシュ設定] に基づいて) 有効期限が切れるまでキャッシュに残ります。
すべての AssetBundle を消去するには、UnityEngine.Caching クラスの関数を使用します。