MRが楽しい

MRやVRについて学習したことを書き残す

UniRxのTakeUntilを使って他のストリームにデータが流れるまで通知を受け取る

本日はUniRxの小ネタ枠です。
UniRxのTakeUntilを使って他のストリームにデータが流れるまで通知を受け取る方法です。

前提条件

UniRxの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

TakeUntil

TakeUntilは指定のストリームにデータが流れるとOnCompleteで購読を終了するオペレータです。

        Observable.EveryUpdate()
            // 10秒後にOnNextを受け取り、EveryUpdateの購読を終了する
            .TakeUntil(Observable.Timer(TimeSpan.FromSeconds(10)))
            .Subscribe(
                _ => Debug.Log("EveryUpdate"),
                () => Debug.Log("EveryUpdate Complete"))
            .AddTo(this);

サンプルスクリプト

ボタンのストリームを待ち受けるようにすると、ボタンを押下するまで購読を続ける処理を準備できます。
以下にボタンを押すまで定期的にログが出力されるサンプルスクリプトを作成しました。
・TakeUntilTest.cs

using System;
using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class TakeUntilTest : MonoBehaviour
{
    [SerializeField]
    private Button button;

    private IObservable<Unit> _buttonObservable => button.OnClickAsObservable();
    
    private void Start()
    {
        // TakeUntilを使ってボタン押下されるまで1秒ごとにログ出力を行う
        Observable.Interval(TimeSpan.FromSeconds(1))
            .TakeUntil(_buttonObservable)
            .Subscribe(
                count => Debug.Log($"Update : {count}"),
                () => Debug.Log("Complete"))
            .AddTo(this);
    }
}

シーンを再生して動作を確認します。
再生と同時に1秒ごとにログ出力がカウントされていきます。

ボタンを押下するとOnConpleteが通知され、ログ出力を停止できます。