MRが楽しい

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

UniRxのMergeを使って複数のObservableをまとめて通知する

本日はUniRxの小ネタ枠です。
UniRxのMergeを使って複数のObservableをまとめて通知する方法を記事にします。

前提条件

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

Mergeを使って複数のObservableをまとめる

UniRxのMergeオペレータを使うことで複数のObservableを1つのストリームにまとめることができます。

IObservable<Unit> firstButtonObservable = firstButton.OnClickAsObservable();
IObservable<Unit> secondButtonObservable = secondButton.OnClickAsObservable();
        
Observable.Merge(
    firstButtonObservable,
    secondButtonObservable
    ).Subscribe(_ => Debug.Log($"Button Clicked !!"))

サンプルスクリプト

2つのボタンのクリックイベントに対して同様のログ出力の処理を行う以下のサンプルスクリプトを作成しました。
・ObservableMergeTest.cs

using System;
using System.Collections.Generic;
using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class ObservableMergeTest : MonoBehaviour
{
    [SerializeField]
    private Button firstButton;

    [SerializeField]
    private Button secondButton;

    void Start()
    {
        List<Button> buttons = new List<Button>()
        {
            firstButton,
            secondButton,
        };
        
        IObservable<Unit> firstButtonObservable = firstButton.OnClickAsObservable();
        IObservable<Unit> secondButtonObservable = secondButton.OnClickAsObservable();
        
        Observable.Merge(
            firstButtonObservable,
            secondButtonObservable
            ).Subscribe(_ => Debug.Log($"Button Clicked !!"))
            .AddTo(this);
    }
}

2つのButtonコンポーネントを設定したサンプルシーンを用意して動作を確認します。

どちらのボタンを押下しても同じ処理が呼び出されることが確認できます。

Tips

以下のようにObservableから直接Mergeオペレータを記述することもできます。

IObservable<Unit> firstButtonObservable = firstButton.OnClickAsObservable();
IObservable<Unit> secondButtonObservable = secondButton.OnClickAsObservable();

firstButtonObservable.Merge(
    secondButtonObservable
    ).Subscribe(_ => Debug.Log($"Button Clicked !!"))
    .AddTo(this);