facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(ページの作成:「 ==EveryValueChangedを使った値変更検知サンプル== IsCompletedが、trueになったときに、検知。 <pre> Observable.EveryValueChanged(sampleClient, _ =...」)
 
 
(同じ利用者による、間の2版が非表示)
行1: 行1:
 
 
==EveryValueChangedを使った値変更検知サンプル==
 
==EveryValueChangedを使った値変更検知サンプル==
 
IsCompletedが、trueになったときに、検知。
 
IsCompletedが、trueになったときに、検知。
  
 
<pre>
 
<pre>
Observable.EveryValueChanged(sampleClient, _ => _.IsCompleted)
+
Observable.EveryValueChanged(sampleClient, x => x.IsCompleted)
 
             .Subscribe(isCompleted =>
 
             .Subscribe(isCompleted =>
 
             {
 
             {
行18: 行17:
 
<pre>
 
<pre>
 
using UnityEngine;
 
using UnityEngine;
using UniRx;
+
using R3;
 
public class ChangeValueScene : MonoBehaviour
 
public class ChangeValueScene : MonoBehaviour
 
{
 
{
行33: 行32:
 
     {
 
     {
 
         var sampleClient = new SampleClient();
 
         var sampleClient = new SampleClient();
         Observable.EveryValueChanged(sampleClient, _ => _.IsCompleted)
+
         Observable.EveryValueChanged(sampleClient, x => x.IsCompleted)
 
             // .Skip(1) // 初期値を検知を飛ばしたい場合
 
             // .Skip(1) // 初期値を検知を飛ばしたい場合
 
             .Subscribe(isCompleted =>
 
             .Subscribe(isCompleted =>

2025年1月23日 (木) 16:44時点における最新版

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

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

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

EveryValueChangedを使った全体サンプル

using UnityEngine;
using R3;
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();
        Observable.EveryValueChanged(sampleClient, 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);
    }
}

注意:SampleClientが、MonoBehaviourを、継承していると反応しなくなる。其の場合は、クラス内に、MonoBehaviourを、継承しない別クラスを、作って処理すれば良い。

注意:値がListの場合、List内の値変更は検知しないっぽい。

Observable.EveryValueChangedについて

変更時だけコールバックしてるわけではなく、毎フレーム監視してるらしい。

ラムダ式で指定した値を変更のあった時にだけ通知するという、つまり変更通知のない値を変更通知付きに変換するという魔法のような(実際ベンリ!)機能です(実際は毎フレーム監視してるんで、ポーリングによる擬似的なPull→Push変換)

UniRx作者さんページ:https://neue.cc/2015/04/13_510.html