コガネブログ

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

【Unity】Addressable Asset System の InitializeAsync を複数回呼び出したい場合

概要

  • Addressables.InitializeAsync でリモートカタログがダウンロードされるが
    ダウンロードに失敗した場合も内部では初期化済みフラグが立ってしまう
    • AddressablesImpl.hasStartedInitialization がそのフラグ
  • フラグが立ってしまうと、再度 Addressables.InitializeAsync を呼び出しても
    初期化済みとみなされ何もせず AsyncOperationStatus.Succeeded が返ってきてしまう
    • リモートカタログがダウンロードできない
  • 下記のようなコードを記述することで、外部から初期化済みフラグを折ることができる
// Addressables.InitializeAsync に失敗した場合も、
// 内部では初期化済みフラグが立ってしまうため、
// リフレクションを使用して内部の初期化フラグを落とします
var addressablesType              = typeof( Addressables );
var assembly                      = addressablesType.Assembly;
var addressablesImplType          = assembly.GetType( "UnityEngine.AddressableAssets.AddressablesImpl" );
var addressablesImplField         = addressablesType.GetField( "m_Addressables", BindingFlags.Static | BindingFlags.NonPublic );
var addressablesImpl              = addressablesImplField.GetValue( null );
var hasStartedInitializationField = addressablesImplType.GetField( "hasStartedInitialization", BindingFlags.Instance | BindingFlags.NonPublic );

hasStartedInitializationField.SetValue( addressablesImpl, false );

// Addressables.InitializeAsync に失敗した場合も、
// ローカルカタログから情報が読み込まれてしまうため、
// 読み込まれているローカルカタログの情報を破棄します
Addressables.ClearResourceLocators();
  • InitializeAsync に失敗した場合も、内部で下記の変数が初期化されてしまうが
    これらはそのままでも問題なさそう
    • AddressablesImpl.m_InstanceProvider
    • AddressablesImpl.SceneProvider
    • AddressablesImpl.m_InitializationOperation