【Unity】【UniRx】Observable.DelayとObservable.Timer

UniRxのObservable.DelayとObservable.Timerについての記事です。

Observable.Delay

Observable.Delay()はストリームから値が流れてくるタイミングを遅らせます。

var observable = Observable
    .Start(() => "OnNext.")
    .DoOnSubscribe(() => Debug.Log("OnSuscribe."));

// すぐOnSuscribe.が表示され、1秒後にOnNext.が表示される
Observable
    .Delay(observable, System.TimeSpan.FromSeconds(1.0f))
    .Subscribe(Debug.Log);

あくまで流れてくるタイミングを変えるだけなので、購読自体はDelay().Subscribe()と同時に呼ばれます。

購読自体を遅らせるにはTimer

購読自体を遅らせるにはObservable.Timer()のあとにストリームをつなげるのがよさそうです。

var observable = Observable
    .Start(() => "OnNext.")
    .DoOnSubscribe(() => Debug.Log("OnSuscribe."));

// 1秒後にOnSuscribe.とOnNext.が表示される
Observable
    .Timer(System.TimeSpan.FromSeconds(1.0f))
    .SelectMany(observable)
    .Subscribe(Debug.Log);

追記_DelaySubscription

@toRisouPさんからDelaySubscriptionというオペレータを教えていただきました!(ありがとうございます..!)
これを使って下記のように書くと購読を遅らせられます。

// 1秒後にOnSuscribe.とOnNext.が表示される
var observable = Observable
    .Start(() => "OnNext.")
    .DoOnSubscribe(() => Debug.Log("OnSuscribe."))
    .DelaySubscription(System.TimeSpan.FromSeconds(1.0f))
    .Subscribe(Debug.Log);