Beispiel #1
0
        public async UniTask <Base> BackToSceneAsync(SceneData sceneData)
        {
            while (_sceneData.Count > 0)
            {
                var elm = _sceneData.Pop();
                if (elm == sceneData)
                {
                    break;
                }
            }

            // 空の場合見つからなかったのでデフォルトに戻す
            return(await SceneChangeInternalAsync(_currentScene, sceneData, LoadSceneMode.Single, isStopCurrentScene : true, backScene : _currentScene));
        }
Beispiel #2
0
        private async UniTask <Base> SceneChangeInternalAsync(Base parent, SceneID sceneID, Argument argument, LoadSceneMode mode, bool isStopCurrentScene, System.Action <DiContainer> bindAction = null)
        {
            // デフォルト生成
            if (argument == null)
            {
                argument = Argument.Create();
            }

            // 1シーン、1SceneData
            var sceneData = new SceneData()
            {
                SceneID = sceneID, Argument = argument, BindAction = bindAction
            };

            return(await SceneChangeInternalAsync(parent, sceneData, mode, isStopCurrentScene, backScene : null));
        }
Beispiel #3
0
        /// <summary>
        /// シーン読み込み処理
        /// 非同期で読み込み、完了後切り替える
        /// </summary>
        private IObservable <Base> LoadSceneAsync(Base parent, SceneData sceneData, LoadSceneMode mode = LoadSceneMode.Single, System.Action onLoaded = null)
        {
            var sceneName = sceneData.SceneID.GetName();

            return(Observable.FromCoroutine <Unit>(observer_ =>
                                                   LoadSceneOperationAsync(_zenjectSceneLoader.LoadSceneAsync(sceneName, mode, sceneData.BindAction), observer_))
                   .Select(scene_ =>
            {
                // LoadSceneOperationAsync内のOnNextが呼び出されたときに来る
                var activeSceneInstance = loadedScene;
                var scene = default(Base);

                // 読み込んだシーンからシーンクラスのインスタンスを取得する
                foreach (var rootObject in activeSceneInstance.GetRootGameObjects())
                {
                    scene = rootObject.GetComponent <Base>();
                    if (scene != null)
                    {
                        break;
                    }
                }

                if (scene == null)
                {
                    Utility.Log.Error($"Scene.Base クラスが見つかりません {typeof(Base).ToString()}");

                    return null;
                }

                // シーンにUnityシーン情報をもたせる
                scene.Scene = activeSceneInstance;

                /////	scene.transform.SetParent(_sceneRoot);
                scene.SceneData = sceneData;
                scene.Argument = sceneData.Argument;

                // 準備が整うまで非アクティブ
                scene.gameObject.SetActive(false);

                // 必要なデータが読み込まれていない場合、読み込みを行う
                //Observable.FromCoroutine<Base>(observer_ => LoadScenePrepareAsync(observer_));

                // Sceneに変換
                return scene;
            })
                   .ContinueWith(scene_ => InitLoadPrepareAsync(scene_))
                   .SelectMany(scene_ =>
            {
                // 別の処理に合成
                return scene_.ScenePrepareAsync().Select(scene_ =>
                {
                    switch (mode)
                    {
                    case LoadSceneMode.Additive:
                        // 親に関連付ける
                        parent.AddChild(scene_);
                        break;

                    // AddSceneの場合は現在のシーンインスタンスとはしない 
                    default:
                        _currentScene = scene_;
                        break;
                    }

                    return scene_;
                });
            }));
        }
Beispiel #4
0
        private async UniTask <Base> SceneChangeInternalAsync(Base parent, SceneData sceneData, LoadSceneMode mode, bool isStopCurrentScene, Base backScene)
        {
            var prevScene = _currentScene;

            // 現在のシーンを止める
            // 止めるかどうかは引数で判断する
            if (isStopCurrentScene)
            {
                if (prevScene != null)
                {
                    await StopSceneAsyncInternal(prevScene, needsChildren : true);
                }
            }

            if (mode == LoadSceneMode.Single)
            {
                // 遷移前処理

                // todo: 差分のみUnloadするようにしたい
                for (int i = 1; i < SceneManager.sceneCount; ++i)
                {
                    var scene = SceneManager.GetSceneAt(i);

                    await SceneManager.UnloadSceneAsync(scene);
                }

                // StackClear
                if (sceneData.Argument.IsStackClear)
                {
                    _sceneData.Clear();
                }

                _sceneData.Push(sceneData);
            }

            // シーン読み込み
            var loadedScene = await SceneLoadProcessAsync(parent, sceneData, mode);

            // あるシーンから戻った場合、メソッドを呼び出す
            if (backScene != null)
            {
                loadedScene.CamebackScene(backScene);
            }

            // すべてのシーンを読み込み終わったらStartSceneを呼び出す
            loadedScene.IsStartScene = true;
            loadedScene.StartScene();

            // 前回のシーンを削除する
            if (mode == LoadSceneMode.Single)
            {
                if (prevScene != null)
                {
                    await DestroySceneAsyncInternal(prevScene);

                    prevScene.Parent?.RemoveChild(prevScene);
                }
            }

            return(loadedScene);
        }
Beispiel #5
0
 public void SetParent(SceneData parent) =>
 Parent = parent;
Beispiel #6
0
 public void RemoveChild(SceneData addSceneData)
 {
     addSceneData.Parent = null;
     ActiveChildren.Remove(addSceneData);
 }