【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になるなどの問題が発生した。
実行環境:
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); }