facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
(同じ利用者による、間の9版が非表示)
行1: 行1:
==値変更検知の方法==
+
[[Unity/UniRx/値変更検知/方法]]
以下2つのやり方がある。
+
*ReactiveProperty
+
*ObserveEveryValueChanged
+
  
ObserveEveryValueChangedは、前フレームと今フレームの変化をフレームごとに、判断するので負荷が高いかも。あと、1フレーム内で発生した複数回の変動は検知できない。
+
[[Unity/UniRx/値変更検知/ObserveEveryValueChanged]]
ただ、ReactivePropertyはコードが、更新値に.valueをつけなくてはならないし、見た目が、わかりずらい。ObserveEveryValueChangedのほうが保守性が高いかも。
+
  
参考:https://qiita.com/toRisouP/items/d0d32cf674a00f3a8427
+
[[Unity/UniRx/値変更検知/ReactiveProperty]]
  
参考:https://nekogeek.jp/reactive-property-vs-observe-every-value-changed/
+
[[Unity/UniRx/値変更検知/配列]]
  
==ObserveEveryValueChangedを使った値変更検知サンプル==
+
[[Unity/UniRx/値変更検知/ObserveEveryValueChanged配列]]
IsCompletedが、trueになったときに、検知。
+
  
<pre>
+
[[Unity/UniRx/値変更検知/配列数]]
sampleClient.ObserveEveryValueChanged(x => x.IsCompleted)
+
            .Subscribe(isCompleted =>
+
            {
+
                // 値が変更が入ると処理される
+
                if (!isCompleted) return;
+
                Debug.Log("isCompleted=" + isCompleted);
+
                Debug.Log("sampleClient.Url=" + sampleClient.Url);
+
            })
+
            .AddTo(gameObject);
+
</pre>
+
 
+
==ObserveEveryValueChangedを使った全体サンプル==
+
<pre>
+
using UnityEngine;
+
using UniRx;
+
public class ChangeValueScene : MonoBehaviour
+
{
+
    class SampleClient
+
    {
+
        public bool IsCompleted = false;
+
        public string Url = "ttp://example.com";
+
        public void Request()
+
        {
+
            IsCompleted = true;
+
        }
+
    }
+
    void Start()
+
    {
+
        var sampleClient = new SampleClient();
+
        sampleClient.ObserveEveryValueChanged(x => x.IsCompleted)
+
            // .Skip(1) // 初期値を検知を飛ばしたい場合
+
            .Subscribe(isCompleted =>
+
            {
+
                // 値が変更が入ると処理される
+
                if (!isCompleted) return;
+
                Debug.Log("isCompleted=" + isCompleted);
+
                Debug.Log("sampleClient.Url=" + sampleClient.Url);
+
            })
+
            .AddTo(gameObject);
+
        // 5秒後に遅延実行
+
        Observable.Timer(System.TimeSpan.FromSeconds(5))
+
            .Subscribe(_ => {
+
                sampleClient.Request();
+
            }).AddTo(gameObject);
+
    }
+
}
+
</pre>
+
 
+
==ReactivePropertyを使った全体サンプル==
+
<pre>
+
using UnityEngine;
+
using UniRx;
+
public class ReactivePropertyScene : MonoBehaviour
+
{
+
    class SampleClient
+
    {
+
        public ReactiveProperty<bool> IsCompleted = new ReactiveProperty<bool>(false);
+
        public void Request()
+
        {
+
            IsCompleted.Value = true;
+
        }
+
    }
+
    void Start()
+
    {
+
        var sampleClient = new SampleClient();
+
        sampleClient.IsCompleted
+
            .Subscribe(value =>
+
            {
+
                if (!value) return;
+
                Debug.Log("Change IsCompleted : " + value);
+
            })
+
            .AddTo(gameObject);
+
        // 5秒後に遅延実行
+
        Observable.Timer(System.TimeSpan.FromSeconds(5))
+
            .Subscribe(_ => {
+
                sampleClient.Request();
+
            }).AddTo(gameObject);
+
    }
+
}
+
</pre>
+
 
+
==ObserveEveryValueChangedを使った配列内のデータを検知==
+
<pre>
+
using System.Collections;
+
using System.Collections.Generic;
+
using UnityEngine;
+
using UniRx;
+
 
+
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>
+

2023年6月25日 (日) 15:48時点における最新版

Unity/UniRx/値変更検知/方法

Unity/UniRx/値変更検知/ObserveEveryValueChanged

Unity/UniRx/値変更検知/ReactiveProperty

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

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

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