我要在这里理解和学习的东西是非常基本的:使用C#正确区分Unity中3个主要鼠标按钮的单击和双击的最通用,最精致的方法是什么?
我对“ 正确 ”一词的强调并非一无是处。尽管令我感到惊讶的是,以前似乎从未在此网站上问过这个问题,但是我当然已经在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;
}
}
因此,我的问题如下。除了这些解决方案之外,还有使用C#在Unity中使用双击检测双击的更完善,更可靠的方法,并且可以解决上述问题吗?