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
