「Unity/R3/値変更検知/ReactivePropertyをリストの項目に」の版間の差分
提供: 初心者エンジニアの簡易メモ
行1: | 行1: | ||
+ | ==ReactivePropertyのリストの変更を、項目別にまとめて、購読させる方法== | ||
+ | |||
<pre> | <pre> | ||
using UnityEngine; | using UnityEngine; |
2025年3月20日 (木) 21:14時点における版
ReactivePropertyのリストの変更を、項目別にまとめて、購読させる方法
using UnityEngine; using R3; using System; using System.Collections; using System.Collections.Generic; public class ReactivePropertyListScene : MonoBehaviour { SampleReactiveProperty sampleReactiveProperty; class SampleUser { public ReactiveProperty<string> Name; public ReactiveProperty<int> Age; public SampleUser(string name, int age) { Name = new ReactiveProperty<string>(name); Age = new ReactiveProperty<int>(age); } } class SampleReactiveProperty { private CompositeDisposable disposables = new CompositeDisposable(); private List<SampleUser> users = new List<SampleUser>(new List<SampleUser> { new SampleUser("Alice", 10), new SampleUser("Bob", 12), new SampleUser("Charlie", 15) }); public List<SampleUser> 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 SampleReactiveProperty() { int i = 0; foreach (SampleUser 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() { sampleReactiveProperty = new SampleReactiveProperty(); sampleReactiveProperty.NameAsObservable .Subscribe(id => { Debug.Log("Change name : " + sampleReactiveProperty.Users[id].Name); }) .AddTo(gameObject); sampleReactiveProperty.AgeAsObservable .Subscribe(id => { Debug.Log("Change age : " + sampleReactiveProperty.Users[id].Age); }) .AddTo(gameObject); // 5秒後に遅延実行 Observable.Timer(System.TimeSpan.FromSeconds(5)) .Subscribe(_ => { sampleReactiveProperty.Users[1].Name.Value = "taro"; sampleReactiveProperty.Users[1].Age.Value = 11; }).AddTo(gameObject); } void OnDestroy() { sampleReactiveProperty?.Dispose(); } }