はじめに
最近Unityのコルーチンを勉強しているので、ダブルクリック処理を実装してみた。
私は記事をあまり書いたことがなく、コーディングは得意ではないので、変なところ、足りないところがあればご指摘ください。
ダブルクリックはググると以下の記事があったのですが、コルーチンでもやってみたかったので。
https://qiita.com/morio36/items/3de164d6131c902af9bd
もっと良い方法があれば教えてください。
概要
ダブルクリックの判定条件は「一定範囲内を一定時間内にクリック」すること。
それ以外はシングルクリックとして扱います。
ただし、ダブルクリック判定の前に行われた、クリックは無視します。
サンプルは、コンソールにログを表示するだけです。
ソースコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoubleClickTest : MonoBehaviour
{
//ダブルクリック受付時間
public float waitSec = 0.2f;
//ダブルクリック判定のマウスの変化量の閾値
public float mouseChangesThreshold = 10f;
WaitForSeconds waitForSecond;
Vector3 oldMousePosition;
float lastClickTime ;
float lastDoubleClickTime ;
private void Start()
{
waitForSecond = new WaitForSeconds(waitSec);
//開始直後のクリックがダブルクリック判定を受けないようにするため
lastClickTime = -waitSec;
lastDoubleClickTime = -waitSec;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
StartCoroutine(DoubleClickLog());
}
}
//ダブルクリック処理
IEnumerator DoubleClickLog()
{
var startTime = Time.unscaledTime;
//ダブルクリックなら(前のクリックから一定範囲内ないかつ一定時間内にクリックした)
if (startTime- lastClickTime < waitSec && Vector3.Distance(oldMousePosition, Input.mousePosition) < mouseChangesThreshold)
{
//最後にダブルクリックをした時刻を記録
lastDoubleClickTime = startTime;
//ダブルクリックの処理
Debug.Log("ダブルクリック");
yield break;
}
//ダブルクリックでないならマウス座標と現在の時刻を記録
oldMousePosition = Input.mousePosition;
lastClickTime = startTime;
//一定時間待つ
yield return waitForSecond;
if(startTime > lastDoubleClickTime)
{
//シングルクリックの処理
Debug.Log("シングルクリック!");
}
}
}
追記
上記のソースではTimeScaleが0のときは動きません。
WaitForSecondがTimeScaleに依存する為です。
以下の記事を参考に、実時間で動くWaitForSecondを作成して利用する必要があります。(Unity5.3以降必須)
【Unity】Time.timescale に依存しない WaitForSeconds - コガネブログ
"http://baba-s.hatenablog.com/entry/2015/12/29/150042"
*上記の元記事
カスタムコルーチン Unity Blog
"https://blogs.unity3d.com/jp/2015/12/01/custom-coroutines/"