【Unity】【UniRx】Switchオペレータの使い方

Switchオペレータの使い方です。
ちょっと複雑ですがとても便利なオペレータです。

使い方の例

次のスクリプトは、Aキーを入力した時点のフレーム数を一定間隔で表示し続けるものです。
もう一度Aキーを入力すると、一定間隔で「その時点のフレーム数」と「前回入力時のフレーム数」の両方が表示され続けます。

// Aキーを押すと、その時のフレーム数が一定間隔で表示され続ける
// もう一度押すと、その時のフレーム数と前回のフレーム数が一定間隔で表示され続ける
Observable.EveryUpdate()
  .Where(_ => Input.GetKeyDown(KeyCode.A))
  .Select(_ => Time.frameCount)
  .SelectMany(x => Observable.IntervalFrame(60).Do(_ => Debug.Log(x)))
  .Subscribe()
  .AddTo(this);

最新のクリック時だけの情報が欲しい場合、SelectManyを使う代わりにSelect + Switchを使います。
すると、最新のクリック時のフレーム数だけが表示されるようになります。

// Aキーを押すと、その時のフレーム数が一定間隔で表示され続ける
// もう一度押すと、その時のフレーム数が表示され続ける(前回のフレーム数は表示されない)
Observable.EveryUpdate()
    .Where(_ => Input.GetKeyDown(KeyCode.A))
    .Select(_ => Time.frameCount)
    .Select(x => Observable.IntervalFrame(60).Do(_ => Debug.Log(x)))
    .Switch()
    .Subscribe()
    .AddTo(this);

つまりSwitchを使うと、根元のストリームから発行された値のうち最新のもののみが有効になり、それ以外はキャンセルされます。

実用例

キャラクターの切り替え処理などに使えるようです。なるほど。

nobollel-tech.hatenablog.com

インクリメンタルサーチにも使えるようです。なるほどなるほど。

neue cc - Rxにおける並行非同期実行とリソース処理の問題