【虚拟仿真】Unity3D中实现UI的单击、双击、按压、拖动的不同状态判断

news2024/11/23 0:32:18

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

之前写了一篇在Unity中鼠标的单击、双击、拖动的文章:【虚拟仿真】Unity3D中实现鼠标的单击、双击、拖动的不同状态判断。

有小伙伴问UI的单击、双击、拖动如何做的?

这篇文章就来实现UI的单击、双击、按压、拖动的不同状态判断。

在开始之前,我们先来回顾一下鼠标的事件判断以及如何实现UI的点击判断。

二、鼠标点击事件和UI点击事件

2-1、鼠标点击事件

鼠标点击事件就比较简单,使用鼠标的输入API事件:

API事件:

Input.GetMouseButtonDown(0);//鼠标右键单击

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ButtonOnClick : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("鼠标左键点击");
        }
    }
}

判断单击和双击的话主要判断点击的次数。

2-2、UI点击事件

UI的点击事件,需要继承UI的点击事件接口,重写点击事件即可。

UI点击事件接口:

IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler

参考代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ButtonOnClick : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
	// 鼠标点击UI
    public void OnPointerClick(PointerEventData eventData)
    {
    }
	// 鼠标按下UI
    public void OnPointerDown(PointerEventData eventData)
    {
    }
	// 鼠标离开UI
    public void OnPointerExit(PointerEventData eventData)
    {
    }
	// 鼠标点击UI后弹起
    public void OnPointerUp(PointerEventData eventData)
    {
    }
}

知道了这些内容,接下来就在上面代码的基础上进行修改。

2-3、实现UI的单击、双击、按压、拖动的不同状态判断

参考代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

public class ButtonOnClick : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
    // 按压的持续时间
    public float pressDurationTime = 1;
    // 按压的响应次数
    public bool responseOnceByPress = false;
    // 双击的间隔时间
    public float doubleClickIntervalTime = 0.5f;
    // 拖动的间隔时间
    public float dragIntervalTime = 0.2f;
    // 拖动的鼠标间隔距离
    public float dragIntervalPos = 0.01f;

    public UnityEvent onDoubleClick;
    public UnityEvent onPress;
    public UnityEvent onClick;
    public UnityEvent onDrag;

    private bool isDown = false;
    private bool isPress = false;
    private bool isDrag = false;
    private float downTime = 0;

    private float clickIntervalTime = 0;
    private int clickTimes = 0;

    private Vector3 mousePosLast = Vector3.zero;//点击后的拖动位置

    ButtonOnClick btn;

    void Start()
    {
        btn = GetComponent<ButtonOnClick>();
        btn.onClick.AddListener(Click);
        btn.onPress.AddListener(Press);
        btn.onDoubleClick.AddListener(DoubleClick);
        btn.onDrag.AddListener(Drag);
    }

    void Click()
    {
        Debug.Log("单击");
    }

    void Press()
    {
        Debug.Log("按压");
    }

    void DoubleClick()
    {
        Debug.Log("双击");
    }

    void Drag()
    {
        Debug.Log("拖动");
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("鼠标左键点击");
        }

        if (isDown)
        {
            if (responseOnceByPress && isPress)
            {
                return;
            }
            downTime += Time.deltaTime;
            isDrag = Vector3.Distance(Input.mousePosition, mousePosLast) > dragIntervalPos;
            if (downTime > pressDurationTime && !isDrag)
            {
                isPress = true;
                onPress.Invoke();
            }
            if (downTime > dragIntervalTime && isDrag)
            {
                onDrag.Invoke();
            }
        }
        if (clickTimes >= 1)
        {
            clickIntervalTime += Time.deltaTime;
            if (clickIntervalTime >= doubleClickIntervalTime)
            {
                if (clickTimes >= 2)
                {
                    onDoubleClick.Invoke();
                }
                else
                {
                    onClick.Invoke();
                }
                clickTimes = 0;
                clickIntervalTime = 0;
            }
        }
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (!isPress)
            clickTimes += 1;
        else
            isPress = false;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isDown = true;
        downTime = 0;
        mousePosLast = Input.mousePosition;
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        isDown = false;
        isPress = false;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isDown = false;
    }
}

