facebook twitter hatena line email

Unity/UniRx/値変更検知/ObserveEveryValueChanged配列

提供: 初心者エンジニアの簡易メモ
2023年6月23日 (金) 15:41時点におけるAdmin (トーク | 投稿記録)による版

移動: 案内検索

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 Request(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.Request(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 Request(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.Request(id);
           }).AddTo(gameObject);
   }

} </pre>