Те, що я намагаюся зрозуміти і дізнатись тут, є дуже базовим: що є найбільш загальним і найбільш відполірованим способом правильної диференціації одинарних клавіш та подвійних клацань для трьох основних кнопок миші в 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 #, окрім цих рішень, і той, який вирішує вищезазначені проблеми?