@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 {
/// フェード開始トリガー
Subject trigger = 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タグが付いちゃうのはなんなんだろ。
