Điều tôi đang cố gắng hiểu và tìm hiểu ở đây là một điều rất cơ bản: cách tổng quát nhất và lịch sự nhất để phân biệt chính xác các lần nhấp chuột và nhấp đúp cho 3 nút chuột chính trong Unity, sử dụng C # là gì?
Tôi nhấn mạnh vào từ đúng cách không phải là không có gì. Mặc dù tôi rất ngạc nhiên vì điều này dường như chưa bao giờ được hỏi trong trang web này trước đó, tất nhiên tôi đã tìm kiếm và tìm thấy rất nhiều câu hỏi tương tự trên các diễn đàn của Unity và các trang câu hỏi của riêng Unity. Tuy nhiên, vì nó thường là trường hợp với câu trả lời được đăng trong các tài nguyên này, tất cả chúng dường như đều sai hoặc ít nhất là hơi quá nghiệp dư.
Hãy để tôi giải thích. Các giải pháp đề xuất luôn có một trong hai cách tiếp cận và sai sót tương ứng của chúng:
- mỗi lần nhấp chuột xảy ra, hãy tính thời gian delta kể từ lần nhấp cuối cùng và nếu nó nhỏ hơn một ngưỡng nhất định, một lần nhấp đúp sẽ được phát hiện. Tuy nhiên, giải pháp này dẫn đến việc phát hiện một lần nhấp nhanh trước khi nhấp đúp chuột, điều này là không mong muốn trong hầu hết các tình huống vì sau đó nó kích hoạt cả hành động nhấp chuột đơn và nhấp đúp.
Ví dụ thô sơ:
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;
}
- đặt độ trễ chờ cho một lần nhấp được kích hoạt, có nghĩa là, tại mỗi lần nhấp, chỉ kích hoạt các hành động nhấp chuột đơn nếu thời gian trễ kể từ lần nhấp cuối cùng vượt quá ngưỡng cho phép. Tuy nhiên, điều này mang lại kết quả chậm chạp, vì chờ đợi trước khi có thể nhận thấy sự chờ đợi trước khi phát hiện một lần nhấp chuột. Tồi tệ hơn thế, loại giải pháp này chịu sự khác biệt giữa các máy, vì nó không tính đến việc cài đặt tốc độ nhấp đúp của người dùng ở cấp độ hệ điều hành chậm như thế nào.
Ví dụ thô sơ:
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;
}
}
Do đó, câu hỏi của tôi trở thành như sau. Có cách nào đáng tin cậy và đáng tin cậy hơn để phát hiện các nhấp chuột đôi trong Unity bằng C #, ngoài các giải pháp này và một giải pháp xử lý các vấn đề đã nói ở trên không?