LoginSignup
3
3

More than 3 years have passed since last update.

Unity でタッチジェスチャーの認識

Last updated at Posted at 2019-10-15

テストやデバッグ目的で、作ってるものの一部分だけ切り出してスマホでちょっと見てみよう、て時に欲しくなった奴です。

--

Unity でのタッチジェスチャーの認識、Input.GetTouch() は生の情報を取れるだけでジェスチャーの判定とかはしてくれないので、ちょっと面倒。

ガッツリと作ってるものなら既に入力周りは実装済みだろうし、逆にちょっとテスト用に~ だとアセットストアにあるような、Inspector からイベントの登録ができます! だとかはオーバーキルだし結局スクリプト必要だし。

テスト用のシーンに軽く好みのタッチ操作を実装したいって時に、C# スクリプトからすぐに使えるライブラリっぽいものが欲しい、という方にはお勧め。

出来ること

使い方

using SatorImaging.UnityTouchRecognizer; する。

TouchRecognizer に初めてアクセスしたときに初期化されるが、必要に応じて TouchRecognizer.Initialize() で明示的にイニシャライズする。

MonoBehaviour の Update() 内などで、TouchRecognizer.Update() を毎フレーム呼ぶ。

※ 今時点で .Update() は、同一フレーム内で何回呼ばれても一度しか更新しない。という処理はしていないので、複数の場所で .Update() しない。

タップ判定の閾値

時間の閾値のみでタップ距離の閾値は無し。.Get***() で距離や角度の閾値を指定出来るので必要であれば。

  • TouchRecognizer.tapCountTimeThreshold
    • タップの判定の閾値(秒)
  • TouchRecognizer.tapCountIntervalTimeThreshold
    • 複数回タップの判定になる、各タップの間隔(秒)

タップ判定

  • TouchRecognizer.IsTapped
    • タップ判定されたフレームでオンに。
  • TouchRecognizer.TapCount
    • タップの回数。インターバルの閾値次第でどんどん増えていく。
  • TouchRecognizer.TapFingerCount
    • タップ判定された時の指の数。2 本の指でタッチした状態で片方の指でタップをした場合は 2 となる。ピンチジェスチャーに割り当てた画面回転などのアクションをリセットするときに使う。

タッチしている指の数

  • TouchRecognizer.FingerCount
    • 現在タッチしている指の数。
  • TouchRecognizer.IsFingerCountChanged
    • 指の数が変わったフレームでオンに。
  • TouchRecognizer.IsFingerCountIncreased
    • 指数が増えたフレームでオンに。
  • TouchRecognizer.IsFingerCountDecreased
    • 指数が減ったフレームでオンに。

UnityEngine.Touch

タッチしていないときは TouchRecognizer.nullTouch が返ってくる。0 > Touch.fingerId なら nullTouch。

  • TouchRecognizer.FirstFinger
    • UnityEngine.Touch を直接見たい場合。
    • Touch.fingerId を追っかけてるので場合によっては .SecondFinger は存在して .FirstFinger.nullTouch の場合アリ。
  • TouchRecognizer.SecondFinger
    • UnityEngine.Touch を直接見たい場合。

タッチの継続時間

  • TouchRecognizer.TouchDuration
    • タッチの継続時間(秒)
  • TouchRecognizer.LatestTouchDuration
    • 最新のタッチの継続時間(秒)。指数が減った場合は最初のタッチの秒数に(なので、結果増える)
    • 使いどころは思い浮かばないがとりあえず用意しておいた。

ジェスチャー

ジェスチャー系のパラメーターはフリック判定で使ったりするので、.Update() するまでは直前の値を保持し続ける。

.Get***() で Threshold を指定した場合は閾値を超えた分が返ってくる。
- 例: 閾値に 100(px)を指定して 123 ピクセル動いた場合、23 が返ってくる。

--

タッチしている指が2本の場合に .SwipeVector 他、1本指のジェスチャーを取ると float.NaNVector2(float.NaN, float.NaN)int.MinValue が返ってくる。

なので、基本は .FingerCount で処理を分ける。

スワイプ

  • TouchRecognizer.SwipeVector
    • スワイプのベクトル。
  • TouchRecognizer.SwipeDeltaVector
    • スワイプの前フレームからの差分ベクトル(生値)
  • TouchRecognizer.GetSwipeVector(float distanceThreshold)
  • TouchRecognizer.GetSwipeDeltaVector(float distanceThreshold)
    • 指定した閾値(ピクセル)を超えた分のスワイプのベクトル。

フリック

フリックした後、カメラがスーーーっと止まる、をやろうとすると、ベクトルの減衰処理が必要だったりなので、機能を追加予定。

今時点でのフリック判定は、指数が減ったフレーム(.IsFingerCountDecreased)で、.FingerCount が望みの数の時に .SwipeDeltaVector 等の .magnitude が閾値を超えていたら .SwipeVector.SwipeDeltaVector を使って良い感じにする、で出来る(ハズ

ピンチ(拡大・縮小)

  • TouchRecognizer.PinchLength
    • ピンチの長さ(px)。縮めるジェスチャーだとマイナスの値。
  • TouchRecognizer.PinchDeltaLength
    • 前フレームからの差分。
  • TouchRecognizer.GetPinchLength(float lengthThreshold)
  • TouchRecognizer.GetPinchDeltaLength(float lengthThreshold)
    • ピンチジェスチャーの長さ(w/閾値指定)

ピンチ(回転)

  • TouchRecognizer.PinchAngle
    • ピンチで回した角度(反時計回り、度数でラジアンではない)
  • TouchRecognizer.PinchDeltaAngle
    • デルタ。
  • TouchRecognizer.GetPinchAngle(float angleThresholdInDegrees)
  • TouchRecognizer.GetPinchDeltaAngle(float angleThresholdInDegrees)
    • 閾値指定。

ピンチ(スワイプ)

  • TouchRecognizer.PinchVector
    • 2本指でのスワイプのベクトル。ピンチの拡縮や回転ではあまり反応しない(が全く無反応というわけではない)。
    • 2本指を同じ方向にスワイプした時のジェスチャを取る場合に使う。
  • TouchRecognizer.PinchDeltaVector
    • Δ
  • TouchRecognizer.GetPinchVector(float distanceThreshold)
  • TouchRecognizer.GetPinchDeltaVector(float distanceThreshold)
    • 閾値。

こちらから

3
3
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
3
3