Unity/R3/値変更検知/ObservableList
提供: 初心者エンジニアの簡易メモ
配列の検知更新
まとめて検知
値をObservableListで入れて、ObserveChangedでまとめて検知する。
参考:https://github.com/Cysharp/ObservableCollections
using UnityEngine;
using R3;
using ObservableCollections;
using System.Collections.Specialized;
public class ReactiveConnectionScene : MonoBehaviour
{
private ObservableList<string> users = new ObservableList<string>();
void Start()
{
// すべての変更(追加・移動・削除・更新・リセット)を購読
users.ObserveChanged().Subscribe(change =>
{
Debug.Log($"[ObserveChanged]");
switch (change.Action)
{
case NotifyCollectionChangedAction.Add:
Debug.Log($"[Add]: {change.NewItem}");
break;
case NotifyCollectionChangedAction.Move:
Debug.Log($"[Move]: {change.OldStartingIndex} → {change.NewStartingIndex}");
break;
case NotifyCollectionChangedAction.Remove:
Debug.Log($"[Remove]: {change.NewItem}");
break;
case NotifyCollectionChangedAction.Replace:
Debug.Log($"[Replace]: {change.OldItem} → {change.NewItem}");
break;
case NotifyCollectionChangedAction.Reset:
Debug.Log($"[Reset]");
break;
default:
Debug.Log("[Other]");
break;
}
});
users.Add("taro");
users[0] = "taro!";
users.Add("jiro");
users.Add("saburo");
users.Move(0, 1); // 配列0を配列1へ移動(jiro, taro, saburo)
users.Move(1, 2); // 配列1を配列2へ移動(jiro, saburo, taro)
}
}
出力
[ObserveChanged] [Add]: taro [ObserveChanged] [Replace]: taro → taro! [ObserveChanged] [Add]: jiro [ObserveChanged] [Add]: saburo [ObserveChanged] [Move]: 0 → 1 [ObserveChanged] [Move]: 1 → 2
個別に検知
using UnityEngine;
using R3;
using ObservableCollections;
public class ReactiveConnectionScene : MonoBehaviour
{
private ObservableList<string> users = new ObservableList<string>();
void Start()
{
users
.ObserveAdd()
.Subscribe(value =>
{
Debug.Log($"[Add]Index={value.Index},Value={value.Value}");
});
users
.ObserveMove()
.Subscribe(value =>
{
Debug.Log($"[Move]Value={value.Value},NewIndex={value.NewIndex},OldIndex={value.OldIndex}");
});
users
.ObserveRemove()
.Subscribe(value =>
{
Debug.Log($"[Remove]Index={value.Index},Value={value.Value}");
});
users
.ObserveReplace()
.Subscribe(value =>
{
Debug.Log($"[Replace]Index={value.Index},NewValue={value.NewValue},OldValue={value.OldValue}");
});
users
.ObserveReset()
.Subscribe(value =>
{
Debug.Log($"[Reset]");
});
users.Add("taro");
users[0] = "taro!";
users.Add("jiro");
users.Add("saburo");
users.Move(0, 1); // 配列0を配列1へ移動(jiro, taro, saburo)
users.Move(1, 2); // 配列1を配列2へ移動(jiro, saburo, taro)
}
}
出力
[Add]Index=0,Value=taro [Replace]Index=0,NewValue=taro!,OldValue=taro [Move]Value=taro!,NewIndex=1,OldIndex=0 [Move]Value=taro!,NewIndex=2,OldIndex=1
