#概要
Unityで高機能なタッチ処理を提供してくれるTouchScriptで、シングルタップとダブルタップを取得する設定です。
別オブジェクトに設定するのは簡単ですが、同じオブジェクトがシングルタップとダブルタップの両方に対応するのは少し厄介だったので紹介します。
(公式のサンプルも別オブジェクトに設定していた・・・)
#環境
Unity 2019.2.16.f1
TouchScript 9.0
#設定方法
###Inspector設定
今回はuGUIでImageを作り、Imageがシングルタップされた時とダブルタップされた時で別の処理をします。
RectTransformの値は適当
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は使いやすいと思う値に設定して下さい。