@Baiteen
ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。その2。
やりたいこと
ReactiveExtensionsを使って画面を暗転させる。【Unity】シーン遷移時のフェードイン・フェードアウトを実装してみた コードを丸パクリしたけど、シーンは変わりません。
プロジェクトの構成は【Unity、UniRx】ダブルクリックを検知するのスクリプトを変えただけ。
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UniRx; public class TestScript : ObservableMonoBehaviour { ///フェード開始トリガー Subjecttrigger = new Subject (); /// フェード中の透明度 private float fadeAlpha = 0; ///RXのサンプルがAwakeだったので、ここに書きました。 public override void Awake () { //参考サイト:http://neue.cc/2010/07/28_269.html //ここで黒テクスチャ作る Texture2D blackTexture; blackTexture = new Texture2D (32, 32, TextureFormat.RGB24, false); blackTexture.ReadPixels (new Rect (0, 0, 32, 32), 0, 0, false); blackTexture.SetPixel (0, 0, Color.white); blackTexture.Apply (); //今回の場合、この変数は必要ない var clickFadeObservable = //trigger.OnNextされると値が発行される trigger //OnGUIを監視対象に追加 .SelectMany(_ => OnGUIAsObservable()) //OnGUIのタイミング?でGUIの透明度を更新 .Do(_ => { //透明度を更新して黒テクスチャを描画 GUI.color = new Color (0, 0, 0, fadeAlpha); GUI.DrawTexture (new Rect (0, 0, Screen.width, Screen.height), blackTexture); }) //フェードアウト・フェードインが終わるまでOnGUIを監視する .TakeUntil( //trigger.OnNextで発行された値(秒)でフェードアウトしてフェードインする trigger.SelectMany(sec => fadeOut(sec).ToObservable().SelectMany(_ => fadeIn(sec))) ) //TakeUntilで監視が終了するので、Repeatで繰り返す .Repeat() //発行される値の監視を開始。特に何もしない。 .Subscribe(_ => {}); //マウスダウンされたらトリガーから値を発行させる。 OnMouseDownAsObservable().Subscribe(_ => trigger.OnNext(1)); // If you use ObservableMonoBehaviour, must call base method ← サンプルにこう書いてますので、そのまま。 base.Awake (); } ///フェードアウト private IEnumerator fadeOut (float interval) { //だんだん暗く float time = 0; while (time <= interval) { this.fadeAlpha = Mathf.Lerp (0f, 1f, time / interval); time += Time.deltaTime; yield return 0; } } ///フェードイン private IEnumerator fadeIn (float interval) { //だんだん明るく float time = 0; while (time <= interval) { this.fadeAlpha = Mathf.Lerp (1f, 0f, time / interval); time += Time.deltaTime; yield return 0; } } }
やり方が合ってるか分からないけど、とりあえずやりたいことはできたっぽい。
コードの最後にXMLタグが付いちゃうのはなんなんだろ。