Unity UniRxをつかってピンチやスワイプの処理を書いてみる その2
前回はこんな記事を書いたところ、
Bufferつかった方がらくですよー!とお告げをいただきましたので、つかってみました。
Bufferとは引数分コレクションが溜まったらSubscribeするという便利機能らしいので
前回の機能をかきなおしてみました。
スワイプ
public void MapSwipe() { #if UNITY_EDITOR var drug = Observable.EveryUpdate ().Select (pos => Input.mousePosition); var stop = Observable.EveryUpdate ().Where(_ => Input.GetMouseButtonUp(0)).First(); #elif UNITY_IOS || UNITY_ANDROID var drug = Observable.EveryUpdate ().Select (pos => Input.GetTouch(0).position); var stop = Observable.EveryUpdate ().Where(_ => Input.touchCount != 1).First(); #endif IDisposable onDrug = drug.Buffer (3) .TakeUntil(stop) .Subscribe (colPos => { float delPosx = colPos.Last().x - colPos.First().x; float delPosz = colPos.Last().y - colPos.First().y; float Speed = 0 -(5 * (MainCamera.fieldOfView / 60)); MainCamera.gameObject.GetComponent<Rigidbody>().velocity = new Vector3(delPosx, 0, delPosz) * Speed; }); }
ピンチ
public void MapPinch() { #if UNITY_EDITOR var pinch = Observable.EveryUpdate ().Select (pos_dist => Input.mousePosition.x); var stop = Observable.EveryUpdate ().Where(_ => Input.GetMouseButtonUp(0)).First(); #elif UNITY_IOS || UNITY_ANDROID var pinch = Observable.EveryUpdate () .Select (pos_dist => Vector2.Distance(Input.GetTouch (0).position, Input.GetTouch (1).position)); var stop = Observable.EveryUpdate ().Where (_ => Input.touchCount != 2).First(); #endif IDisposable onPinch = pinch.Buffer(3) .TakeUntil(stop) .Subscribe(distanceParam => { float diff = distanceParam.Last() - distanceParam.First(); #if UNITY_EDITOR MainCamera.fieldOfView -= diff; #elif UNITY_IOS || UNITY_ANDROID MainCamera.fieldOfView -= diff / 10; #endif }); }
ふむふむ、前のソースより可読性が上がっていい感じです。
挙動も問題ないのでこっちで行ってみようと思います!