MRが楽しい

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

ReactiveCollectionでコレクションの様々な変化を通知する

本日は UniRx の小ネタ枠です。
ReactiveCollection でコレクションの様々な変化を通知する方法について記事にします。

ReactiveCollection

UniRx の ReactiveCollection は変数を監視可能なリスト型です。
コレクションの変化を購読(Sbscribe)することで、リストの追加や削除などを通知で受け取ることができます。

サンプルスクリプト

以下のサンプルスクリプトを作成して試してみました。
コレクションの追加、更新、削除、クリアの Observable を購読してそれぞれの変化を実際に起こしてみています。
因みに通知ごとに受け取れる情報が異なる箇所があり、例えば更新は変化前の値と変化後の値を取得することができます。
・ReactivePropertyTest3.cs

using System;
using Cysharp.Threading.Tasks;
using UniRx;
using UnityEngine;

public class ReactivePropertyTest3 : MonoBehaviour
{
    private readonly ReactiveCollection<string> dataProp = new();

    void Start()
    {
        // コレクション追加時の通知
        dataProp.ObserveAdd()
            .Subscribe(data =>
            {
                Debug.Log($"Add : Index = {data.Index}, Value = {data.Value}");
            })
            .AddTo(this);
        
        // コレクション更新時の通知
        dataProp.ObserveReplace()
            .Subscribe(data =>
            {
                Debug.Log($"Replace : Index = {data.Index}, OldValue = {data.OldValue}, NewValue = {data.NewValue}");
            })
            .AddTo(this);

        // コレクション削除時の通知
        dataProp.ObserveRemove()
            .Subscribe(data =>
            {
                Debug.Log($"Remove : Index = {data.Index}, Value = {data.Value}");
            })
            .AddTo(this);
        
        // コレクションクリア時の通知
        dataProp.ObserveReset()
            .Subscribe(data =>
            {
                Debug.Log($"Reset : Unit");
            })
            .AddTo(this);
        
        // 追加
        dataProp.Add("First");
        dataProp.Add("Second");
        dataProp.Add("Third");
        
        // 更新
        dataProp[2] = "End";
        
        // 削除
        dataProp.Remove("Second");

        // クリア
        dataProp.Clear();
    }
}

以下の通り、コレクションの変更に応じたログを出力することができました。