效果图:
在这里插入图片描述

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Improving Language Understanding by Generative Pre-Training 论文阅读

论文题目&#xff1a;通过生成式预训练提高语言理解能力 GPT的全称&#xff1a;Generative Pre-trained Transformer。 Generative是指GPT可以利用先前的输入文本来生成新的文本。GPT的生成过程是基于统计的&#xff0c;它可以预测输入序列的下一个单词或字符&#xff0c;从而生…

春招,进阿里了....

个人背景是东北某 985 科班本硕&#xff0c;做的 测试开发&#xff0c;有两个自己写的小项目。下面是一些印象比较深刻的面试题 阿里一面 什么是软件测试&#xff1f; 软件测试过程中会面向哪些群体&#xff1f; 开发一个软件都要经过哪些阶段&#xff1f; 什么是黑盒测试&…

一块钱看Android Debug: avc denied 已存在的目录不能访问

某三方应用&#xff0c;使用了USB摄像头&#xff0c;启动应用后功能不能使用&#xff0c;看log有如下错误&#xff0c; denied后面{}里的是要执行的动作,比如append,open,execmod,link等等 scontext指的是域,对应的是te文件 上面报错这条对应te文件是untrusted_app.te, scontex…

如何将 WhatsApp 聊天添加到您的网站

WhatsApp是全球最受欢迎的消息传递应用程序。平台上有超过 2 亿活跃用户与朋友、家人和企业进行交流。对于企业而言&#xff0c;WhatsApp 是与客户进行个人、可访问和非正式对话的理想渠道。 要将 WhatsApp 作为渠道引入您的客户旅程&#xff0c;第一步是将 WhatsApp 聊天按钮…

2023软件测试工具大全(自动化、接口、性能、安全、测试管理)

目录 前言 一、自动化测试工具 Selenium Appium TestComplete 二、接口测试工具 Postman SoapUI JMeter 三、性能测试工具 LoadRunner JMeter Gatling 四、安全测试工具 Burp Suite OWASP ZAP Nmap 五、测试管理工具 TestRail JIRA TestLink 总结 前言 …

【JavaScript】this理解总结

概念 this是函数运行时所在的对象。 使用场合 1.全局环境 全局环境使用this&#xff0c;this指向顶层对象。 2.构造函数 构造函数体里面的this&#xff0c;this指向是构造出来的实例对象。 3.对象的方法 ● 如果对象的方法里面包含this&#xff0c;this的指向就是方法运…

ASPICE详细介绍-4.车载项目为什么要符合ASPICE标准?

目录 车载项目为什么要符合ASPICE标准&#xff1f;ASPICE与功能安全的关系、区别&#xff1f;各大车厂对软件体系的要求 车载项目为什么要符合ASPICE标准&#xff1f; ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;最…

sacrebleu找不到报错(无法直接下载)

网络问题无法下载&#xff0c;下载下来py文件&#xff0c;放到同级目录下面 https://raw.githubusercontent.com/huggingface/datasets/2.11.0/metrics/sacrebleu/sacrebleu.py然后注释掉版本报错

Devops和Gitops区别

一. 什么是devops DevOps 是一种开发&#xff08;Dev&#xff09;和运维&#xff08;Ops&#xff09;之间协作和沟通的文化、流程和工具的实践方法。它强调迭代、快速交付和持续集成/持续交付&#xff0c;旨在加速软件交付的速度、质量和稳定性。 DevOps 的核心目标是通过自动…

中国视频云市场报告:腾讯云连续五年解决方案市场份额第一

4月24日&#xff0c;全球领先的IT市场研究和咨询公司IDC发布《中国视频云市场跟踪&#xff08;2022下半年&#xff09;》报告&#xff0c;腾讯云音视频的解决方案市场份额已连续五年排名第一&#xff0c;斩获自2018年IDC对外发布数据以来的“五年连冠”。其中&#xff0c;腾讯云…

