読者です 読者をやめる 読者になる 読者になる

unity study

Unityでサクッとモックを作れるようになることを目指して、基本的なテクニックを抑えていく過程を残すブログのつもりだったけど、今はただ自分のトラブルシューティングメモになってるブログ

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");
			}
		}
	});