「Unity/UniRx/値変更検知」の版間の差分
提供: 初心者エンジニアの簡易メモ
行1: | 行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); } }