AssetBundle のロード
Addressables システムではアセットが AssetBundle にパックされ、個々のアセットをロードするときに、その AssetBundle が "舞台裏" でロードされます。AssetBundle がどのようにロードされるかは、BundledAssetGroupSchema クラスで開放されるオプションを通じて制御できます。これらのオプションは、スクリプティング API を通じて設定するか、AddressablesAssetGroup インスペクターの Advanced Options (詳細オプション) で設定できます。
UnityWebRequestForLocalBundles
Addressables には、AssetBundle をロードするために使用できるエンジン API として、UnityWebRequest.GetAssetBundle と AssetBundle.LoadFromFileAsync の 2 つがあります。デフォルトの動作では、AssetBundle がローカルストレージにある場合は AssetBundle.LoadFromFileAsync が使用され、AssetBundle パスが URL の場合は UnityWebRequest が使用されます。
BundledAssetGroupSchema.UseUnityWebRequestForLocalBundles を true に設定すると、この動作をオーバーライドして、ローカル AssetBundle に UnityWebRequest を使用できます。これは、BundledAssetGroupSchema GUI を使用して設定することもできます。
この設定は、以下のような状況で役立ちます。
- 出荷するゲームパッケージのサイズを可能な限り小さくするために、LZMA 圧縮を使用する ローカル AssetBundle を出荷している場合。この場合は、UnityWebRequest を使用して、これらの AssetBundle を LZ4 に再圧縮してローカルディスクキャッシュ内に配置できます。
- Android 版ゲームを出荷していて、その APK に、デフォルトの APK 圧縮で圧縮された AssetBundle が含まれている場合。
- ディスクシークを回避するために、ローカル AssetBundle 全体がメモリにロードされるようにする場合。キャッシュを無効にして
UnityWebRequestを使用すると、AssetBundle ファイル全体がメモリキャッシュにロードされます。これにより、ランタイムのメモリ使用量は増加しますが、AssetBundle の初回のロード後はディスクシークが発生しないため、ロードのパフォーマンスが向上する可能性があります。 上記の 1 と 2 の状況では、プレイヤーのデバイスに AssetBundle が 2 つ (元のバンドルとキャッシュされたバンドル) 存在する結果となります。つまり、初回のロード (解凍とキャッシュへのコピー) には、以降のロード (キャッシュからのロード) より時間がかかります。
ダウンロードエラーの処理
ダウンロードが失敗すると、RemoteProviderException にエラーが示されます。これを使用して、失敗の処理方法を決定することができます。
RemoteProviderException は、AsyncOperationHandle.OperationException か内部例外のどちらかです。以下に例を示します。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.Exceptions;
internal class HandleDownloadError : MonoBehaviour
{
private AsyncOperationHandle m_Handle;
void LoadAsset()
{
m_Handle = Addressables.LoadAssetAsync<GameObject>("addressKey");
m_Handle.Completed += handle =>
{
string dlError = GetDownloadError(m_Handle);
if (!string.IsNullOrEmpty(dlError))
{
// handle what error
}
};
}
string GetDownloadError(AsyncOperationHandle fromHandle)
{
if (fromHandle.Status != AsyncOperationStatus.Failed)
return null;
RemoteProviderException remoteException;
System.Exception e = fromHandle.OperationException;
while (e != null)
{
remoteException = e as RemoteProviderException;
if (remoteException != null)
return remoteException.WebRequestResult.Error;
e = e.InnerException;
}
return null;
}
}
返される可能性のあるエラー文字列は以下のとおりです。
- "Request aborted" (リクエストが中止されました)
- "Unable to write data" (データを書き込むことができません)
- "Malformed URL" (URL の形式が不正です)
- "Out of memory" (メモリが不足しています)
- "No Internet Connection" (インターネットに接続していません)
- "Encountered invalid redirect (missing Location header?)" (無効なリダイレクトが発生しました (Location ヘッダーがない可能性))
- "Cannot modify request at this time" (現在、リクエストを変更できません)
- "Unsupported Protocol" (サポートされていないプロトコルです)
- "Destination host has an erroneous SSL certificate" (宛先ホストの SSL 証明書が正しくありません)
- "Unable to load SSL Cipher for verification" (SSL 暗号をロードして検証することができません)
- "SSL CA certificate error" (SSL CA 証明書エラーです)
- "Unrecognized content-encoding" (認識できないコンテンツエンコーディングです)
- "Request already transmitted" (リクエストは既に送信されています)
- "Invalid HTTP Method" (無効な HTTP メソッドです)
- "Header name contains invalid characters" (ヘッダー名に無効な文字が含まれています)
- "Header value contains invalid characters" (ヘッダー値に無効な文字が含まれています)
- "Cannot override system-specified headers" (システムで指定されたヘッダーをオーバーライドできません)
- "Backend Initialization Error" (バックエンドの初期化エラーです)
- "Cannot resolve proxy" (プロキシを解決できません)
- "Cannot resolve destination host" (宛先ホストを解決できません)
- "Cannot connect to destination host" (宛先ホストに接続できません)
- "Access denied" (アクセスが拒否されました)
- "Generic/unknown HTTP error" (一般的/不明な HTTP エラーです)
- "Unable to read data" (データを読み取ることができません)
- "Request Timeout" (リクエストがタイムアウトしました)
- "Error during HTTP POST transmission" (HTTP POST の送信中にエラーが発生しました)
- "Unable to complete SSL connection" (SSL 接続を完了できません)
- "Redirect limit exceeded" (リダイレクト制限を超えました)
- "Received no data in response" (受信した応答にデータがありません)
- "Destination host does not support SSL" (宛先ホストが SSL をサポートしていません)
- "Failed to transmit data" (データを送信できませんでした)
- "Failed to receive data" (データを受信できませんでした)
- "Login failed" (ログインできませんでした)
- "SSL shutdown failed" (SSL シャットダウンに失敗しました)
- "Redirect limit is invalid" (リダイレクト制限が無効です)
- "Not implemented" (実装されていません)
- "Data Processing Error, see Download Handler error" (データ処理エラーです。ダウンロードハンドラーのエラーを参照してください)
- "Unknown Error" (不明なエラーです)