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

发布于:2025-05-01 ⋅ 阅读:(13) ⋅ 点赞:(0)

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

前言

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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

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


网站公告

今日签到

点亮在社区的每一天
去签到