在开发游戏和交互式应用程序时,经常需要对用户的鼠标点击进行准确的响应。其中,单击和双击事件的判断是常见需求之一。本文将介绍如何在Unity中优雅地实现鼠标单双击判断,使代码结构清晰、易读、易维护。
背景
在许多项目中,我们需要监测用户的鼠标点击事件,并根据单击和双击分别触发不同的操作。过去的实现方式可能会显得有些繁琐,而我们将展示一种更为简便的方法,使代码看起来更加清晰。
简单而有效的实现
首先,让我们看一下基本的鼠标点击检测实现:
cs
float time1 = 0;
Action LeftMouseDownAction;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (Time.realtimeSinceStartup - time1 < ConstVariable.MouseClickJudgeDelayTimer)
{
// 处理双击事件
CancelInvoke("LeftMouseDownDelayFunc");
LeftMouseDownAction = null;
//双击事件推送
MessageCenter.Instance.DispatchMessage(InputEventId.LeftMouseDoubleDown);
}
else
{
// 处理单击事件
time1 = Time.realtimeSinceStartup;
//绑定单击事件
LeftMouseDownAction = () => MessageCenter.Instance.DispatchMessage(InputEventId.LeftMouseDown);
Invoke("LeftMouseDownDelayFunc", ConstVariable.MouseClickJudgeDelayTimer);
}
}
}
上述代码通过 GetMouseButtonDown
检测左键点击,通过计时判断单击和双击事件。我设置的延迟时间为0.5s。
使用 Invoke 进行延迟调用
为了在规定的时间内判断是否发生了双击事件,我们引入了 Invoke
方法。这是一个强大而灵活的工具,用于在一定时间后执行指定的函数。以下是其在这个实现中的使用:
cs
void LeftMouseDownDelayFunc()
{
LeftMouseDownAction?.Invoke();
}
过这样的设计,我们成功地在Unity中实现了鼠标单双击判断的功能,使得代码更加简洁明了。
IPointerClickHandler接口实现方式
同时,在实现IPointerClickHandler接口中,我们也可以用此方法判断是单击还是双击。
cs
using UnityEngine;
using UnityEngine.EventSystems;
using System;
public class ClickHandler : MonoBehaviour, IPointerClickHandler
{
private Action ClickAction;
public void OnPointerClick(PointerEventData eventData)
{
if (eventData.clickCount == 1 && eventData.pointerId == -1)
{
HandleSingleClick();
}
else if (eventData.clickCount == 2 && eventData.pointerId == -1)
{
HandleDoubleClick();
}
}
private void HandleSingleClick()
{
ClickAction = () =>
{
// TODO: 处理单击事件
};
Invoke("ClickActionHandle", ConstVariable.MouseClickJudgeDelayTimer);
}
private void HandleDoubleClick()
{
CancelInvoke("ClickActionHandle");
ClickAction = null;
// TODO: 处理双击事件
}
private void ClickActionHandle()
{
ClickAction?.Invoke();
}
}
总结
在本文中,我们介绍了一种在Unity中实现鼠标单双击判断的简便方法。通过对代码的轻微修改,我们使其更具可读性和模块化,同时引入了 Invoke
方法进行延迟调用。这样的设计不仅方便了代码的编写,也提高了后续的维护效率。
希望这个简单而实用的方法能够对你的项目有所帮助。如果你有任何疑问或建议,欢迎在评论区分享。感谢阅读!