LoginSignup
5
8

More than 5 years have passed since last update.

【UniRx】ピンチイン・アウトをちゃちゃっと作る

Last updated at Posted at 2018-04-18

みんなRxだいすき?ぼくはだいすきです
だいすきなRxでピンチイン・アウトをシンプルに使いやすくサクッと書きたかった
たぶん書けた

Rxじゃない書き方はこんな感じになります
Unityでピンチイン・ピンチアウトを実装する

ソース

PinchEventHandler.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using UniRx.Triggers;

public class PinchEventHandler : MonoBehaviour
{
    private Subject<float> onPinch = new Subject<float>();

    public IObservable<float> OnPinch { get { return onPinch; } }

    void Start()
    {
        //ピンチ終了
        var multiTapEndStream = this.UpdateAsObservable()
            .Where(_ => !MultiTapping());

        //ピンチ
        this.UpdateAsObservable()
            .Where(_ => MultiTapping()) //2箇所以上タップされている
            .Select(_ => GetMultiTapDistance()) //2点間の距離にメッセージを変換
            .Buffer(2, 1) //バッファに詰める
            .Select(distances => distances[1] - distances[0]) //前フレームとの距離の差にメッセージを変換
            .TakeUntil(multiTapEndStream) //ピンチ操作が終わったらバッファをクリアにする(TakeUntil+RepeatUntilDestory)
            .RepeatUntilDestroy(this)
            .Subscribe(delta =>
            {
                onPinch.OnNext(delta);
            });
    }

    private bool MultiTapping()
    {
        return Input.touchCount >= 2;
    }

    private float GetMultiTapDistance()
    {
        return Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
    }

}

タップしている2点間の距離をバッファに詰めて、差分をOnNextで流しています
.Bufferが超便利なお陰で、一時保存用のグローバル変数が消え去ってスッキリ

使う時には

sample
        var pinchMultiply = 0.001f; //適当に調整するなりしてください
        pinchEventHandler.OnPinch
            .Subscribe(pinchDistanceDelta =>
            {
                //ピンチで拡大・縮小
                transform.localScale += (pinchDistanceDelta * pinchMultiply) * Vector3.one;
            })
            .AddTo(this);

こんな感じでどうぞ

結論

UniRxはいいぞ

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8