UniRx: Delay

Observable.Delay() は通知データを好きな期間だけ遅らせることができるオペレータです。

using System;
using UniRx;
using UnityEngine;

public class Main : MonoBehaviour {
    void Start()
    {
        Debug.Log("Start");
        
        var s = Observable.Range(10, 3).Delay(TimeSpan.FromSeconds(3));
        s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnCompleted"));
    }
}

実行結果です。

[23:37:05:728] Start
[23:37:08:996] e: 10
[23:37:09:010] e: 11
[23:37:09:027] e: 12
[23:37:09:043] OnCompleted

通知される 3 つのデータはほぼ同時刻に通知されていますが、 Start() 実行後に 3 秒遅れてからログ出力されています。

Observable.Range の要素ごとに Delay を入れてみる

void Start()
{
  var s = Observable.Range(1, 3)
    .SelectMany(e => Observable.Return(e).Delay(TimeSpan.FromSeconds(e)));

  s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnCompleted"));
}

実行結果です。

[22:37:58:674] e: 1
[22:37:59:668] e: 2
[22:38:00:679] e: 3
[22:38:00:695] OnCompleted

1 秒感覚で通知されていますね。

以下のように delay time を変更すると、出力が逆順になります。

void Start()
{
  var s = Observable.Range(1, 3)
    .SelectMany(e => Observable.Return(e).Delay(TimeSpan.FromSeconds(5 - e)));
  s.Subscribe(e => Debug.Log("e: " + e), () => Debug.Log("OnComplete"));
}

実行結果です。

[20:49:47:409] e: 3
[20:49:48:398] e: 2
[20:49:49:393] e: 1
[20:49:49:409] OnComplete

参考