Unityでシングルクリック(タップ)/ダブルクリック(タップ)のイベントを使い分ける


Unityで
・シングルタップするとオブジェクトを大きくする
・ダブルタップするとオブジェクトを小さくする
という極めて単純な処理を実装しようと色々調べましたが、
有償のアセットを購入しない限り、単純には実装できない模様ということが判明(調査が不足しているだけかもしれません)。

調べながらなんとか実装には成功したので、その手順をまとめます。


まず最初に困ったこと。

Touch.tapCountやEvent.clickCountを使用すれば
タップされた回数は取得できるのですが、
冒頭に記載したようにシングルタップ、ダブルタップで処理を出し分けたい場合に

void OnGUI() {
    Event e = Event.current;
    if (Input.GetButtonDown ("Fire1")) {
        if (e.clickCount > 1) {
            オブジェクトを小さくする処理();
        } else {
            オブジェクトを大きくする処理();
        }
    }

のように記載すると、
シングルタップであれば
 1.オブジェクトが大きくなる処理を実行
でOKなのですが、
ダブルタップの場合に
 1.オブジェクトが大きくなる処理を実行
 2.オブジェクトが小さくなる処理を実行
と、ダブルタップの1回目で処理が即実行されてしまい、
求めた結果である「オブジェクトが小さくなる」になりませんでした
(1回大きくなり、1回小さくなり、結果元通りのサイズになってしまう)。


対応

そこで調べた結果、「一定時間内にタップされた回数をカウントし、1回か2回以上かで処理を分ける」という実装に落ち着きました。
#かなり探したのですが、Unityの標準ライブラリにはこのような処理が無さそうだったので。
実装例:

using UnityEngine;
using System.Collections;
public class TestClass : MonoBehaviour {
    public GameObject myObj; //サイズを変更する対象
    private bool isDoubleTapStart; //タップ認識中のフラグ
    private float doubleTapTime; //タップ開始からの累積時間
    // Update関数
    void Update () {
        // double tap
        if (isDoubleTapStart){
            doubleTapTime += Time.deltaTime;
            if (doubleTapTime < 0.2f) {
                if (Input.GetMouseButtonDown (0)) {

                    isDoubleTapStart = false;
                    ChangeSize (true);
                    doubleTapTime = 0.0f;
                }
            } else {

                 ChangeSize (false);
                 // reset
                 isDoubleTapStart = false;
                 doubleTapTime = 0.0f;
            }
        } else {
            if (Input.GetMouseButtonDown (0)) {

                isDoubleTapStart = true;
            }
        }
    }
    //シングルタップの場合は拡大、ダブルタップの場合は縮小するメソッド
    void ChangeSize (bool isDoubleClick) {
        float x = myObj.GetComponent<Transform> ().localScale.x;
        float y = myObj.GetComponent<Transform> ().localScale.y;
        float z = myObj.GetComponent<Transform> ().localScale.z;
        if (isDoubleClick) {
            transform.localScale = new Vector3 (x / 1.1f, y / 1.1f, z / 1.1f);
        } else {
            transform.localScale = new Vector3 (x * 1.1f, y * 1.1f, z * 1.1f);
        }
    }
}

myObjには拡大/縮小したいオブジェクトをHierarchyからドラッグして設定しておいてください。

最初にタップされてから0.2秒間は待機し、その間に追加のタップがあれば
ダブルタップと判断して縮小処理を行います。
追加のタップが無ければシングルタップと判断し、拡大処理を行います。

Input.GetMouseButtonDown (0)でのイベント検知ですが、
Unity Gameビューでのマウスクリックも、Android端末上のタップも
いずれも問題なく動くことを確認済みです。


参照した記事

お手軽ダブルタップ Unity - 万年素人からGeekへの道