コガネブログ

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

【Unity】Addressables の LoadScene でアセットバンドルの読み込みに失敗した時に進行不能にならないようにする方法

検証環境

  • Addressables 1.16.19

概要

  • Addressables の LoadScene でシーン遷移する時に
    通信環境が悪いなどの理由でアセットバンドルの読み込みに失敗した場合、
    SceneProvider で AsyncOperationBase.Complete が呼ばれなくなり
    それ以降 Addressables の API が正常に動作しなくなる現象に遭遇した
  • SceneProvider.cs で例外が発生した時に
    AsyncOperationBase.Complete を呼び出すようにすれば
    アセットバンドルの読み込みに失敗した後も
    Addressables の API が正常に動作するようになる

SceneProvider.cs

19 行目

bool m_isFailure;
  • 処理に失敗したかどうかを確認するための変数を追加

69 行目以降

try
{
    m_Inst = InternalLoadScene(m_Location, loadingFromBundle, m_LoadMode, m_ActivateOnLoad, m_Priority);
}
catch ( Exception )
{
    m_isFailure = true;
}
  • InternalLoadScene 内で例外が発生したらフラグを立てる

119 行目以降

protected override float Progress
{
    get
    {
        if ( m_isFailure ) return 0;
  • 処理に失敗した場合は進捗を返す Progress プロパティで 0 を返す

142 行目以降

void IUpdateReceiver.Update(float unscaledDeltaTime)
{
    if ( m_isFailure )
    {
        Complete(default, false, null);
    }
    else if (m_Inst.m_Operation.isDone || (!m_ActivateOnLoad && m_Inst.m_Operation.progress == .9f))
  • 処理に失敗した場合は Complete 関数を呼び出して第2引数に false を渡す