facebook twitter hatena line email

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