本日は UniRx の小ネタ枠です。
ReactiveCollection でコレクションの変更をまとめて通知する方法について記事にします。
Merge
Merge オペレータを利用することで複数のシーケンスをまとめたObservableを作成できます。
今回はObservable.Mergeを使って様々な変更通知を1つのシーケンスにまとめたObservableを作ります。
以下のサンプルスクリプトを作成してみました。
コレクションの追加、更新、削除、移動、クリアの通知をまとめたObservableを購読してデバッグログを出力します。
・ReactivePropertyTest5.cs
using System;
using System.Linq;
using Cysharp.Threading.Tasks;
using UniRx;
using UnityEngine;
public class ReactivePropertyTest5 : MonoBehaviour
{
private enum ChangeType
{
Add,
Remove,
Replace,
Move,
Reset,
}
private readonly ReactiveCollection<string> dataProp = new();
private IObservable<(ChangeType, string[])> DataPropObservable => Observable.Merge(
dataProp.ObserveAdd().Select(_ => (ChangeType.Add, dataProp.ToArray())),
dataProp.ObserveRemove().Select(_ => (ChangeType.Remove, dataProp.ToArray())),
dataProp.ObserveReplace().Select(_ => (ChangeType.Replace, dataProp.ToArray())),
dataProp.ObserveMove().Select(_ => (ChangeType.Move, dataProp.ToArray())),
dataProp.ObserveReset().Select(_ => (ChangeType.Reset, dataProp.ToArray()))
);
void Start()
{
DataPropObservable
.Subscribe(data =>
{
Debug.Log($"ChangeType : {data.Item1}, Data : {string.Join(", ", data.Item2)}");
})
.AddTo(this);
dataProp.Add("First");
dataProp.Add("Second");
dataProp.Add("Third");
dataProp[2] = "End";
dataProp.Remove("Second");
dataProp.Move(0, 1);
dataProp.Clear();
}
}
以下の通り、コレクションの変更を1つの Observable を使って監視して出力することができました。