2015.07.23 (Thu) Unity UniRxをつかってピンチやスワイプの処理を書いてみる その2 unity unirx ツイート raharu(仮名)(プログラマー) これがダイバージェンス1%の先の世界か。。。 前回はこんな記事を書いたところ、 Unity UniRxをつかって似非ピンチ処理を作ってみる - とあるプログラマの備忘録raharu0425.hatenablog.com Unity UniRxをつかってスワイプでカメラ移動をしてみた - とあるプログラマの備忘録raharu0425.hatenablog.com 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 }); } ふむふむ、前のソースより可読性が上がっていい感じです。 挙動も問題ないのでこっちで行ってみようと思います!