当前位置: 首页 > article >正文

Unity3D开发之鼠标单双击判断

在开发游戏和交互式应用程序时,经常需要对用户的鼠标点击进行准确的响应。其中,单击和双击事件的判断是常见需求之一。本文将介绍如何在Unity中优雅地实现鼠标单双击判断,使代码结构清晰、易读、易维护。

背景

在许多项目中,我们需要监测用户的鼠标点击事件,并根据单击和双击分别触发不同的操作。过去的实现方式可能会显得有些繁琐,而我们将展示一种更为简便的方法,使代码看起来更加清晰。

简单而有效的实现

首先,让我们看一下基本的鼠标点击检测实现:

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 方法。这是一个强大而灵活的工具,用于在一定时间后执行指定的函数。以下是其在这个实现中的使用:

void LeftMouseDownDelayFunc()
{
    LeftMouseDownAction?.Invoke();
}

过这样的设计,我们成功地在Unity中实现了鼠标单双击判断的功能,使得代码更加简洁明了。

IPointerClickHandler接口实现方式

同时,在实现IPointerClickHandler接口中,我们也可以用此方法判断是单击还是双击。

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 方法进行延迟调用。这样的设计不仅方便了代码的编写,也提高了后续的维护效率。

希望这个简单而实用的方法能够对你的项目有所帮助。如果你有任何疑问或建议,欢迎在评论区分享。感谢阅读!


http://www.kler.cn/a/228814.html

相关文章:

  • Vue.js 动态设置表格最大高度的实现
  • 统信V20 1070e X86系统编译安装mysql-5.7.44版本以及主从构建
  • 网络变压器的分类
  • WPS数据分析000004
  • Linux(DISK:raid5、LVM逻辑卷)
  • 数据结构漫游记:动态实现栈(stack)
  • 如何在PS5上使用金手指修改游戏
  • docker 离线安装镜像
  • Day05-Linux bash核心介绍及目录命令讲解
  • Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义
  • 【ArcGIS微课1000例】0102:面状要素空洞填充
  • 如何构建TCN网络提取序列特征
  • NLP任务之Named Entity Recognition
  • 自然语言处理中所有任务的概括
  • vue-element-admin npm install 失败解决
  • 代码随想录算法训练营Day49|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
  • 【IMAX6U移植OpenCV】
  • 15.1 项目实践_OA系统
  • 【RT-DETR有效改进】UNetv2提出的一种SDI多层次特征融合模块(细节高效涨点)
  • 浅谈QT的几种线程的使用和区别。
  • 如何部署Linux AMH服务器管理面板并结合内网穿透远程访问
  • 【AI数字人-论文】Geneface论文
  • H5调用安卓原生相机API案例
  • Java学习day29:线程池Pool中创建线程方式(面试必考!)
  • 《热辣滚烫》预售狂潮来袭,贾玲、马丽、杨紫三大女神联袂出演。
  • (4)【Python数据分析进阶】Machine-Learning模型与算法应用-回归、分类模型汇总