【unity游戏开发入门到精通——UGUI】UI事件监听接口

注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——UGUI】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

  • 前言
    • 1、什么是UGUI事件接口?
    • 2、想要监听事件步骤
  • 一、事件接口
    • 1、UGUI常用事件接口
    • 2、UGUI不常用事件接口
    • 3、导航相关接口
    • 4、实例
  • 二、PointerEventData关键参数
    • 1、关键参数
    • 2、实例
  • 专栏推荐
  • 完结

前言

1、什么是UGUI事件接口?

UGUI 事件接口为 UI 交互提供了灵活的事件处理机制,通过实现这些接口可以让任意 UI 控件响应复杂交互(如长按、拖拽等),突破基础事件监听限制。

2、想要监听事件步骤

  • 就在脚本中继承对应接口
  • 实现对应接口的方法
  • 把脚本挂载到对应控件上
  • 当对控件进行对应的操作时,会自动进行对应方法的逻辑。

一、事件接口

1、UGUI常用事件接口

接口名称实现方法触发条件适用场景
IPointerEnterHandlerOnPointerEnter鼠标进入控件区域悬停提示、高亮反馈
IPointerExitHandlerOnPointerExit鼠标离开控件区域取消高亮状态
IPointerDownHandlerOnPointerDown按下瞬间点击音效触发
IPointerUpHandlerOnPointerUp抬起瞬间结束按压状态
IPointerClickHandlerOnPointerClick完整点击操作(按下+抬起)按钮常规点击
IBeginDragHandlerOnBeginDrag开始拖拽时拖拽物体初始化
IDragHandlerOnDrag持续拖拽时实时更新物体位置
IEndDragHandlerOnEndDrag拖拽结束时放置物体逻辑

不同平台注意

  • 移动端无鼠标概念,OnPointerEnter/Exit 失效

  • 触控设备通过 pointerId 区分多点触控

2、UGUI不常用事件接口

接口名称实现方法触发条件
IInitializePotentialDragHandlerOnInitializePotentialDrag在找到拖动目标时调用,可用于初始化值。
IDropHandlerOnDrop在拖动目标对象上调用。
IScrollHandlerOnScroll当鼠标滚轮滚动时调用。
IUpdateSelectedHandlerOnUpdateSelected每次勾选时在选定对象上调用。
ISelectHandlerOnSelect当对象成为选定对象时调用。
IDeselectHandlerOnDeselect取消选择选定对象时调用。

3、导航相关接口

接口名称实现方法触发条件
IMoveHandlerOnMove发生移动事件(上、下、左、右等)时调用。
ISubmitHandlerOnSubmit按下 Submit 按钮时调用。
ICancelHandlerOnCancel按下 Cancel 按钮时调用。

4、实例

引用EventSystems命名空间,继承MonoBehavior的脚本继承对应的事件接口,并实现接口中的内容。

using UnityEngine;
using UnityEngine.EventSystems;public class MyEventHandler : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, 
IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, 
IBeginDragHandler, IDragHandler, IEndDragHandler
{//当即将开始拖拽时在拖拽对象上调用。public void OnBeginDrag(PointerEventData eventData){print("即将开始拖拽");}//当发生拖拽时调用。public void OnDrag(PointerEventData eventData){print("发生拖拽");print(eventData.delta); //打印eventData中的delta属性,表示拖动事件的位移量}//当拖拽完成时在拖拽对象上调用。public void OnEndDrag(PointerEventData eventData){print("拖拽完成");}//当在同一对象上,完成点击(按下再松开鼠标)时调用。public void OnPointerClick(PointerEventData eventData){print("完成点击");}//当在对象上鼠标或者触碰按下时调用。public void OnPointerDown(PointerEventData eventData){print("鼠标(触碰)按下"); //打印一条字符串,表示鼠标或触碰按下print(eventData.pointerId); //打印eventData中的pointerId属性,表示按下事件的指针标识符,用于区分多点触控print(eventData.position); //打印eventData中的position属性,表示按下事件的屏幕坐标}//当鼠标指针进入对象时调用。public void OnPointerEnter(PointerEventData eventData){//鼠标进入 在移动设备上 是不存在 因为不存在 进入的概念print("鼠标进入");}//当鼠标指针退出对象时调用。public void OnPointerExit(PointerEventData eventData){//鼠标离开 在移动设备上 是不存在 因为不存在 进入的概念print("鼠标离开");}//当在对象上鼠标或触摸抬起时调用。public void OnPointerUp(PointerEventData eventData){print("鼠标(触碰)抬起");}
}

将该脚本挂载到想要监听自定义事件的UI控件上
在这里插入图片描述

结果
在这里插入图片描述

二、PointerEventData关键参数

