|
|
(同じ利用者による、間の8版が非表示) |
行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>
| + | |