MRが楽しい

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

UniRxのSwitchを使ってObservableを切り替える

本日はUniRxの小ネタ枠です。
UniRxのSwitchを使ってObservableを切り替える方法を記事にします。

前提条件

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

Switchを使ってObservableを切り替える

Switchオペレータを使うと既にObservableを購読していた場合、以前のObservableを破棄して新しいObservableを購読します。
結果としてObservableを切り替える動作が可能になります。

以下のサンプルスクリプトを作成しました。
ボタンを押下すると1秒ごとに発火するObservableを生成し、ボタン押下からの秒数を表示します。
・SwitchTest.cs

using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class SwitchTest : MonoBehaviour
{
    [SerializeField]
    private Button countStartButton;
    
    void Start()
    {
        // ボタンを押下すると1秒毎に経過秒数をログ出力する
        countStartButton.OnClickAsObservable() // ボタン押下時に発火するObservable
            .Select(_ => Observable.Interval(System.TimeSpan.FromSeconds(1))) // 1秒毎にOnNextするObservableに変換
            .Switch() // 購読するObservableを切り替える
            .Subscribe(count => Debug.Log($"{count}秒経過")) // 経過秒数をログ出力する
            .AddTo(this);
    }
}

シーンに設定してボタンを押下すると以下の通り、ボタン押下からの経過病が表示されます。

Switchオペレータを挟んでいるため、2回ボタンを押した場合は1回目のObservable.Intervalの購読が破棄されます。
これにより、1回目のボタン押下のカウントは発生しなくなります。