Lo que estoy tratando de entender y aprender aquí es algo muy básico: ¿cuál es la forma más general y pulida de diferenciar adecuadamente los clics simples y dobles para los 3 botones principales del mouse en Unity, usando C #?
Mi énfasis en la palabra correctamente no es para nada. Aunque me sorprendió que esto nunca haya sido preguntado en este sitio web, por supuesto, he buscado y encontrado numerosas preguntas similares en los foros de Unity y en las propias páginas de preguntas y respuestas de Unity. Sin embargo, como suele ser el caso con las respuestas publicadas en estos recursos, todos parecían estar completamente equivocados o al menos un poco demasiado aficionados.
Dejame explicar. Las soluciones propuestas siempre tuvieron cualquiera de los dos enfoques y sus defectos correspondientes:
- cada vez que ocurre un clic, calcule el delta de tiempo desde el último clic y si fuera más pequeño que un umbral dado, se detectaría un doble clic. Sin embargo, esta solución da como resultado que se detecte un solo clic rápido antes de que se detecte el doble clic, lo que no es deseable en la mayoría de las situaciones porque luego activa las acciones tanto de un solo clic como de doble clic.
Áspero ejemplo:
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;
}
- establezca un retraso de espera para que se active el clic único, lo que significa que, con cada clic, solo active las acciones de un solo clic si el tiempo transcurrido desde el último clic supera un umbral determinado. Sin embargo, esto da resultados lentos, ya que esperar antes de que sea posible notar la espera antes de que se detecten los clics únicos. Peor que eso, este tipo de solución adolece de discrepancias entre las máquinas, ya que no tiene en cuenta qué tan lenta o rápida es la configuración de velocidad de doble clic del usuario en el nivel del sistema operativo.
Áspero ejemplo:
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;
}
}
Por lo tanto, mis preguntas se convierten en lo siguiente. ¿Existe una forma más pulida y confiable de detectar los clics dobles en Unity usando C #, aparte de estas soluciones, y una que maneje los problemas antes mencionados?