facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(Admin がページ「Unity/UniRx/値変更検知/ObserveEveryValueChanged配列EveryUpdate」を「Unity/UniRx/値変更検知/ObserveEveryValueChanged配列」に、リダイレクトを残さずに移動しました)
行1: 行1:
 +
==ObserveEveryValueChangedを配列で検知できる?==
 +
ObserveEveryValueChangedを配列の値変更をできなかった。
  
==ObserveEveryValueChangedを使った配列内のデータを検知==
+
==Subjectを使った配列内のデータを検知(代替)==
毎フレームごとに処理されるので危険かも。
+
 
<pre>
 
<pre>
 
using System.Collections;
 
using System.Collections;
行7: 行8:
 
using UnityEngine;
 
using UnityEngine;
 
using UniRx;
 
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);
 +
    }
 +
}
 +
</pre>
 +
 +
==EveryUpdateを使った配列内のデータを検知(代替)==
 +
毎フレームごとに処理されるので危険かも。
 
public class ChangeValueListScene : MonoBehaviour
 
public class ChangeValueListScene : MonoBehaviour
 
{
 
{

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

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>