UniRxを使ったフリック検出
以前にもフリック検出するストリームを書きたいと思って取り組んだことがあったが、その際のやつはどうにも綺麗にまとまらなかった。
Downされてから一定時間以内にUpしないものは検出しない、という条件を落としこむのに苦戦したんだったかな。
ふと思い立って再挑戦してみたが、今回のはわりと綺麗にまとまったように思う。
ポイントはSelectManyの部分だと思うけど、うまく説明できるほど理解しきれてもいないんだよなぁ。
var start = this.UpdateAsObservable() .Where(_ => Input.GetMouseButtonDown(0)) .Select(_ => Input.mousePosition); var end = this.UpdateAsObservable() // 一定時間以内にUpされないと検出しない .TakeUntil(Observable.Timer(TimeSpan.FromSeconds(1))) .Where(_ => Input.GetMouseButtonUp(0)) .Select(_ => Input.mousePosition) .Take(1); start.SelectMany(startPos => end.Select(endPos => startPos - endPos)) .Subscribe(v => { // 一定距離以上動かさないとクリック扱い if (v.magnitude < 50) { Debug.Log("Click"); } else if (Math.Abs(v.x) > Mathf.Abs(v.y)) { if (v.x > 0) { Debug.Log("Left"); } else { Debug.Log("Right"); } } else { if (v.y > 0) { Debug.Log("Down"); } else { Debug.Log("Up"); } } });