4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UnityのTouchScriptでシングルタップとダブルタップを取得する

Last updated at Posted at 2020-08-07

#概要
Unityで高機能なタッチ処理を提供してくれるTouchScriptで、シングルタップとダブルタップを取得する設定です。
別オブジェクトに設定するのは簡単ですが、同じオブジェクトがシングルタップとダブルタップの両方に対応するのは少し厄介だったので紹介します。
(公式のサンプルも別オブジェクトに設定していた・・・)

#環境
Unity 2019.2.16.f1
TouchScript 9.0

#設定方法
###Inspector設定
今回はuGUIでImageを作り、Imageがシングルタップされた時とダブルタップされた時で別の処理をします。
inspector1.png
RectTransformの値は適当

inspector2.png
TapGestureの詳細
シングルタップ用とダブルタップ用で2つのTapGestureをアタッチします。

  • シングルタップ用TapGestureの設定
    • Number of Taps RequiredをOneにする
    • Require Other Gesture to FailのチェックをONにして、Valueにダブルタップ用のTapGestureを指定する
      • ※自分の環境だとONにしてすぐコンポーネントをドラッグしてもセット出来ない謎現象が起きました
      • ※自分自身のオブジェクトをHierarchyからドラッグ、ゲームを再生してすぐ停止、コンポーネントをドラッグという謎点順で行けました・・・
  • ダブルタップ用TapGestureの設定
    • Number of Taps RequiredをTwoにする
    • Limit Timeを0.5にする
      • ダブルタップと判定するしきい値なので、ご自由に調整下さい

###スクリプト

using TouchScript.Gestures;
using UnityEngine;

// シングルタップとダブルタップの両方を取得する
public class TouchTest : MonoBehaviour
{
    [SerializeField]
    private GameObject image; // Inspectorで自分自身をセットしておく

    private TapGesture m_tapGesture;
    private TapGesture m_doubleTapGesture;

    // Awake→OnEnable→Startなので、Awakeで設定する
    // そもそもSerializeFieldでそれぞれのコンポーネントを持っててもOK
    private void Awake()
    {
        // 1つめがシングルタップ、2つめがダブルタップに反応する
        var tapGestures = image.GetComponents<TapGesture>();
        m_tapGesture = tapGestures[0];
        m_doubleTapGesture = tapGestures[1];
    }

    // メモリリークを避けるために、OnEnableで有効化してOnDisableで無効化
    private void OnEnable()
    {
        m_tapGesture.StateChanged += HandleTap;
        m_doubleTapGesture.StateChanged += HandleDoubleTap;
    }

    private void OnDisable()
    {
        m_tapGesture.StateChanged -= HandleTap;
        m_doubleTapGesture.StateChanged -= HandleDoubleTap;
    }

    // シングルタップ時のイベント
    private void HandleTap(object sender, System.EventArgs e)
    {
        if (m_tapGesture.State != Gesture.GestureState.Recognized)
        {
            return;
        }

        Debug.Log("tap");
    }

    // ダブルタップ時のイベント
    private void HandleDoubleTap(object sender, System.EventArgs e)
    {
        if (m_doubleTapGesture.State != Gesture.GestureState.Recognized)
        {
            return;
        }

        Debug.Log("doubletap");
    }
}

このスクリプトをImageオブジェクトにアタッチして、SerializeFieldにImageオブジェクト自身をセットすれば、タップとダブルタップを取得出来ると思います。

  • 一回目のタップから[Limit Time]秒経過→シングルタップイベント
  • 一回目のタップから[Limit Time]秒経過前に二回目のタップ→ダブルップイベント

になるので、Limit Timeは使いやすいと思う値に設定して下さい。

#参考文献
https://github.com/TouchScript/TouchScript/issues/217

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?