Rxに入門
昨日の"ふくてん(Fukuoka.NET)"でLTした内容を若干加筆してSlideShareにUPしました。
Rxに入門しようとしている from onotchi_
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学んでいって、達者になっていきたいと思います。