facebook twitter hatena line email

「Unity/UniRx/値変更検知/ObserveEveryValueChanged配列」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(Subjectを使った配列内のデータを検知(代替))
行23: 行23:
 
             isCompletedsAsObservable = new Subject<int>();
 
             isCompletedsAsObservable = new Subject<int>();
 
         }
 
         }
         public void Request(int id)
+
         public void Response(int id)
 
         {
 
         {
 
             isCompletedsAsObservable.OnNext(id);
 
             isCompletedsAsObservable.OnNext(id);
行41: 行41:
 
         Observable.Timer(System.TimeSpan.FromSeconds(5))
 
         Observable.Timer(System.TimeSpan.FromSeconds(5))
 
             .Subscribe(_ => {
 
             .Subscribe(_ => {
                 sampleClient.Request(id);
+
                 sampleClient.Response(id);
 
             }).AddTo(gameObject);
 
             }).AddTo(gameObject);
 
     }
 
     }
行63: 行63:
 
             IsCompleteds.Add(false);
 
             IsCompleteds.Add(false);
 
         }
 
         }
         public void Request(int id)
+
         public void Response(int id)
 
         {
 
         {
 
             IsCompleteds[id] = true;
 
             IsCompleteds[id] = true;
行89: 行89:
 
         Observable.Timer(System.TimeSpan.FromSeconds(5))
 
         Observable.Timer(System.TimeSpan.FromSeconds(5))
 
             .Subscribe(_ => {
 
             .Subscribe(_ => {
                 sampleClient.Request(id);
+
                 sampleClient.Response(id);
 
             }).AddTo(gameObject);
 
             }).AddTo(gameObject);
 
     }
 
     }
 
}
 
}
 
</pre>
 
</pre>

2023年6月23日 (金) 16:24時点における版

ObserveEveryValueChangedを配列で検知できる?

ObserveEveryValueChangedを配列の値変更をできなかった。

Subjectを使った配列内のキーを検知(代替)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using System;

public class ChangeValueListSubjectScene : MonoBehaviour
{
    class SampleClient
    {
        public List<string> Urls = new List<string>();
        Subject<int> isCompletedsAsObservable;
        public IObservable<int> IsCompletedsAsObservable { get => isCompletedsAsObservable; }
        public SampleClient()
        {
            Urls.Add("ttp://example.com");
            Urls.Add("ttp://example2.com");
            isCompletedsAsObservable = new Subject<int>();
        }
        public void Response(int id)
        {
            isCompletedsAsObservable.OnNext(id);
        }
    }
    void Start()
    {
        int id = 1;
        var sampleClient = new SampleClient();
        sampleClient.IsCompletedsAsObservable
            .Subscribe(id => {
                Debug.Log("Id=" + id + " sampleClient.Url=" + sampleClient.Urls[id]);
            })
            .AddTo(gameObject);

        // 5秒後に遅延実行
        Observable.Timer(System.TimeSpan.FromSeconds(5))
            .Subscribe(_ => {
                sampleClient.Response(id);
            }).AddTo(gameObject);
    }
}

EveryUpdateを使った配列内のデータを検知(代替)

毎フレームごとに処理されるので危険かも。

public class ChangeValueListScene : MonoBehaviour
{
    class SampleClient
    {
        public List<string> Urls = new List<string>();
        public List<bool> IsCompleteds = new List<bool>();
        public SampleClient()
        {
            Urls.Add("ttp://example.com");
            Urls.Add("ttp://example2.com");
            IsCompleteds.Add(false);
            IsCompleteds.Add(false);
        }
        public void Response(int id)
        {
            IsCompleteds[id] = true;
        }
    }
    void Start()
    {
        int id = 0;
        var sampleClient = new SampleClient();
        // 毎フレームごとに処理されるので危険かも。
        var observable = Observable.EveryUpdate()
            .Subscribe(_ =>
            {
                Debug.Log("IsCompleteds.Count=" + sampleClient.IsCompleteds.Count);
                int cnt = sampleClient.IsCompleteds.Count;
                for (int tmpId = 0; tmpId < cnt; tmpId++)
                {
                    if (!sampleClient.IsCompleteds[tmpId]) continue;
                    Debug.Log("Id=" + tmpId + " sampleClient.Url=" + sampleClient.Urls[tmpId]);
                    sampleClient.IsCompleteds[tmpId] = false; // そのままにすると、連続してここが処理されるので、初期化
                }
            })
            .AddTo(gameObject);
        // 5秒後に遅延実行
        Observable.Timer(System.TimeSpan.FromSeconds(5))
            .Subscribe(_ => {
                sampleClient.Response(id);
            }).AddTo(gameObject);
    }
}