/// <summary>
 /// シーン遷移を実行する
 /// </summary>
 /// <param name="nextScene">次のシーン</param>
 /// <param name="data">次のシーンへ引き継ぐデータ</param>
 /// <param name="additiveLoadScenes">追加ロードするシーン</param>
 /// <param name="autoMove">トランジションの自動遷移を行うか</param>
 public void StartTransaction(GameScenes nextScene,
                              SceneDataPack data,
                              GameScenes[] additiveLoadScenes,
                              bool autoMove
                              )
 {
     StartCoroutine(TransitionCoroutine(nextScene, data, additiveLoadScenes, autoMove));
 }
        private IEnumerator TransitionCoroutine(
            GameScenes nextScene,
            SceneDataPack data,
            GameScenes[] additiveLoadScenes,
            bool autoMove
            )
        {
            ToMoveFlag.Value       = autoMove;
            _isTransitioning.Value = true;
            while (transitionComponent == null)
            {
                yield return(new WaitForSeconds(0.2f));

                transitionComponent.threshold = 0;
            }
            //タッチイベントを吸収させる
            image.raycastTarget      = true;
            transitionComponent.flip = false;
            transitionComponent.Play();
            yield return(onTransactionFinishedInternal.FirstOrDefault().StartAsCoroutine());

            transitionComponent.threshold = 1;

            SceneLoader.PreviousSceneData = data;

            //シーン遷移
            yield return(SceneManager.LoadSceneAsync(nextScene.ToString(), LoadSceneMode.Single));

            //追加シーンがある場合は一緒に読み込む
            if (additiveLoadScenes != null)
            {
                yield return(additiveLoadScenes.Select(scene =>
                                                       SceneManager.LoadSceneAsync(scene.ToString(), LoadSceneMode.Additive)
                                                       .ObserveEveryValueChanged(x => x.isDone)
                                                       .FirstOrDefault(x => x)
                                                       ).WhenAll().StartAsCoroutine());
            }
            Resources.UnloadUnusedAssets();
            GC.Collect();

            onAllSceneLoaded.OnNext(Unit.Default);
            if (!autoMove)
            {
                //自動遷移しないなら待機
                yield return(ToMoveFlag.FirstOrDefault(x => x).StartAsCoroutine());
            }
            ToMoveFlag.Value = false;

            //反転
            transitionComponent.Play();
            yield return(onTransactionFinishedInternal.FirstOrDefault().StartAsCoroutine());

            image.raycastTarget           = false;
            transitionComponent.threshold = 0;
            onTransitionAnimationFinishedSubject.OnNext(Unit.Default);
            _isTransitioning.Value = false;
        }
Beispiel #3
0
 /// <summary>
 /// シーン遷移を行う
 /// </summary>
 /// <param name="scene">次のシーン</param>
 /// <param name="data">次のシーンへ引き継ぐデータ</param>
 /// <param name="additiveLoadScenes">追加でロードするシーン</param>
 /// <param name="autoMove">トランジションアニメーションを自動的に完了させるか
 ///                        falseの場合はOpen()を実行しないとトランジションが終了しない</param>
 public static void LoadScene(GameScenes scene,
                              SceneDataPack data = null,
                              GameScenes[] additiveLoadScenes = null,
                              bool autoMove = true)
 {
     if (data == null)
     {
         data = new DefaultSceneDataPack(TransitionManager.CurrentGameScene);
     }
     TransitionManager.StartTransaction(scene, data, additiveLoadScenes, autoMove);
 }