สิ่งที่ฉันพยายามที่จะเข้าใจและเรียนรู้ที่นี่เป็นสิ่งที่เป็นพื้นฐาน: สิ่งที่เป็นวิธีทั่วไปมากที่สุดและมากที่สุดในการขัดถูกต้องความแตกต่างคลิกเดียวและสองคลิกสำหรับ 3 ปุ่มเมาส์หลักในความสามัคคีโดยใช้ C #?
การเน้นที่คำว่าถูกต้องไม่ใช่เพื่ออะไร แม้ว่าฉันจะประหลาดใจที่สิ่งนี้ดูเหมือนจะไม่เคยถูกถามในเว็บไซต์นี้มาก่อนแน่นอนว่าฉันค้นหาและพบคำถามที่คล้ายกันมากมายในฟอรัมของ Unity และหน้าตอบคำถามของ Unity อย่างไรก็ตามเนื่องจากเป็นกรณีที่มีคำตอบที่โพสต์ไว้ในแหล่งข้อมูลเหล่านี้พวกเขาทั้งหมดดูเหมือนจะผิดธรรมดาหรืออย่างน้อยก็ชำนาญเล็กน้อย
ให้ฉันอธิบาย วิธีแก้ปัญหาที่เสนอมักจะมีสองวิธีและข้อบกพร่องที่สอดคล้องกัน:
- ทุกครั้งที่มีการคลิกเกิดขึ้นให้คำนวณเดลต้าเวลาตั้งแต่คลิกสุดท้ายและหากมีขนาดเล็กกว่าเกณฑ์ที่กำหนดระบบจะตรวจจับการคลิกสองครั้ง อย่างไรก็ตามวิธีการแก้ปัญหานี้ส่งผลให้มีการตรวจพบการคลิกครั้งเดียวอย่างรวดเร็วก่อนที่จะตรวจพบดับเบิลคลิกซึ่งไม่เป็นที่พึงปรารถนาในสถานการณ์ส่วนใหญ่เพราะจะเปิดใช้งานการกระทำทั้งคลิกเดียวและดับเบิลคลิก
ตัวอย่างหยาบ:
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;
}
- ตั้งค่าการรอคอยสำหรับการคลิกครั้งเดียวที่จะเปิดใช้งานซึ่งหมายความว่าทุกการคลิกจะเปิดใช้งานการคลิกเพียงครั้งเดียวหากการหน่วงเวลานับตั้งแต่การคลิกครั้งสุดท้ายสูงกว่าเกณฑ์ที่กำหนด อย่างไรก็ตามสิ่งนี้ให้ผลลัพธ์ที่ไม่ดีนักเนื่องจากการรอก่อนที่จะเป็นไปได้ที่จะสังเกตเห็นการรอก่อนที่จะตรวจพบการคลิกครั้งเดียว ยิ่งไปกว่านั้นโซลูชันประเภทนี้ทนทุกข์ทรมานจากความคลาดเคลื่อนในเครื่องเนื่องจากไม่ได้คำนึงถึงความช้าหรือความรวดเร็วในการตั้งค่าความเร็วดับเบิลคลิกของผู้ใช้ในระดับระบบปฏิบัติการ
ตัวอย่างหยาบ:
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;
}
}
ดังนั้นคำถามของฉันกลายเป็นดังต่อไปนี้ มีวิธีการที่น่าเชื่อถือและน่าเชื่อถือมากกว่าในการตรวจสอบการคลิกสองครั้งใน Unity โดยใช้ C # นอกเหนือจากวิธีแก้ปัญหาเหล่านี้และวิธีที่จัดการปัญหาดังกล่าวข้างต้นหรือไม่