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