Apa yang saya coba pahami dan pelajari di sini adalah hal yang sangat mendasar: apa cara yang paling umum dan paling halus untuk membedakan dengan benar klik tunggal dan klik ganda untuk 3 tombol mouse utama di Unity, menggunakan C #?
Penekanan saya pada kata dengan benar bukan untuk apa-apa. Meskipun saya terkejut bahwa ini sepertinya belum pernah ditanyakan di situs web ini sebelumnya, tentu saja saya telah mencari dan menemukan banyak pertanyaan serupa di forum Unity dan halaman tanya jawab sendiri. Namun, seperti yang sering terjadi dengan jawaban yang diposting di sumber daya ini, mereka semua tampaknya salah atau paling tidak terlalu amatir.
Biarkan saya jelaskan. Solusi yang diajukan selalu memiliki salah satu dari dua pendekatan dan kelemahan yang sesuai:
- setiap kali klik terjadi, hitung delta waktu sejak klik terakhir dan jika lebih kecil dari ambang yang diberikan, klik ganda akan terdeteksi. Namun, solusi ini menghasilkan klik cepat yang terdeteksi sebelum klik dua kali terdeteksi, yang tidak diinginkan di sebagian besar situasi karena kemudian mengaktifkan tindakan klik tunggal dan ganda.
Contoh kasar:
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;
}
- menetapkan penundaan waktu tunggu untuk klik tunggal yang akan diaktifkan, yang berarti, pada setiap klik, hanya mengaktifkan tindakan klik tunggal jika penundaan waktu sejak klik terakhir di atas ambang yang diberikan. Namun, ini memberikan hasil yang lamban, karena menunggu sebelum dimungkinkan untuk melihat menunggu sebelum satu klik terdeteksi. Lebih buruk dari itu, solusi semacam ini menderita ketidaksesuaian antar mesin, karena tidak memperhitungkan seberapa lambat atau seberapa cepat pengaturan kecepatan klik dua kali pengguna pada level OS.
Contoh kasar:
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;
}
}
Karena itu, pertanyaan saya menjadi sebagai berikut. Apakah ada cara yang lebih halus dan dapat diandalkan untuk mendeteksi klik ganda di Unity menggunakan C #, selain solusi ini, dan yang menangani masalah yang disebutkan di atas?