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