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))); }
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); }