UniRxのシンプルなサンプル その12(最後のペアを取得する CombineLatest)


UniRxのシンプルなサンプルの取扱説明書
前(シーケンスをつなげる Concat)

最後のペアを取得する

ネットワークの問題でお家から投稿できなくなっていて投稿途切れていました・・・
物理層逝くとやばいわかる

さて、今回はCombineLatestです。
前回のConcatが直列に値を流し込むならこちらは並列に流し込むメソッドです。
そしてその中でも一番使われそうなメソッドです。

今回は2つのInputFieldから数値を取得して自動的にその和を表示するTextを作成します。

前準備

次のようにInputField2つとCombineLatestTextというTextを用意します。
(Imageはただ見やすくするための背景です)

ソースコード

今回のソースコードは以下のとおりです。

public InputField Field1, Field2;にはInputField1,InputField2をそれぞれアタッチします。

CombineLatestSample.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UniRx;
using UniRx.Triggers;
using System;
using System.Linq;

public class CombineLatestSample : MonoBehaviour {

    //InputField1,InputField2をそれぞれアタッチする
    public InputField Field1, Field2;

    // Use this for initialization
    void Start () {
        Observable.CombineLatest<string>(Field1.OnValueChangeAsObservable(), Field2.OnValueChangeAsObservable())
            .Subscribe(inlist => {
                try {
                    GetComponent<Text>().text = inlist.Sum(s => Double.Parse(s)).ToString();
                } catch { }
            });
    }
}

今回の主役Observable.CombineLatestはIObservableを任意個まとめて後続に流します。
今回は、Field1,Field2の値をそれぞれ監視して変化したら値をプッシュしてくれるUniRx.Triggerの拡張メソッドOnValueChangeAsObservableです。

CombineLatestはそれぞれのストリームの最後の値をどれかのストリームがプッシュされた時に配列にまとめてプッシュします。
流れる値のイメージ(このご時世未だペイントである)はこんなかんじになります。

横軸が時系列、縦軸がどのストリームにどの値が入ってきたかです。()内はそのストリームの最後にプッシュされた値です。
(めっちゃ見にくくてすいません・・・)

CombineLatestの先 値が揃っていないので何もなし ストリーム1は前回の1 ストリーム2は今回の2があるので (1,2)の配列が流れる ストリーム1は今回の3 ストリーム2は前回の2があるので (3,2)の配列が流れる ストリーム1は今回の4 ストリーム2は前々回の2があるので (4,2)の配列が流れる ストリーム2を待機 ストリーム2が流れてきたため (4,5)の配列が流れる OnComplete
ストリーム1に流れてきた値 1 (1) 3 4 OnComplete (4)
ストリーム2に流れてきた値 2 (2) (2) (2) 5 OnComplete

このようにどれかのストリームに値が流れてきたタイミングで後続に値を流せるので、値が変わったら即見た目に変更がほしい時などに利用できます。

実行結果

このように2つのInputFieldから数値を取得して自動的にその和を表示するTextが出来ました。
上下どちらかのInputFieldに数字を入れればその和が右の□に出てきます。