private async UniTask TaskLoadAndWaitReady(bool pFade) { foreach (AsyncOperation _Async in m_ListAsyncOperation) { while (!_Async.isDone) { await UniTask.Yield(); } } // all async operation is done for (int _Idx = 0; _Idx < SceneManager.sceneCount; _Idx++) { Scene _Scene = SceneManager.GetSceneAt(_Idx); AbstractSceneConductor _Conductor = GetSceneConductor(_Scene); while (!_Conductor.ImReady) { await UniTask.Yield(); } } // all scene conductor is ready if (pFade) { BridgeSceneConductor.Fader.FadeOut(); } }
private void ProcessScene(bool pFade) { Func <UniTask> _Action = async() => { AsyncOperation _Async = null; for (int _Idx = 0; _Idx < SceneManager.sceneCount; _Idx++) { Scene _Scene = SceneManager.GetSceneAt(_Idx); AbstractSceneConductor _Conductor = GetSceneConductor(_Scene); if (m_ListLoadScene.Contains(_Conductor.IdScene)) { // already load m_ListLoadScene.Remove(_Conductor.IdScene); } else { // unload _Async = SceneManager.UnloadSceneAsync(_Scene.name); m_ListAsyncOperation.Add(_Async); } } // load scene foreach (Constant.ENUM_SCENE _IdScene in m_ListLoadScene) { _Async = SceneManager.LoadSceneAsync(GetNameSceneById(_IdScene), LoadSceneMode.Additive); m_ListAsyncOperation.Add(_Async); } // m_ListLoadSceneには実際にLoadSceneAsyncを実行した要素のみ保持 await TaskLoadAndWaitReady(pFade); if (pFade) { BridgeSceneConductor.Fader.FadeOut(); } }; if (pFade) { BridgeSceneConductor.Fader.RxCompletedFadeIn .First() .Subscribe(_ => _Action()) ; BridgeSceneConductor.Fader.FadeIn(); } else { _Action(); } }
private AbstractSceneConductor GetSceneConductor(Scene pScene) { AbstractSceneConductor _Conductor = null; foreach (GameObject _Obj in pScene.GetRootGameObjects()) { _Conductor = _Obj.GetComponent <AbstractSceneConductor>(); if (_Conductor != null) { break; } } return(_Conductor); }