とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

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

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

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

    }

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