技術と趣味の亜空間

主にゲームプログラミングとその周辺に関する記事を不定期で上げていきます

【Addressables】warning: yield SceneInstance is not supported on await IEnumerator or IEnumerator.ToUniTask(), please use ToUniTask(MonoBehaviour coroutineRunner) instead.

概要

Addressablesを導入し、シーン読み込みをUnitySceneManager.UnloadSceneAsyncからAddressables.UnloadSceneAsyncに差し替えた時に発生。
これによりシーン内の一部スクリプトが実行時にMissingになるなどの問題が発生した。

docs.unity3d.com

実行環境:
Unity 2021.3.3f1
Addressables 1.21.1

解決

Addressables.UnloadSceneAsync を直接 await していたのが原因でした。
UnitySceneManager.UnloadSceneAsyncは直接 await してもOKだったので、脳死で差し替えてました…

より詳しい状況

元々UnitySceneManager.UnloadSceneAsyncのメソッドは、以下のような自作のUniTask.WhenAll 拡張メソッドで呼び出していた。

// アンロード
await deleteScenes.Select(UnloadSceneFileAsync).WhenAll();

...

private static async UniTask UnloadSceneFileAsync(Scene scene)
    => await UnitySceneManager.UnloadSceneAsync(scene);

UniTask拡張メソッドの詳細はこちら。

上記のコードを以下に差し替えたらタイトルの警告が発生。

private static async UniTask UnloadSceneFileAsync(SceneInstance scene)
    => await Addressables.UnloadSceneAsync(scene);
warning: yield SceneInstance is not supported on await IEnumerator or IEnumerator.ToUniTask(), please use ToUniTask(MonoBehaviour coroutineRunner) instead.warning: yield SceneInstance is not supported on await IEnumerator or IEnumerator.ToUniTask(), please use ToUniTask(MonoBehaviour coroutineRunner) instead.

直接 await をやめて IsDone で await することで解決しました。

private static async UniTask UnloadSceneFileAsync(SceneInstance scene)
{
    var handler = Addressables.UnloadSceneAsync(scene);
    await UniTask.WaitUntil(() => handler.IsDone);
}