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

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

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

raharu0425.hatenablog.com

raharu0425.hatenablog.com

Bufferつかった方がらくですよー!とお告げをいただきましたので、つかってみました。

Bufferとは引数分コレクションが溜まったらSubscribeするという便利機能らしいので
前回の機能をかきなおしてみました。

スワイプ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;

    });
}

ピンチ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   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
            });

    }

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