O que estou tentando entender e aprender aqui é uma coisa muito básica: qual é a maneira mais geral e mais refinada de diferenciar adequadamente cliques únicos e cliques duplos dos três botões principais do mouse no Unity, usando C #?
Minha ênfase na palavra corretamente não é à toa. Embora eu tenha ficado surpreso que isso nunca tenha sido feito neste site, é claro que pesquisei e encontrei inúmeras perguntas semelhantes nos fóruns do Unity e nas próprias páginas de perguntas e respostas do Unity. No entanto, como geralmente ocorre com as respostas postadas nesses recursos, todas pareciam estar completamente erradas ou pelo menos um pouco amadoras.
Deixe-me explicar. As soluções propostas sempre tiveram uma das duas abordagens e suas falhas correspondentes:
- toda vez que um clique acontece, calcule o delta de tempo desde o último clique e, se fosse menor que um determinado limite, um clique duplo seria detectado. No entanto, essa solução resulta em que um clique rápido é detectado antes que o clique duplo seja detectado, o que é indesejável na maioria das situações, pois ativa ações de clique único e duplo.
Exemplo aproximado:
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;
}
- defina um atraso de espera para o clique único a ser ativado, o que significa que, a cada clique, somente ative as ações de clique único se o tempo decorrido desde o último clique estiver acima de um determinado limite. No entanto, isso fornece resultados lentos, pois uma espera antes é possível notar a espera antes que os cliques únicos sejam detectados. Pior que isso, esse tipo de solução sofre discrepâncias entre as máquinas, pois não leva em conta a velocidade ou a velocidade lenta da configuração de velocidade do clique duplo do usuário no nível do sistema operacional.
Exemplo aproximado:
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;
}
}
Portanto, minhas perguntas se tornam as seguintes. Existe uma maneira mais refinada e confiável de detectar cliques duplos no Unity usando C #, além dessas soluções, e uma que lide com os problemas mencionados anteriormente?