Was ich hier zu verstehen und zu lernen versuche, ist eine sehr grundlegende Sache: Was ist die allgemeinste und ausgefeilteste Methode, um Einzel- und Doppelklicks für die 3 wichtigsten Maustasten in Unity mit C # richtig zu unterscheiden?
Meine Betonung auf dem Wort richtig ist nicht umsonst. Obwohl ich überrascht war, dass dies auf dieser Website anscheinend noch nie gestellt wurde, habe ich natürlich zahlreiche ähnliche Fragen in den Foren von Unity und auf den Frage-Antwort-Seiten von Unity gesucht und gefunden. Wie es jedoch häufig bei Antworten in diesen Ressourcen der Fall ist, schienen sie alle entweder einfach falsch oder zumindest ein bisschen zu amateurhaft zu sein.
Lassen Sie mich erklären. Die vorgeschlagenen Lösungen hatten immer einen der beiden Ansätze und die entsprechenden Mängel:
- Berechnen Sie bei jedem Klick das Zeit-Delta seit dem letzten Klick. Wenn es kleiner als ein bestimmter Schwellenwert ist, wird ein Doppelklick erkannt. Diese Lösung führt jedoch dazu, dass ein schneller Einzelklick erkannt wird, bevor der Doppelklick erkannt wird, was in den meisten Situationen unerwünscht ist, da dann sowohl Einzelklick- als auch Doppelklickaktionen aktiviert werden.
Grobes Beispiel:
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;
}
- Legen Sie eine Wartezeit für die Aktivierung des Einzelklicks fest. Dies bedeutet, dass bei jedem Klick nur dann Einzelklickaktionen aktiviert werden, wenn die Zeitverzögerung seit dem letzten Klick einen bestimmten Schwellenwert überschreitet. Dies führt jedoch zu schleppenden Ergebnissen, da ein Warten, bevor es möglich ist, das Warten zu bemerken, bevor Einzelklicks erkannt werden. Schlimmer noch, diese Art von Lösung weist maschinenübergreifende Diskrepanzen auf, da nicht berücksichtigt wird, wie langsam oder wie schnell die Doppelklickgeschwindigkeitseinstellung des Benutzers auf Betriebssystemebene ist.
Grobes Beispiel:
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;
}
}
Daher werden meine Fragen wie folgt. Gibt es eine bessere und zuverlässigere Methode zum Erkennen von Doppelklicks in Unity mithilfe von C # als diese Lösungen und eine, mit der die oben genannten Probleme behoben werden können?