Ce que j'essaie de comprendre et d'apprendre ici est une chose très basique: quelle est la façon la plus générale et la plus raffinée de différencier correctement les clics simples et les double-clics pour les 3 principaux boutons de la souris dans Unity, en utilisant C #?
Mon accent sur le mot correctement n'est pas pour rien. Bien que je sois surpris que cela semble n'avoir jamais été posé sur ce site Web auparavant, j'ai bien sûr cherché et trouvé de nombreuses questions similaires sur les forums d'Unity et les propres pages de questions-réponses d'Unity. Cependant, comme c'est souvent le cas avec les réponses publiées dans ces ressources, elles semblaient toutes être soit complètement fausses, soit au moins un peu trop amateures.
Laissez-moi expliquer. Les solutions proposées ont toujours eu l'une des deux approches et leurs défauts correspondants:
- chaque fois qu'un clic se produit, calculez le delta de temps depuis le dernier clic et s'il était inférieur à un seuil donné, un double clic serait détecté. Cependant, cette solution a pour résultat qu'un simple clic rapide est détecté avant que le double-clic ne soit détecté, ce qui n'est pas souhaitable dans la plupart des situations car il active alors les actions de simple et double-clic.
Exemple approximatif:
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;
}
- définissez un délai d'attente pour l'activation du simple clic, ce qui signifie qu'à chaque clic, n'activez les actions de simple clic que si le délai depuis le dernier clic est supérieur à un seuil donné. Cependant, cela donne des résultats lents, car une attente avant qu'il soit possible de remarquer l'attente avant que des clics simples ne soient détectés. Pire que cela, ce type de solution souffre de divergences entre les machines, car il ne prend pas en compte la vitesse ou la vitesse du paramètre de vitesse de double-clic de l'utilisateur au niveau du système d'exploitation.
Exemple approximatif:
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;
}
}
Par conséquent, mes questions deviennent les suivantes. Existe-t-il un moyen plus sophistiqué et plus fiable de détecter les doubles-clics dans Unity en utilisant C #, autre que ces solutions, et un autre qui gère les problèmes susmentionnés?