// トランジション IObservable <T> MoveTransition <T> (string screenType, TransitionStyle transitionStyle, Action <T> action = null) where T : ScreenPresenter { var subject = new AsyncSubject <T> (); GameObject obj = Instantiate(ResourcesManager.Instance.GetScreen(screenType), screenContainer) as GameObject; var canvas = obj.GetComponent <Canvas> (); T screen = obj.GetComponent <T> (); var effect = TransitionFactory.Create(transitionStyle); Action <Unit> setParam = _ => { if (action != null) { action(screen); } }; canvas.enabled = false; // 生成して非表示にしておく effect.AnimateIn() .SelectMany(_ => screen.Initialize()) .Do(setParam) .SelectMany(_ => screen.OnBeforeMoveIn()) .Do(_ => canvas.enabled = true) .SelectMany(_ => Observable.WhenAll(effect.AnimateOut(), screen.OnMoveIn())) .SelectMany(_ => screen.OnEndMoveIn()) .Subscribe(_ => {}, () => { subject.OnNext(screen); subject.OnCompleted(); }); return(subject); }
IEnumerator MoveTransitionCoroutine <T> (string screenType, IObserver <T> observer, TransitionStyle transitionStyle = TransitionStyle.Null, Action <T> action = null) where T : ScreenPresenter { var effect = TransitionFactory.Create(transitionStyle); yield return(effect.AnimateIn().ToYieldInstruction()); // 生成 GameObject obj = Instantiate(ResourcesManager.Instance.GetScreen(screenType), screenContainer) as GameObject; T screen = obj.GetComponent <T> (); // 初期化 yield return(screen.Initialize().ToYieldInstruction()); // モデルの注入 if (action != null) { action(screen); } // 遷移 yield return(screen.OnBeforeMoveIn().ToYieldInstruction()); //Debug.LogError ("BeforeMoveIn終了"); yield return(Observable.WhenAll( screen.OnMoveIn(), effect.AnimateOut() ).ToYieldInstruction()); yield return(screen.OnEndMoveIn().ToYieldInstruction()); // 副作用 CurrentScreen = screen; observer.OnNext(screen); observer.OnCompleted(); }