PointerEventData 类是 Unity UGUI 事件系统中用于存储与用户输入设备(如鼠标、触摸屏等)交互相关信息的重要参数。它作为 UGUI 事件接口函数的通用数据载体,包含了丰富的指针交互状态属性。

PointerEventData 继承自 BaseEventData 类,后者提供了一个通用的事件数据结构基础。
在这里插入图片描述

1、关键参数

属性说明类型作用
pointerId输入源标识Int用来区分不同输入源(如多个触摸点、不同鼠标设备等)。处理多指触控时,每个触摸点分配唯一的 pointerId。
position当前屏幕坐标Vector2描述当前指针在屏幕坐标系中的实时位置,当用户进行拖拽操作时,这个值会持续更新。
pressPosition按下位置Vector2记录了指针按下那一刻在屏幕上的初始位置。
delta帧间位移量Vector2表示上一帧到当前帧的位移变化量,指针在屏幕上的位移变化量。
pointerPress当前按压对象GameObject获取当前按下的对象。
pressPosition按下位置Vector2记录了指针按下那一刻在屏幕上的初始位置。
clickCount连续点击次数Int表示连续点击的次数,用于区分单击和快速连续点击(连击)的行为。
clickTime最后一次点击发生的时间戳float记录了最后一次点击发生的时间戳,有助于根据点击间隔执行不同的响应逻辑。
button区分鼠标左右中键操作PointerEventData.InputButtonLeft:左键,Right:右键,Middle:中键
dragging拖拽状态bool指示当前是否处于拖拽过程中。需结合 IDragHandler 接口使用。
scrollDelta滚轮增量Vector2鼠标滚轮的滚动量需结合 IScrollHandler 接口使用。

2、实例

using UnityEngine;
using UnityEngine.EventSystems;public class MyEventHandler : MonoBehaviour,IPointerClickHandler,IDragHandler,IScrollHandler 
{//持续拖拽时public void OnDrag(PointerEventData eventData){Debug.Log("当前屏幕坐标" + eventData.position );Debug.Log("帧间位移量 " + eventData.delta );Debug.Log("拖拽状态 " + eventData.dragging );}//当在同一对象上,完成点击(按下+抬起)时调用。public void OnPointerClick(PointerEventData eventData){Debug.Log("输入源标识" + eventData.pointerId);Debug.Log("按下位置" + eventData.pressPosition  );Debug.Log("按键类型 " + eventData.button);Debug.Log("当前按压对象" + eventData.pointerPress.name );Debug.Log("连续点击次数" + eventData.clickCount);Debug.Log("最后一次点击发生的时间戳" + eventData.clickTime);}//当鼠标滚轮滚动时调用public void OnScroll(PointerEventData eventData){Debug.Log("滚轮增量" + eventData.scrollDelta);}
}

结果
在这里插入图片描述


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

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

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

相关文章

Spark知识总结

