facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
行1: 行1:
 
==値変更検知の方法==
 
==値変更検知の方法==
ReactivePropertyでもできるが、ObserveEveryValueChangedを、使ったサンプルを紹介。ちなみに、ObserveEveryValueChangedのほうが、コードが、見た目は、わかりやすいが、前フレームと今フレームの変化をフレームごとに、判断するので負荷が高いかも。あと、1フレーム内で発生した複数回の変動は検知できない。
+
以下2つのやり方がある。
 +
*ReactiveProperty
 +
*ObserveEveryValueChanged
 +
 
 +
ObserveEveryValueChangedのほうが、コードが、見た目は、わかりやすいが、前フレームと今フレームの変化をフレームごとに、判断するので負荷が高いかも。あと、1フレーム内で発生した複数回の変動は検知できない。
  
 
参考:https://qiita.com/toRisouP/items/d0d32cf674a00f3a8427
 
参考:https://qiita.com/toRisouP/items/d0d32cf674a00f3a8427
行6: 行10:
 
参考:https://nekogeek.jp/reactive-property-vs-observe-every-value-changed/
 
参考:https://nekogeek.jp/reactive-property-vs-observe-every-value-changed/
  
==値変更検知サンプル==
+
==ObserveEveryValueChangedを使った値変更検知サンプル==
 
IsCompletedが、trueになったときに、検知。
 
IsCompletedが、trueになったときに、検知。
  
行21: 行25:
 
</pre>
 
</pre>
  
==全体サンプル==
+
==ObserveEveryValueChangedを使った全体サンプル==
 
<pre>
 
<pre>
 
using UnityEngine;
 
using UnityEngine;
 
using UniRx;
 
using UniRx;
 
 
public class ChangeValueScene : MonoBehaviour
 
public class ChangeValueScene : MonoBehaviour
 
{
 
{
行48: 行51:
 
                 Debug.Log("isCompleted=" + isCompleted);
 
                 Debug.Log("isCompleted=" + isCompleted);
 
                 Debug.Log("sampleClient.Url=" + sampleClient.Url);
 
                 Debug.Log("sampleClient.Url=" + sampleClient.Url);
 +
            })
 +
            .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.Request();
 +
        sampleClient.IsCompleted
 +
            .Subscribe(value =>
 +
            {
 +
                if (!value) return;
 +
                Debug.Log("Change IsCompleted : " + value);
 
             })
 
             })
 
             .AddTo(gameObject);
 
             .AddTo(gameObject);

2022年2月16日 (水) 22:47時点における版

値変更検知の方法

以下2つのやり方がある。

  • ReactiveProperty
  • ObserveEveryValueChanged

ObserveEveryValueChangedのほうが、コードが、見た目は、わかりやすいが、前フレームと今フレームの変化をフレームごとに、判断するので負荷が高いかも。あと、1フレーム内で発生した複数回の変動は検知できない。

参考:https://qiita.com/toRisouP/items/d0d32cf674a00f3a8427

参考:https://nekogeek.jp/reactive-property-vs-observe-every-value-changed/

ObserveEveryValueChangedを使った値変更検知サンプル

IsCompletedが、trueになったときに、検知。

sampleClient.ObserveEveryValueChanged(x => x.IsCompleted)
            .Subscribe(isCompleted =>
            {
                // 値が変更が入ると処理される
                if (!isCompleted) return;
                Debug.Log("isCompleted=" + isCompleted);
                Debug.Log("sampleClient.Url=" + sampleClient.Url);
            })
            .AddTo(gameObject);

ObserveEveryValueChangedを使った全体サンプル

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.Request();
        sampleClient.ObserveEveryValueChanged(x => x.IsCompleted)
            .Subscribe(isCompleted =>
            {
                // 値が変更が入ると処理される
                if (!isCompleted) return;
                Debug.Log("isCompleted=" + isCompleted);
                Debug.Log("sampleClient.Url=" + sampleClient.Url);
            })
            .AddTo(gameObject);
    }
}

ReactivePropertyを使った全体サンプル

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.Request();
        sampleClient.IsCompleted
            .Subscribe(value =>
            {
                if (!value) return;
                Debug.Log("Change IsCompleted : " + value);
            })
            .AddTo(gameObject);
    }
}