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();
}
}