facebook twitter hatena line email

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