search
LoginSignup
11

More than 3 years have passed since last update.

posted at

updated at

Organization

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からドラッグして設定しておいてください。

1.PNG

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

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


参照した記事

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

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
What you can do with signing up
11