困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

Unityの話~UniRXを触ってみた~

2年くらい前から勉強するする詐欺していたUniRXですが、
業務の空き時間がヤバいことになっているので、その合間に触ってみた話。

〇参考スライド
https://www.slideshare.net/torisoup/unity-unirx

とりあえず、1~95まで眺めて、78~95までは、色々と実験しながら触ってみた。

〇使えるようにするまで
とりあえず、UnityEditorを立ち上げて、
メニューのwindow ⇒ AssetStoreを押す。
そこの検索窓に「UniRX」って検索して、全部インストールすればおk。

f:id:mochimoffu:20180208201409p:plain

〇実験した内容と解釈
とりあえず、上記スライドを見て95ページくらいまでなら思考停止でも進められるのでやってみて欲しい。
筆者なりの解釈は、以下の実験コードのコメントに記載してみた。

using System;            // TimeSpan使うのに必要
using System.Collections;
using System.Collections.Generic;
using UniRx;          // UniRX使う為
using UniRx.Triggers; // this.UpdateAsObservable()とか使う為
using UnityEngine;
using UnityEngine.UI;

public class UniRXTest : MonoBehaviour {

    [SerializeField] private Button TestButton;
    [SerializeField] private Text TestText;

    int count = 0;
    bool stateCheck = false;

    // Use this for initialization
    void Start () {

        // ↓ダブルクリック(最後にクリックが押されてから200ミリ待って、実行。なので、厳密にはダブル以上クリック
        var stream = this.UpdateAsObservable()            // 毎フレームストリームを発行(というイメージ)
        .Where(_ => Input.GetMouseButtonDown(0));   // ボタンを押された時だけ、というフィルタ
        // ↑の、まとまり

        var otherStream = stream.Throttle(TimeSpan.FromMilliseconds(200f));// ストリームが到達してから、200ミリ経過したら。つまり、ストリームが届くとリセットされる。
        // ↑つまり、ボタンを押された時にここまで来るので、ボタンを押されてから200ミリ経過したら、というまとまり

        

        stream.Buffer(otherStream)      // Buffer = 条件が揃うまで待つ、とすると覚えやすいかも
            .Where(x => x.Count >= 2)    // 押された回数が2回以上、というフィルター
            .Subscribe(_ => {            // 処理発行
                Debug.Log("TEST");
                Debug.Log(_.Count);
            });
        // ↑ここまで
        // つまり、毎フレームストリームは流れているのだが
        // ボタンが押された時から時間を数え始め
        // 200ミリ経過された時点で
        // 押された回数が2回なら発火


        // ↓状態変更検知(状態が変わったら、次のストリームに流すサンプル的な)
        this.UpdateAsObservable()
            .Select(_ => stateCheck) // 流す情報を、bool型の変更している。Selectは、そういう変更を行う指令
            .DistinctUntilChanged() // これが、前の状態と比べて変化していたら、だと思われる。
            .Where(_ => _ == true)  // trueの時というフィルタ
            .Subscribe(_ => {        // 発火
                Debug.Log(_);
            });
        // ↑ここまで
    }
    
    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0)) {
            stateCheck = !stateCheck;
        }
    }
}

〇感想
沢山条件が指定できるモジュールみたいなイメージが沸いた。
今のところは、やれることが全然把握できていないので、無理して使うという感じにはならないが、
煩わしい処理を書いているなと感じた時に、UniRXにしてみたらどうなるのだろう、という思考にしてみようと思った。
もしかしたら、道が開けやすいかもしれない。