2014年7月21日月曜日

【Unity、UniRx】画面を暗転させる


@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タグが付いちゃうのはなんなんだろ。

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...