MRが楽しい

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

UniRxのDistincを使って初めて入力された値に対してのみ処理を行う

本日は UniRx の小ネタ枠です。
UniRxの Distinc を使って初めて入力された値に対してのみ処理を行う方法を記事にします。

前提条件

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

Distincを使って初めて入力された値に対してのみ処理を行う

Distinc オペレータは初めて入力された値を受け取ったときのみ通知を流します。
それまで入力された全ての値を保持し、比較します。

以下、サンプルスクリプトです。
・DistincTest.cs

using UniRx;
using UnityEngine;

public class DistincTest : MonoBehaviour
{
    void Start()
    {
        var checkValue = new Subject<int>();
        checkValue
            .Distinct() // これまでの入力と比較して初めて入力された値のみ通す
            .Subscribe(val =>
                {
                    Debug.Log($"Distinc : {val}");
                }
            ).AddTo(this);

        checkValue.OnNext(1);
        checkValue.OnNext(1);
        checkValue.OnNext(2);
        checkValue.OnNext(1);
        checkValue.OnNext(2);
        checkValue.OnNext(3);
    }
}

シーンを再生してみると、初めて入力された値のみメッセージが表示されています。

一つ前の値とのみ比較する

それまでの入力全てではなく、一つ前の値とのみ比較して値が変化したときのみ通知を行う場合は DistinctUntilChanged オペレータを利用します。
・DistincTest.cs

using UniRx;
using UnityEngine;

public class DistincTest : MonoBehaviour
{
    void Start()
    {
        var checkValue = new Subject<int>();
        checkValue
            .DistinctUntilChanged() // 前回の入力と比較して異なる入力値のみ通す
            .Subscribe(val =>
                {
                    Debug.Log($"DistincUntilChanged : {val}");
                }
            ).AddTo(this);
        
        checkValue.OnNext(1);
        checkValue.OnNext(1);
        checkValue.OnNext(2);
        checkValue.OnNext(1);
        checkValue.OnNext(2);
        checkValue.OnNext(3);
    }
}