【Unity】【UniRx】TakeXxx系のオペレータまとめ

UniRxのTakeXxx系のオペレータをまとめました。

Take

Take()は引数に与えた回数だけストリームを流します。
終了した時点でOnCompleteが呼ばれます。

// Takeの回数だけOnNext()を呼んで、回数分終わったらOnComplete
Observable
    .Interval(System.TimeSpan.FromSeconds(1.0f))
    .Take(3)
    .Subscribe(i => Debug.Log(i), () => Debug.Log("OnComplete."));

TakeUntil

TakeUntil()は引数に与えたObservableのOnNext()が流れるまでストリームを流します。
引数に与えたObservableのOnNext()が流れた時点でOnCompleteが呼ばれます。
またその時点で引数のObservableはDisposeされます。

// TakeUntilの引数のObservableのOnNext()が流れたら終了するObservable
// その時引数のObservableはDisposeされる
 Observable
    .Interval(System.TimeSpan.FromSeconds(1.0f))
    .TakeUntil
    (
        // 何かしらのインプットを通知するObservable
        Observable
            .EveryUpdate()
            .Where(_ => Input.anyKeyDown)
            .DoOnSubscribe(() => Debug.Log("Input Observable : On Subscribe"))
            .DoOnTerminate(() => Debug.Log("Input Observable : On Terminate"))
            .DoOnCancel(() => Debug.Log("Input Observable : On Cancel."))
    )
    .Subscribe(i => Debug.Log(i), () => Debug.Log("OnComplete."));

TakeLast

最後のN個だけストリームを流します。

// 最後のN個だけ流す
// 出力は7, 8, 9
Observable.Range(0, 10)
    .TakeLast(3)
    .Subscribe(i => Debug.Log(i), () => Debug.Log("OnComplete."));

TakeWhile

引数の条件式がtrueの間だけストリームを流します。

// 条件式に合っている間だけ流す
// 判定時、条件に合っていなかったらOnNextは流さずOnCompleteのみ行う
Observable.Interval(System.TimeSpan.FromSeconds(1.0f))
    .TakeWhile(i => i < 10.0f)
    .Subscribe(i => Debug.Log(i), () => Debug.Log("OnComplete."));

TakeUntilDestroy

指定したGameObjectやコンポーネントが破棄されるまでストリームを流します。

Observable.Interval(System.TimeSpan.FromSeconds(1.0f))
    .TakeUntilDestroy(gameObject)
    .Subscribe(i => Debug.Log(i), () => Debug.Log("OnComplete."));

TakeUntilDisable

指定したGameObjectやコンポーネントが非アクティブになるまでストリームを流します。

// 条件式に合っている間だけ流す
// 判定時、条件に合っていなかったらOnNextは流さずOnCompleteのみ行う
Observable.Interval(System.TimeSpan.FromSeconds(1.0f))
    .TakeUntilDisable(gameObject)
    .Subscribe(i => Debug.Log(i), () => Debug.Log("OnComplete."));