Unity中鼠标的双击与长按的检测

Unity中鼠标的双击与长按的检测

在unity中,我们会遇到很多的关于鼠标的事件。虽然unity中给出了相关的点击与拖拽方法,可是这些方法只对UI和碰撞体适用。那么,如何直接用代码实现鼠标的双击与长按的检测呢?
首先我们需要几个变量,用来保存时间,以判断是长按还是点击。

private float main_time;
public  float click_time;
private float two_click_time;
private int count;

先来说说这些变量的用处。main_time主要是用来检测是点击了一次鼠标还是长按鼠标。click_time主要是检测第一次点击和第二次点击的间隔时间,已确定是不是双击。最后一个变量two_click_time主要是检测,如果先点击了一次,又连续点击两次,是不是接下来的两次为双击。count主要是用来计数鼠标点击次数。
为了检测鼠标的每一帧的动作,我们要把下面的代码放在Update中。

if (Input.GetMouseButton(0)){
   if (main_time == 0.0f){
      main_time = Time.time;
   }
   if (Time.time - main_time > 0.2f) {
       //长按时执行的动作放这里
   }
}
if (Input.GetMouseButtonUp(0))
        {
            if (Time.time - main_time < 0.2f)
            {//当鼠标抬起时,检测按下到抬起的时间,如果小于2.0f就判断为点击。
            
                if (two_twoClicks != 0 && Time.time - two_twoClicks < 0.2f)
                {
                    count = 2;
                }
                else
                {
                    count++;
                    if (count == 1)
                    {
                        click_time = Time.time;
                    }
                }
                if (count == 2
                    && ((click_time != 0 && Time.time - click_time < 0.2f) || (two_twoClicks != 0 && Time.time - two_twoClicks < 0.2f)))
                {//如果两次点击事件小于0.2f就判断为双击
                //双击时执行的代码块
                    count = 0;
                }               
                if (count == 2 && (Time.time - click_time > 0.2f || Time.time-two_twoClicks > 0.2f))
                {
                    two_twoClicks = Time.time;
                    count = 0;
                }
                main_time = 0.0f;
            }
            else
            {
                main_time = 0.0f;
            }
      }
            

在这段代码里,我使用了Input.GetMouse和Input.GetMouseUp.之所以没有使用Input.GetMouseDown是因为当我们点击一次鼠标时,会同时调用Input.GetMouse和Input.GetMouseDown,以至于无法判断是长按还是单击。所以我们可以只检测按下的时间,并根据按下的时间来判断鼠标的行为。可是这一大段代码很繁琐,理解起来比较费事,不过运行时的效果还是很不错的。


版权声明:本文为weixin_45493023原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。