Unity/R3/値変更検知/ReactivePropertyをリストの項目に
提供: 初心者エンジニアの簡易メモ
ReactivePropertyのメンバを持つリストの変更を、項目別にまとめて、購読させる方法
using UnityEngine; using R3; using System; using System.Collections; using System.Collections.Generic; public class ReactivePropertyListColumnScene : MonoBehaviour { SampleRepository sampleRepository; class User { public ReactiveProperty<string> Name; public ReactiveProperty<int> Age; public User(string name, int age) { Name = new ReactiveProperty<string>(name); Age = new ReactiveProperty<int>(age); } } class SampleRepository { private CompositeDisposable disposables = new CompositeDisposable(); private List<User> users = new List<User>(new List<User> { new User("Alice", 10), new User("Bob", 12), new User("Charlie", 15) }); public List<User> Users => users; private Subject<int> nameAsObservable = new Subject<int>(); private Subject<int> ageAsObservable = new Subject<int>(); public Subject<int> NameAsObservable => nameAsObservable; public Subject<int> AgeAsObservable => ageAsObservable; public SampleRepository() { int i = 0; foreach (User user in users) { int id = i; user.Age.Subscribe(age => { nameAsObservable.OnNext(id); }).AddTo(disposables); user.Name.Subscribe(name => { ageAsObservable.OnNext(id); }).AddTo(disposables); i++; } } public void Dispose() { disposables?.Dispose(); } } void Start() { sampleRepository = new SampleRepository(); sampleRepository.NameAsObservable .Subscribe(id => { Debug.Log("Change name : " + sampleRepository.Users[id].Name); }) .AddTo(gameObject); sampleRepository.AgeAsObservable .Subscribe(id => { Debug.Log("Change age : " + sampleRepository.Users[id].Age); }) .AddTo(gameObject); // 5秒後に遅延実行 Observable.Timer(System.TimeSpan.FromSeconds(5)) .Subscribe(_ => { sampleRepository.Users[1].Name.Value = "taro"; sampleRepository.Users[1].Age.Value = 11; }).AddTo(gameObject); } void OnDestroy() { sampleRepository?.Dispose(); } }