「Unity/R3/値変更検知/ReactivePropertyをリストの項目に」の版間の差分
提供: 初心者エンジニアの簡易メモ
細 (Admin がページ「Unity/R3/値変更検知/ReactivePropertyをリストの値に」を「Unity/R3/値変更検知/ReactivePropertyをリストの項目に」に移動しました) |
|||
(同じ利用者による、間の2版が非表示) | |||
行8: | 行8: | ||
using System.Collections.Generic; | using System.Collections.Generic; | ||
− | public class | + | public class ReactivePropertyListColumnScene : MonoBehaviour |
{ | { | ||
SampleRepository sampleRepository; | SampleRepository sampleRepository; | ||
行14: | 行14: | ||
class User | class User | ||
{ | { | ||
− | public | + | public ReactiveProperty<string> Name; |
− | public | + | public ReactiveProperty<int> Age; |
public User(string name, int age) | public User(string name, int age) | ||
{ | { | ||
− | Name = new | + | Name = new ReactiveProperty<string>(name); |
− | Age = new | + | Age = new ReactiveProperty<int>(age); |
} | } | ||
} | } |
2025年3月21日 (金) 02:00時点における最新版
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(); } }