Quello che sto cercando di capire e imparare qui è una cosa molto semplice: qual è il modo più generale e più raffinato per farlo correttamente differenziare i clic singoli e doppi per i 3 pulsanti principali del mouse in Unity, usando C #?
La mia enfasi sulla parola corretta non è per niente. Anche se sono rimasto sorpreso dal fatto che questo non sia mai stato chiesto in questo sito Web prima, ovviamente ho cercato e trovato numerose domande simili sui forum di Unity e sulle pagine di domande e risposte di Unity. Tuttavia, come spesso accade con le risposte pubblicate in queste risorse, sembravano tutte o semplicemente sbagliate o almeno un po 'troppo amatoriali.
Lasciatemi spiegare. Le soluzioni proposte hanno sempre avuto uno dei due approcci e i relativi difetti:
- ogni volta che si verifica un clic, calcolare il delta temporale dall'ultimo clic e se fosse inferiore a una determinata soglia, verrà rilevato un doppio clic. Tuttavia, questa soluzione comporta il rilevamento di un singolo clic rapido prima che venga rilevato il doppio clic, il che è indesiderabile nella maggior parte dei casi perché attiva quindi le azioni sia a singolo clic che a doppio clic.
Esempio approssimativo:
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;
}
- impostare un ritardo di attesa per l'attivazione del singolo clic, il che significa che, ad ogni clic, attivare le azioni del singolo clic solo se il ritardo dall'ultimo clic è superiore a una determinata soglia. Tuttavia, ciò fornisce risultati lenti, poiché è necessario attendere prima che sia possibile notare l'attesa prima che vengano rilevati i clic singoli. Peggio ancora, questo tipo di soluzione soffre di discrepanze tra le macchine, dal momento che non tiene conto di quanto sia lenta o veloce l'impostazione della velocità del doppio clic dell'utente a livello di sistema operativo.
Esempio approssimativo:
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;
}
}
Pertanto, le mie domande diventano le seguenti. Esiste un modo più accurato e affidabile per rilevare i doppi clic in Unity utilizzando C #, oltre a queste soluzioni, e uno che gestisce i problemi di cui sopra?