「Unity/UniRx/値変更検知/ObserveEveryValueChanged」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→ObserveEveryValueChangedを使った全体サンプル) |
|||
(同じ利用者による、間の3版が非表示) | |||
行4: | 行4: | ||
<pre> | <pre> | ||
− | sampleClient.ObserveEveryValueChanged( | + | sampleClient.ObserveEveryValueChanged(_ => _.IsCompleted) |
.Subscribe(isCompleted => | .Subscribe(isCompleted => | ||
{ | { | ||
行33: | 行33: | ||
{ | { | ||
var sampleClient = new SampleClient(); | var sampleClient = new SampleClient(); | ||
− | sampleClient.ObserveEveryValueChanged( | + | sampleClient.ObserveEveryValueChanged(_ => _.IsCompleted) |
// .Skip(1) // 初期値を検知を飛ばしたい場合 | // .Skip(1) // 初期値を検知を飛ばしたい場合 | ||
.Subscribe(isCompleted => | .Subscribe(isCompleted => | ||
行52: | 行52: | ||
</pre> | </pre> | ||
− | + | 注意:SampleClientが、MonoBehaviourを、継承していると反応しなくなる。其の場合は、クラス内に、MonoBehaviourを、継承しない別クラスを、作って処理すれば良い。 | |
+ | |||
+ | 注意:値がListの場合、List内の値変更は検知しないっぽい。 | ||
+ | |||
+ | == ObserveEveryValueChangedについて== | ||
+ | 変更時だけコールバックしてるわけではなく、毎フレーム監視してるらしい。 | ||
+ | <pre> | ||
+ | ラムダ式で指定した値を変更のあった時にだけ通知するという、つまり変更通知のない値を変更通知付きに変換するという魔法のような(実際ベンリ!)機能です(実際は毎フレーム監視してるんで、ポーリングによる擬似的なPull→Push変換) | ||
+ | </pre> | ||
+ | UniRx作者さんページ:https://neue.cc/2015/04/13_510.html |
2023年8月23日 (水) 17:57時点における最新版
ObserveEveryValueChangedを使った値変更検知サンプル
IsCompletedが、trueになったときに、検知。
sampleClient.ObserveEveryValueChanged(_ => _.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.ObserveEveryValueChanged(_ => _.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内の値変更は検知しないっぽい。
ObserveEveryValueChangedについて
変更時だけコールバックしてるわけではなく、毎フレーム監視してるらしい。
ラムダ式で指定した値を変更のあった時にだけ通知するという、つまり変更通知のない値を変更通知付きに変換するという魔法のような(実際ベンリ!)機能です(実際は毎フレーム監視してるんで、ポーリングによる擬似的なPull→Push変換)
UniRx作者さんページ:https://neue.cc/2015/04/13_510.html