facebook twitter hatena line email

「Unity/R3/値変更検知/ReactivePropertyをリストの項目に」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
(同じ利用者による、間の4版が非表示)
行1: 行1:
==ReactivePropertyのリストの変更を、項目別にまとめて、購読させる方法==
+
==ReactivePropertyのメンバを持つリストの変更を、項目別にまとめて、購読させる方法==
  
 
<pre>
 
<pre>
行8: 行8:
 
using System.Collections.Generic;
 
using System.Collections.Generic;
  
public class ReactivePropertyListScene : MonoBehaviour
+
public class ReactivePropertyListColumnScene : MonoBehaviour
 
{
 
{
     SampleReactiveProperty sampleReactiveProperty;
+
     SampleRepository sampleRepository;
  
     class SampleUser
+
     class User
 
     {
 
     {
 
         public ReactiveProperty<string> Name;
 
         public ReactiveProperty<string> Name;
 
         public ReactiveProperty<int> Age;
 
         public ReactiveProperty<int> Age;
 
          
 
          
         public SampleUser(string name, int age)
+
         public User(string name, int age)
 
         {
 
         {
 
             Name = new ReactiveProperty<string>(name);
 
             Name = new ReactiveProperty<string>(name);
行24: 行24:
 
     }
 
     }
  
     class SampleReactiveProperty
+
     class SampleRepository
 
     {
 
     {
 
         private CompositeDisposable disposables = new CompositeDisposable();
 
         private CompositeDisposable disposables = new CompositeDisposable();
         private List<SampleUser> users = new List<SampleUser>(new List<SampleUser>
+
         private List<User> users = new List<User>(new List<User>
 
         {
 
         {
             new SampleUser("Alice", 10),
+
             new User("Alice", 10),
             new SampleUser("Bob", 12),
+
             new User("Bob", 12),
             new SampleUser("Charlie", 15)
+
             new User("Charlie", 15)
 
         });
 
         });
         public List<SampleUser> Users => users;
+
 
 +
         public List<User> Users => users;
 
         private Subject<int> nameAsObservable = new Subject<int>();
 
         private Subject<int> nameAsObservable = new Subject<int>();
 
         private Subject<int> ageAsObservable = new Subject<int>();
 
         private Subject<int> ageAsObservable = new Subject<int>();
行39: 行40:
 
         public Subject<int> AgeAsObservable => ageAsObservable;
 
         public Subject<int> AgeAsObservable => ageAsObservable;
  
         public SampleReactiveProperty()
+
         public SampleRepository()
 
         {
 
         {
 
             int i = 0;
 
             int i = 0;
             foreach (SampleUser user in users) {
+
             foreach (User user in users) {
 
                 int id = i;
 
                 int id = i;
 
                 user.Age.Subscribe(age => {
 
                 user.Age.Subscribe(age => {
行61: 行62:
 
     void Start()
 
     void Start()
 
     {
 
     {
         sampleReactiveProperty = new SampleReactiveProperty();
+
         sampleRepository = new SampleRepository();
         sampleReactiveProperty.NameAsObservable
+
         sampleRepository.NameAsObservable
 
             .Subscribe(id =>
 
             .Subscribe(id =>
 
             {
 
             {
                 Debug.Log("Change name : " + sampleReactiveProperty.Users[id].Name);
+
                 Debug.Log("Change name : " + sampleRepository.Users[id].Name);
 
             })
 
             })
 
             .AddTo(gameObject);
 
             .AddTo(gameObject);
         sampleReactiveProperty.AgeAsObservable
+
         sampleRepository.AgeAsObservable
 
             .Subscribe(id =>
 
             .Subscribe(id =>
 
             {
 
             {
                 Debug.Log("Change age : " + sampleReactiveProperty.Users[id].Age);
+
                 Debug.Log("Change age : " + sampleRepository.Users[id].Age);
 
             })
 
             })
 
             .AddTo(gameObject);
 
             .AddTo(gameObject);
行78: 行79:
 
         Observable.Timer(System.TimeSpan.FromSeconds(5))
 
         Observable.Timer(System.TimeSpan.FromSeconds(5))
 
             .Subscribe(_ => {
 
             .Subscribe(_ => {
                 sampleReactiveProperty.Users[1].Name.Value = "taro";
+
                 sampleRepository.Users[1].Name.Value = "taro";
                 sampleReactiveProperty.Users[1].Age.Value = 11;
+
                 sampleRepository.Users[1].Age.Value = 11;
 
             }).AddTo(gameObject);
 
             }).AddTo(gameObject);
 
     }
 
     }
 
     void OnDestroy()
 
     void OnDestroy()
 
     {
 
     {
         sampleReactiveProperty?.Dispose();
+
         sampleRepository?.Dispose();
 
     }
 
     }
 
}
 
}
 +
 
</pre>
 
</pre>

2025年3月21日 (金) 02:00時点における最新版

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