Onoty3D

Unityに関するメモとか

Rxに入門

昨日の"ふくてん(Fukuoka.NET)"でLTした内容を若干加筆してSlideShareにUPしました。

www.slideshare.net

スライド中のダブルクリック処理について、少し解説します。
ソースはこちら。

this.UpdateAsObservable()
  .Where(_ => Input.GetMouseButtonDown(0)) //マウスダウンを抽出
  .TimeInterval() //前回からの経過時間を付与
  .Skip(1) //最初のクリックは無視
  .First(x => x.Interval.TotalMilliseconds <= 500) //前マウスダウンからの経過時間が500ms以内
  .RepeatUntilDisable(this.gameObject) //処理が終わったらRepeat
  .Subscribe(x => Debug.Log("★★double click : Rx"));

Rxに入門して間もない状態でのソースですので、突っ込みどころがあるかもしれません。
また、単純に時間差でダブルクリック判定するだけでなく、以下の仕様を盛り込んでいます。

・3連続でクリックした場合、1,2回目のクリックだけをダブルクリックとして処理する。
(2,3回目はダブルクリックとして処理しない)

・4連続でクリックした場合、1,2回目のクリック、3,4回目のクリックをそれぞれダブルクリックとして処理する。
(2,3回目はダブルクリックとして処理しない、ダブルクリックとしての検出は2回。)

前者に関しては、時間差を判定する部分をWhereではなくFirstにすることで対応しています。
初回のダブルクリックだけを抜き出す感じです。

後者に関してはRepeatを使うことで、Firstで完了したSubscribeを繰り返しています。
1,2回目のクリックによるダブルクリックをFirstで検出したあと、3,4回目のクリックによるダブルクリックを再度Firstで検出している感じです。
なお、単純なRepeatではなくRepeatUntilDisableにしているのは、プログラム終了時にエラーが発生するのを防ぐためです。
(Repeatだと終了時に空のメッセージに対するFirstの評価が行われてエラーになる。)

今後もRx学んでいって、達者になっていきたいと思います。