Unity/R3/値変更検知/ReactivePropertyをリストへ
提供: 初心者エンジニアの簡易メモ
リストに配列を代入すると購読できるようになる。ちなみにリストは同じ値を入れても購読は反応する。 ObservableListのほうがよいかも。何を変更したか検知できる。
using UnityEngine; using R3; using System; using System.Collections; using System.Collections.Generic; using System.Linq; public class ReactivePropertyListScene : MonoBehaviour { private ReactiveProperty<UserRepository> userRepository; private CompositeDisposable disposables = new CompositeDisposable(); class User { public string Name; public int Age; } class UserRepository { private List<User> users = default; public List<User> Users => users; public UserRepository(List<User> users) { this.users = users; } } void Start() { var users = new List<User>() { new() { Name = "Alice", Age = 10}, new() { Name = "Bob", Age = 12}, new() { Name = "Charlie", Age = 15} }; userRepository = new ReactiveProperty<UserRepository>(new UserRepository(users)); userRepository .Subscribe(x => { foreach (var user in x.Users) { Debug.Log($"Change Name:{user.Name}, Age:{user.Age}"); } }) .AddTo(disposables); // 5秒後に遅延実行 Observable.Timer(System.TimeSpan.FromSeconds(5)) .Subscribe(_ => { Debug.Log("after 5 sec"); userRepository.Value = new UserRepository(users.OrderByDescending(x => x.Age).ToList()); }).AddTo(disposables); } void OnDestroy() { disposables?.Dispose(); } }
出力
Change Name:Alice, Age:10 Change Name:Bob, Age:12 Change Name:Charlie, Age:15 after 5 sec Change Name:Charlie, Age:15 Change Name:Bob, Age:12 Change Name:Alice, Age:10