参考記事
Unityにおけるコルーチンの省メモリと高速化について、或いはUniRx 5.3.0でのその反映
初期値がプッシュされる例
初期値がプッシュされる例
using UnityEngine;
using UniRx;
public class Example : MonoBehaviour
{
private readonly IntReactiveProperty _count = new IntReactiveProperty();
private void Start()
{
_count
.Subscribe(count => Debug.Log(count))
.AddTo(gameObject);
_count.Value = 1;
}
}
出力結果
初期値がプッシュされないSkipLatestValueOnSubscribeを利用する例
初期値がプッシュされないSkipLatestValueOnSubscribeを利用する例
using UnityEngine;
using UniRx;
public class Example : MonoBehaviour
{
private readonly IntReactiveProperty _count = new IntReactiveProperty();
private void Start()
{
_count
.SkipLatestValueOnSubscribe()
.Subscribe(count => Debug.Log(count))
.AddTo(gameObject);
_count.Value = 1;
}
}
出力結果
SkipLatestValueOnSubscribeの実装
SkipLatestValueOnSubscribeの実装
public static IObservable<T> SkipLatestValueOnSubscribe<T>(this IReadOnlyReactiveProperty<T> source)
{
return source.HasValue ? source.Skip(1) : source;
}
まとめ
Rx.NET用のReactivePropertyでは、コンストラクタでReactiveProeprtyModeとして
None | RaiseLatestValueOnSubscribe | DistinctUntilChanged を指定できるようなデザインを選んでいるのですが
(というのも、Viewにデータバインディングするため構築時の初期値はnullであることが確定しているという
シチュエーションが割とあるため)
UniRxのReactivePropertyではSubscribe側が選ぶというデザインにしています。
UniRxにはSubscribeToTextやSubscribeToInteractableなど
流れるように記述可能な拡張メソッドが定義されていて素晴しいですね。