Esempio n. 1
0
        public Task OnNavigatedAsync(INavigatableScene nextScene, INavigatableScene prevScene, TransitionMode mode)
        {
            if (this._animator == null)
            {
                this._animator = Resources.Load <RuntimeAnimatorController>("Animator/NavigationAnimator");
            }

            var nextSceneAnimator = nextScene.RootObject.GetComponent <Animator>();

            if (nextSceneAnimator == null)
            {
                nextSceneAnimator = nextScene.RootObject.AddComponent <Animator>();
            }
            nextSceneAnimator.runtimeAnimatorController = this._animator;

            var prevSceneAnimator = prevScene.RootObject.GetComponent <Animator>();

            if (prevSceneAnimator == null)
            {
                prevSceneAnimator = prevScene.RootObject.AddComponent <Animator>();
            }
            prevSceneAnimator.runtimeAnimatorController = this._animator;

            if (mode.HasFlag(TransitionMode.KeepCurrent))
            {
                if (mode.HasFlag(TransitionMode.New))
                {
                    nextSceneAnimator.Play("TransitionOpen");
                }
                else if (mode.HasFlag(TransitionMode.Back))
                {
                    prevSceneAnimator.Play("TransitionClose");
                }
            }

            return(Task.Delay(TimeSpan.FromSeconds(0.3)));
        }
Esempio n. 2
0
        private NavigationResult Activate(ISceneArgs args, NavigationOption option = NavigationOption.None)
        {
            var result = new NavigationResult();

            if (this._currentScene != null)
            {
                var currentUnityScene = SceneManager.GetSceneByName(this._currentScene.SceneArgs.SceneName);
                if (!currentUnityScene.isLoaded)
                {
                    throw new NavigationFailureException("無効なシーンが設定されています", args);
                }

                result.PreviousScene = this._currentScene;
            }

            // シーンマネージャの方から次のSceneを取得
            var nextUnityScene = SceneManager.GetSceneByName(args.SceneName);

            if (!nextUnityScene.isLoaded)
            {
                throw new NavigationFailureException("シーンの読み込みに失敗しました", args);
            }
            if (nextUnityScene.rootCount != 1)
            {
                throw new NavigationFailureException("シーンのRootObjectが複数あります", args);
            }

            // SceneからINavigatableSceneを取得
            var rootObjects = nextUnityScene.GetRootGameObjects();

            if (rootObjects.Length == 0)
            {
                throw new NavigationFailureException("RootObjectが存在しません", args);
            }
            if (rootObjects.Length > 1)
            {
                throw new NavigationFailureException("RootObjectが複数あります", args);
            }

            var containsCanvases = rootObjects[0].GetComponentsInChildren <Canvas>();

            if (containsCanvases.Length == 0)
            {
                throw new NavigationFailureException("Canvasが見つかりませんでした", args);
            }

            var sceneBases = rootObjects[0].GetComponents <SceneBase>();

            if (sceneBases.Length == 0)
            {
                throw new NavigationFailureException("SceneBaseコンポーネントがRootObjectに存在しません", args);
            }
            if (sceneBases.Length > 1)
            {
                throw new NavigationFailureException("SceneBaseコンポーネントが複数あります", args);
            }

            // 進む場合、新しいシーンは非表示にしておく
            if (!option.HasFlag(NavigationOption.Pop))
            {
                rootObjects[0].SetActive(false);
            }

            // 次のシーンに諸々引数を渡す
            var nextScene = sceneBases[0] as INavigatableScene;

            nextScene.SceneArgs = args;
            nextScene.SetNavigator(this);
            if (this._currentScene != null)
            {
                nextScene.SetParentSceneArgs(this._currentScene.SceneArgs);
            }

            // 進む場合、ソートを整える
            if (!option.HasFlag(NavigationOption.Pop))
            {
                if (this._currentScene != null)
                {
                    this._canvasOrderArranger.ArrangeOrder(this._currentScene.RootCanvases, option);
                }
                else
                {
                    for (var i = 0; i < nextScene.RootCanvases.Count; ++i)
                    {
                        nextScene.RootCanvases[i].sortingOrder = this._canvasOrderArranger.InitialOrder;
                    }
                }
            }

            // 次のシーンにnextSceneを設定
            this._currentScene = result.NextScene = nextScene;

            // TransitionModeの調整
            if (option.HasFlag(NavigationOption.Override))
            {
                result.TransitionMode |= TransitionMode.KeepCurrent;
            }
            if (option.HasFlag(NavigationOption.Pop))
            {
                result.TransitionMode |= TransitionMode.Back;
            }

            return(result);
        }