C++模板使用

感谢你的阅读&#xff01;&#xff01;&#xff01; 目录 感谢你的阅读&#xff01;&#xff01;&#xff01; 举个例子&#xff1a; template 有什么意义为什么要用模板 与typedef的区别 使用方法 模板&#xff1a;隐式实例化与显示实例化 和非模板函数以及多个模板类…

SAP ABAP MARA-MSBOOKPARTNO 制造商登记部分编号

BAPI_MATERIAL_SAVEDATA CLIENTDATA结构无此字段。 DATA:LS_TE_MARA TYPE BAPI_TE_MARA. DATA:LS_TE_MARAX TYPE BAPI_TE_MARAX. DATA:LT_BAPIPAREX TYPE TABLE OF BAPIPAREX. DATA:LS_BAPIPAREX TYPE BAPIPAREX. …

Spring Bean作用域与生命周期

目录 Bean的作用域&#xff1a; Bean有六大行为模式 1、singleton:单例模式(默认) 2、prototype: 原型模式(多例模式) 3、request: 请求作用域(Spring MVC) 4、session: 会话作用域(Spring MVC) 5、application: 全局作用域(Spring MVC) 6、websocket: HTTP WebSocket …

M1 Mac安装Zookeeper

下载Zookeeper 由于通过homebrew下载的zookeeper没有conf文件夹&#xff0c;因此我们在官网下载 zookeeper-3.7.1 然后下载上面这个 将解压后的文件转移到 /usr/local 更改配置文件 1、配置文件位置位于解压文件夹下conf文件夹内部&#xff0c;默认名字为zoo_sample.cfg&…

Unity设计模式—命令队列

Unity设计模式—命令队列 概要 本篇将介绍命令队列并用命令队列模式实现一个Unity里的WindowManager。 命令队列是一个按照FIFO顺序存储一系列通知或请求的队列。发出通知时系统会将请求置入队列并立即返回&#xff0c;请求处理器随后从命令队列中获取并处理这些请求。请求可由…

集合专题·拔高·壹

文章目录 1 Collection单列集合、Map双列集合1.1 Collection单列集合1.1.1 Collection单列集合及其实现类1.1.1.1 list集合与Array数组1.1.1.1.1 ArrayList1.1.1.1.2 LinekdList1.1.1.1.2 Vector1.1.1.1.2.1 ArrayList、Vector &#xff08;线程安全&#xff09;的区别是什么1.…

【数据结构与算法】前缀和+哈希表算法

文章目录 一、引入二、前缀和与哈希表的结合三、例题3.1 和为 K 的子数组3.2 统计「优美子数组」3.3 路径总和III 四、总结 一、引入 关于前缀和和哈希这两个概念大家都不陌生&#xff0c;在之前的文章中也有过介绍&#xff1a;前缀和与差分算法详解 而哈希表最经典的一题莫过…

Kerberos设计和落地长常识

Kerberos 处理三类安全对象 票证 kerberos票证授予服务给每个客户发一张标记&#xff0c;该标记发送给一个特殊的服务器&#xff0c;证实kerberos最近已经认证了发送者&#xff0c;票证包括过期时间和新生成的会话密钥供客户和服务器使用。 认证 由客户构造的一个标记&#xff…

LVS负载均衡之NAT模式

实验准备四台虚拟机 192.168.255.128 做负载均衡器&#xff08;两张网卡&#xff0c;且都需要NAT模式&#xff09; 192.168.255.130 Nginx节点服务器1 192.168.255.131 Nginx节点服务器2 192.168.255.132 nfs共享服务器 现将四台虚拟机的防火墙关闭 一、nfs服务器配置 1…

使用Visual Studio 创建Windows服务,并安装部署

创建服务的工程 Program.cs是入口类&#xff0c;Service1.cs是写服务功能的组件&#xff0c;类似于winform项目中的Form1.cs。 打开Service1.cs&#xff0c;&#xff08;右键单击Service1.cs&#xff0c;选择查看源码&#xff09; OnStart&#xff1a;服务启动时&#xff0c;执…