【Unity】【Addressables】ダウンロード時のエラーをハンドリングする

Unity の Addressable アセットシステムでダウンロード時のエラーをハンドリングする方法についてまとめました。

はじめに

比較的最近のマニュアルで、Addressables でダウンロードエラーをハンドリングする方法がまとめられていたので紹介します。

docs.unity3d.com

Addressable の基礎知識についてはこの記事では触れませんが、以下の記事などにまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

ダウンロードエラーをハンドリングするスクリプト

Addressable におけるダウンロード時のエラーは以下のようなスクリプトによりハンドリングします。

using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.Exceptions;

internal class HandleDownloadError : MonoBehaviour
{
    public async Task LoadAsset()
    {
        var handle = Addressables.LoadAssetAsync<GameObject>("foo");
        await handle.Task;

        var downloadError = GetDownloadError(handle);
        if (!string.IsNullOrEmpty(downloadError))
        {
            // 必要に応じてハンドリング
        }
    }

    /// <summary>
    /// ダウンロードエラーがの内容を返却する
    /// </summary>
    /// <param name="handle"></param>
    /// <returns>
    /// ダウンロードエラー内容を表す文字列(https://docs.unity.cn/Packages/com.unity.addressables@1.20/manual/LoadingAssetBundles.html)を返す。
    /// エラーが存在しない場合はnullを返却する。
    /// </returns>
    private static string GetDownloadError(AsyncOperationHandle handle)
    {
        if (handle.Status != AsyncOperationStatus.Failed)
            return null;

        // AsyncOperationHandle.OperationException か InnerException に
        // RemoteProviderException 型があった場合はダウンロードエラー
        var exception = handle.OperationException;
        while (exception != null)
        {
            if (exception is RemoteProviderException remoteException)
                return remoteException.WebRequestResult.Error;

            exception = exception.InnerException;
        }

        return null;
    }
}

コメントにも記載していますが、 AsyncOperationHandle.OperationException か、その InnerException たちのいずれかが RemoteProviderException 型だった場合にダウンロードエラーと見なすことができます。

エラーの内容は RemoteProviderException.WebRequestResult.Error から文字列として取得できます。

エラー文字列一覧

RemoteProviderException.WebRequestResult.Errorから得られる文字列の一覧は以下の通りです。

  • "Request aborted"
  • "Unable to write data"
  • "Malformed URL"
  • "Out of memory"
  • "No Internet Connection"
  • "Encountered invalid redirect (missing Location header?)"
  • "Cannot modify request at this time"
  • "Unsupported Protocol"
  • "Destination host has an erroneous SSL certificate"
  • "Unable to load SSL Cipher for verification"
  • "SSL CA certificate error"
  • "Unrecognized content-encoding"
  • "Request already transmitted"
  • "Invalid HTTP Method"
  • "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"
  • "Unable to read data"
  • "Request timeout"
  • "Error during HTTP POST transmission"
  • "Unable to complete SSL connection"
  • "Redirect limit exceeded"
  • "Received no data in response"
  • "Destination host does not support SSL"
  • "Failed to transmit data"
  • "Failed to receive data"
  • "Login failed"
  • "SSL shutdown failed"
  • "Redirect limit is invalid"
  • "Not implemented"
  • "Data Processing Error, see Download Handler error"
  • "Unknown Error"

マニュアルより引用)

参考

docs.unity3d.com