宽窄依赖:父RDD的分区只对应下面子RDD的一个分区,为窄依赖。其余为宽依赖 维度‌‌窄依赖‌‌宽依赖‌数据传输无shuffle,本地处理14需shuffle,跨节点传输14并行度高(允许流水线并行)57低(需等…

铭记之日(3)——4.28

铭记之日(3)——4.28 25.4.28,绝对是继20.12.19与24.6.26之后,又一个被钉在耻辱柱上的日子。 4.28本质上为12.19的严重恶劣版。 道德败坏、恶劣的大骗子终于在今日穿帮落马。 斯文面孔下,竟藏匿了如此罪恶幽暗混沌的内心。 24.10.20&…

第16节:传统分类模型-支持向量机(SVM)在图像分类中的应用

一、引言 支持向量机(Support Vector Machine, SVM)作为一种经典的机器学习算法,自20世纪90年代由Vapnik等人提出以来,在模式识别和分类任务中表现出卓越的性能。 在深度学习兴起之前,SVM长期占据着图像分类领域的主导地位,即使…

《系统分析师-第三阶段—总结(六)》

背景 采用三遍读书法进行阅读,此阶段是第三遍。 过程 本篇总结第11章第12章的内容 第11章 第12章 总结 软件架构设计是宏观,基本架构确定之后,开始了系统化设计, 系统设计中对应的基本部分的知识较多,基础知识是第…

new的使用

上次堆区的介绍中,我们提到了一个关键字new,那今天我们就详细讲讲它 今天我们主要将两个内容 1.new的基本语法 2.用new创建数组 1.new的基本语法 new,可以在堆区中创建空间,来存放数据,就比如像下面这样 int* p new int(29);//n…

使用python实现自动化拉取压缩包并处理流程

使用python实现自动化拉取压缩包并处理流程 实现成果展示使用说明 实现成果展示 使用说明 执行./run.sh 脚本中的内容主要功能是: 1、从远程服务器上下拉制定时间更新的数据 2、将数据中的zip拷贝到指定文件夹内 3、解压后删除所有除了lcm之外的文件 4、新建一个ou…

香橙派打包qt文件报错“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案

PyQt 报错总结:打包文件过程,“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案全解析 在使用 PyQt5 搭建图形界面时,打包文件的过程中出现的问题,真难绷,搞了半天。 Qt 平台插件 xcb 无法加载QOb…

Missashe考研日记-day29

Missashe考研日记-day29 1 专业课408 学习时间:3h学习内容: 今天先是把虚拟存储剩余的课听完了,然后就是做课后选择题,57道,已经接受了OS课后题尤其多的事实了。解决并且理解完习题之后就开始预习文件管理的内容&…

【Linux】第十二章 安装和更新软件包

目录 1. 什么是RPM? 2. dnf是什么,它和rpm有什么联系和区别? 3. RHEL 中如何做才能启用对第三方存储库的支持? 4. 怎么理解RHEL9中的应用流(Application Streams)和模块(Modules)? 5. RHEL9 有两个必要的软件存储…

新时代下的存储过程开发实践与优化

随着现代应用系统的复杂度不断增加,数据库作为核心的数据存储和处理引擎,其性能和可靠性显得尤为重要。存储过程(Stored Procedure)作为一种封装在数据库中的应用逻辑,使得开发者能够在数据库层面实现数据操作、数据校…

从梯度消失到百层网络:ResNet 是如何改变深度学习成为经典的?

自AlexNet赢得2012年ImageNet竞赛以来,每个新的获胜架构通常都会增加更多层数以降低错误率。一段时间内,增加层数确实有效,但随着网络深度的增加,深度学习中一个常见的问题——梯度消失或梯度爆炸开始出现。 梯度消失问题会导致梯…

JVM——引入

什么是JVM?它与JDK、JRE的关系? JVM、JRE 和 JDK 是 Java 平台的三个核心组件,各自承担着不同的职责,它们之间的关系密不可分。理解它们的区别和联系有助于更好地开发、部署和运行 Java 应用程序。对于 Java 开发者来说&#xff…

PyCharm 2023升级2024 版本

windows下把老版本卸载之后,需要把环境变量,注册表信息删除。 并且把C:\Users\用户\AppData 文件夹下的 Local\JetBrains和Roaming\JetBrains 都删除,再重新安装 原旧项目升级的方式: 1.2023虚拟机的文件夹是venv 改为.venv…

从外卖大战看O2O新趋势:上门私厨平台系统架构设计解析

京东高调进军外卖市场,美团全力防守,两大巨头的竞争让整个行业风起云涌。但在这场外卖大战之外,一个更具潜力的细分市场正在悄然兴起——上门私厨服务。 与标准化外卖不同,上门私厨提供的是个性化定制服务。厨师带着新鲜食材上门现…

驱动开发系列53 - 一个OpenGL应用程序是如何调用到驱动厂商GL库的

一:概述 一个 OpenGL 应用程序调用 GPU 驱动的过程,主要是通过动态链接库(libGL.so)来完成的。本文从上到下梳理一下整个调用链,包含 GLVND、Mesa 或厂商驱动之间的关系。 二:调用关系 1. 首先一个 OpenGL 应用程序(比如游戏或图形渲染软件)在运行时会调用 OpenGL 提供…

springboot3 声明式 HTTP 接口

1 介绍 在 Spring 6 和 Spring Boot 3 中,我们可以使用 Java 接口来定义声明式的远程 HTTP 服务。这种方法受到 Feign 等流行 HTTP 客户端库的启发,与在 Spring Data 中定义 Repository 的方法类似。 声明式 HTTP 接口包括用于 HTTP exchange 的注解方法…

多级缓存架构设计与实践经验

多级缓存架构设计与实践经验 在互联网大厂Java求职者的面试中,经常会被问到关于多级缓存的架构设计和实践经验。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。请问您对多级…

Mac「brew」快速安装Redis

安装Redis 步骤 1:安装 Redis 打开终端(Terminal)。 运行以下命令安装 Redis: brew install redis步骤 2:启动 Redis 安装完成后,可以使用以下命令启动 Redis 服务: brew services start redis…

文献阅读(一)植物应对干旱的生理学反应 | The physiology of plant responses to drought

分享一篇Science上的综述文章,主要探讨了植物应对干旱的生理机制,强调通过调控激素信号提升植物耐旱性、保障粮食安全的重要性。 摘要 干旱每年致使农作物产量的损失,比所有病原体造成损失的总和还要多。为适应土壤中的湿度梯度变化&#x…

if consteval

if consteval 是 C23 引入的新特性,该特性是关于immediate function 的,即consteval function。用于在编译时检查当前是否处于 立即函数上下文(即常量求值环境),并根据结果选择执行不同的代码路径。它是对 std::is_con…