То, что я пытаюсь понять и изучить здесь, является очень простой вещью: каков наиболее общий и наиболее удобный способ правильно различать одиночные и двойные щелчки для 3 основных кнопок мыши в Unity с использованием C #?
Мой акцент на слове правильно не зря. Хотя я был удивлен, что об этом, кажется, никогда раньше не спрашивали на этом сайте, конечно, я искал и нашел множество похожих вопросов на форумах Unity и собственных страницах вопросов-ответов Unity. Однако, как это часто бывает с ответами, размещенными на этих ресурсах, все они казались либо просто ошибочными, либо, по крайней мере, слишком любительскими.
Позволь мне объяснить. Предлагаемые решения всегда имели один из двух подходов и соответствующие им недостатки:
- каждый раз, когда происходит щелчок, вычисляют дельту времени с момента последнего щелчка, и если он был меньше заданного порога, будет обнаружен двойной щелчок. Однако это решение приводит к тому, что быстрый одиночный щелчок обнаруживается до того, как обнаружен двойной щелчок, что нежелательно в большинстве ситуаций, потому что тогда он активирует действия как одиночного, так и двойного щелчка.
Грубый пример:
float dclick_threshold = 0.25f;
double timerdclick = 0;
if (Input.GetMouseButtonDown(0)
{
if (Time.time - timerdclick) > dclick_threshold)
{
Debug.Log("single click");
//call the SingleClick() function, not shown
} else {
Debug.Log("double click");
//call the DoubleClick() function, not shown
}
timerdclick = Time.time;
}
- установить задержку ожидания для активации одним щелчком, что означает, что при каждом щелчке активировать действия одним щелчком можно только в том случае, если задержка с момента последнего щелчка превышает заданный порог. Однако это дает вялые результаты, поскольку ожидание до того, как можно заметить ожидание, прежде чем будут обнаружены одиночные щелчки. Хуже того, этот тип решения страдает от расхождений между машинами, поскольку он не учитывает, насколько медленным или быстрым является установка скорости двойного щелчка пользователя на уровне операционной системы.
Грубый пример:
float one_click = false;
float dclick_threshold = 0.25f;
double timerdclick = 0;
if (one_click && ((Time.time - timerdclick) > dclick_threshold))
{
Debug.Log("single click");
//call the SingleClick() function, not shown
one_click = false;
}
if (Input.GetMouseButtonDown(0))
{
if (!one_click)
{
dclick = -1;
timerdclick = Time.time;
one_click = true;
}
else if (one_click && ((Time.time - timerdclick) < dclick_threshold))
{
Debug.Log("double click");
//call the DoubleClick() function, not shown
one_click = false;
}
}
Поэтому мои вопросы становятся следующими. Существует ли более совершенный и надежный способ обнаружения двойных щелчков в Unity с использованием C #, помимо этих решений, и способ, который решает вышеупомянутые проблемы?