To, co próbuję zrozumieć i nauczyć się tutaj, jest bardzo podstawową rzeczą: jaki jest najbardziej ogólny i najbardziej dopracowany sposób prawidłowego rozróżnienia pojedynczych kliknięć i podwójnych kliknięć dla 3 głównych przycisków myszy w Unity przy użyciu C #?
Mój nacisk na to słowo właściwie nie jest na darmo. Chociaż byłem zaskoczony, że wydaje się, że nigdy wcześniej nie zadawano tego na tej stronie, oczywiście przeszukałem i znalazłem wiele podobnych pytań na forach Unity i na własnych stronach z odpowiedziami. Jednak, jak to często bywa z odpowiedziami zamieszczonymi w tych zasobach, wszystkie wydawały się albo błędne, albo przynajmniej nieco amatorskie.
Pozwól mi wyjaśnić. Proponowane rozwiązania zawsze miały jedno z dwóch podejść i odpowiadające im wady:
- za każdym razem, gdy nastąpi kliknięcie, obliczyć różnicę czasu od ostatniego kliknięcia, a jeśli byłby on mniejszy niż określony próg, wykryte zostanie podwójne kliknięcie. Jednak to rozwiązanie powoduje wykrycie szybkiego pojedynczego kliknięcia przed wykryciem podwójnego kliknięcia, co jest niepożądane w większości sytuacji, ponieważ wtedy aktywuje zarówno pojedyncze, jak i podwójne kliknięcie.
Szorstki przykład:
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;
}
- ustaw opóźnienie oczekiwania na aktywację pojedynczego kliknięcia, co oznacza, że przy każdym kliknięciu aktywuj akcje pojedynczego kliknięcia tylko wtedy, gdy opóźnienie od ostatniego kliknięcia przekracza określony próg. Daje to jednak powolne wyniki, ponieważ oczekiwanie przed zauważeniem oczekiwania przed wykryciem pojedynczych kliknięć. Co gorsza, w tego rodzaju rozwiązaniu występują rozbieżności między komputerami, ponieważ nie bierze ono pod uwagę szybkości i szybkości ustawienia podwójnego kliknięcia przez użytkownika na poziomie systemu operacyjnego.
Szorstki przykład:
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;
}
}
Dlatego moje pytania stają się następujące. Czy istnieje bardziej dopracowany i niezawodny sposób wykrywania podwójnych kliknięć w Unity przy użyciu C #, inny niż te rozwiązania, i taki, który radzi sobie z wyżej wymienionymi problemami?