注意
:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——UGUI】专栏里,感兴趣的小伙伴可以前往逐一查看学习。
文章目录
- 前言
- 1、什么是UGUI事件接口?
- 2、想要监听事件步骤
- 一、事件接口
- 1、UGUI常用事件接口
- 2、UGUI不常用事件接口
- 3、导航相关接口
- 4、实例
- 二、PointerEventData关键参数
- 1、关键参数
- 2、实例
- 专栏推荐
- 完结
前言
1、什么是UGUI事件接口?
UGUI 事件接口为 UI 交互提供了灵活的事件处理机制,通过实现这些接口可以让任意 UI 控件响应复杂交互(如长按、拖拽等),突破基础事件监听限制。
2、想要监听事件步骤
- 就在脚本中继承对应接口
- 实现对应接口的方法
- 把脚本挂载到对应控件上
- 当对控件进行对应的操作时,会自动进行对应方法的逻辑。
一、事件接口
1、UGUI常用事件接口
接口名称 | 实现方法 | 触发条件 | 适用场景 |
---|---|---|---|
IPointerEnterHandler | OnPointerEnter | 鼠标进入控件区域 | 悬停提示、高亮反馈 |
IPointerExitHandler | OnPointerExit | 鼠标离开控件区域 | 取消高亮状态 |
IPointerDownHandler | OnPointerDown | 按下瞬间 | 点击音效触发 |
IPointerUpHandler | OnPointerUp | 抬起瞬间 | 结束按压状态 |
IPointerClickHandler | OnPointerClick | 完整点击操作(按下+抬起) | 按钮常规点击 |
IBeginDragHandler | OnBeginDrag | 开始拖拽时 | 拖拽物体初始化 |
IDragHandler | OnDrag | 持续拖拽时 | 实时更新物体位置 |
IEndDragHandler | OnEndDrag | 拖拽结束时 | 放置物体逻辑 |
不同平台注意
-
移动端无鼠标概念,
OnPointerEnter/Exit
失效 -
触控设备通过
pointerId
区分多点触控
2、UGUI不常用事件接口
接口名称 | 实现方法 | 触发条件 |
---|---|---|
IInitializePotentialDragHandler | OnInitializePotentialDrag | 在找到拖动目标时调用,可用于初始化值。 |
IDropHandler | OnDrop | 在拖动目标对象上调用。 |
IScrollHandler | OnScroll | 当鼠标滚轮滚动时调用。 |
IUpdateSelectedHandler | OnUpdateSelected | 每次勾选时在选定对象上调用。 |
ISelectHandler | OnSelect | 当对象成为选定对象时调用。 |
IDeselectHandler | OnDeselect | 取消选择选定对象时调用。 |
3、导航相关接口
接口名称 | 实现方法 | 触发条件 |
---|---|---|
IMoveHandler | OnMove | 发生移动事件(上、下、左、右等)时调用。 |
ISubmitHandler | OnSubmit | 按下 Submit 按钮时调用。 |
ICancelHandler | OnCancel | 按下 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.InputButton | Left :左键,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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!