Unity UniRxをつかってピンチやスワイプの処理を書いてみる その2

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

前回はこんな記事を書いたところ、

raharu0425.hatenablog.com

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

ふむふむ、前のソースより可読性が上がっていい感じです。
挙動も問題ないのでこっちで行ってみようと思います!