コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Addressables で通信環境が悪い状態でサーバからアセットバンドルのダウンロードに失敗した時に内部で例外が出ないようにする方法

検証環境

  • Addressables 1.16.19

概要

Exception: Attempting to use an invalid operation handle
UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle.get_InternalOp () (at Runtime/ResourceManager/AsyncOperations/AsyncOperationHandle.cs:377)
UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle.get_Result () (at Runtime/ResourceManager/AsyncOperations/AsyncOperationHandle.cs:453)
UnityEngine.ResourceManagement.ResourceProviders.SceneProvider+SceneOp.Execute () (at Runtime/ResourceManager/ResourceProviders/SceneProvider.cs:64)
UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1[TObject].InvokeExecute () (at Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:477)
UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1[TObject].<.ctor>b__33_0 (UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle o) (at Runtime/ResourceManager/AsyncOperations/AsyncOperationBase.cs:114)
DelegateList`1[T].Invoke (T res) (at Runtime/ResourceManager/Util/DelegateList.cs:69)
UnityEngine.Debug:LogException(Exception)
DelegateList`1:Invoke(AsyncOperationHandle) (at Runtime/ResourceManager/Util/DelegateList.cs:73)
UnityEngine.ResourceManagement.ResourceManager:Update(Single)
MonoBehaviourCallbackHooks:Update() (at Runtime/ResourceManager/Util/MonoBehaviourCallbackHooks.cs:15)
  • Addressables でアセットバンドルをサーバからダウンロードする時に
    通信環境が悪いなどの理由でダウンロードに失敗すると
    上記の例外が発生することがあった
  • 例外が発生すると、それ以降アセットバンドルのダウンロードなどができなくなり、
    一度アプリを再起動しないと Addressables が正常に動作しなくなる状態だった
  • AsyncOperationHandle.Result でハンドルが有効かどうかの判定を追加すると
    ダウンロードに失敗しても例外が発生することはなくなる

AsyncOperationHandle.cs

461 行目以降

public object Result
{
    get { return IsValid() ? InternalOp.GetResultAsObject(): default; }
}