コード例 #1
0
    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();
        }
    }
コード例 #2
0
    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();
        }
    }
コード例 #3
0
    private AbstractSceneConductor GetSceneConductor(Scene pScene)
    {
        AbstractSceneConductor _Conductor = null;

        foreach (GameObject _Obj in pScene.GetRootGameObjects())
        {
            _Conductor = _Obj.GetComponent <AbstractSceneConductor>();
            if (_Conductor != null)
            {
                break;
            }
        }
        return(_Conductor);
    }