1 简述

​ UGUI 回调函数主要指鼠标进入、离开、点下、点击中、抬起、开始拖拽、拖拽中、拖拽结束 UI 控件触发的回调。使用 UGUI 回调函数时,需要引入 UnityEngine.EventSystems 命名空间。

1) 回调函数

回调函数 接口 说明
void OnPointerEnter(PointerEventData eventData) IPointerEnterHandler 鼠标进入
void OnPointerExit(PointerEventData eventData) IPointerExitHandler 鼠标离开
void OnPointerDown(PointerEventData eventData) IPointerDownHandler 鼠标点下
void OnPointerUp(PointerEventData eventData) IPointerUpHandler 鼠标抬起
void OnPointerClick(PointerEventData eventData) IPointerClickHandler 鼠标单击
void OnBeginDrag(PointerEventData eventData) IBeginDragHandler 鼠标开始拖拽
void OnDrag(PointerEventData eventData) IDragHandler 鼠标拖拽中
void OnEndDrag(PointerEventData eventData) IEndDragHandler 鼠标结束拖拽

​ 注意:OnPointerClick 方法在 OnPointerUp 方法之后执行;如果在拖拽过程中停下了,但是鼠标左键仍未抬起,OnDrag 方法不会执行。

2)前提条件

  • 当前 UI 对象必须至少有 1 个基础组件(Text、Image、RawImage)
  • 基础 UI 组件中必须勾选 Raycast Target
  • 代码引入 UnityEngine.EventSystems 命名空间

3)使用方法

using UnityEngine;
using UnityEngine.EventSystems; public class EventController : MonoBehaviour,
IPointerEnterHandler,
IPointerExitHandler,
IPointerDownHandler,
IPointerClickHandler,
IPointerUpHandler,
IBeginDragHandler,
IDragHandler,
IEndDragHandler { public void OnPointerEnter(PointerEventData eventData) {
Debug.Log("OnPointerEnter");
} public void OnPointerExit(PointerEventData eventData) {
Debug.Log("OnPointerExit");
} public void OnPointerDown(PointerEventData eventData) {
Debug.Log("OnPointerDown");
} public void OnPointerClick(PointerEventData eventData) {
Debug.Log("OnPointerClick");
} public void OnPointerUp(PointerEventData eventData) {
Debug.Log("OnPointerUp");
} public void OnBeginDrag(PointerEventData eventData) {
Debug.Log("OnBeginDrag");
} public void OnDrag(PointerEventData eventData) {
Debug.Log("OnDrag");
} public void OnEndDrag(PointerEventData eventData) {
Debug.Log("OnEndDrag");
}
}

2 应用

1)UGUI 控件

​ 分别创建 Panel 和 2 个 Image 控件,并将 Image 控件重命名为 Monster 和 Spear,如下:

​ 给 Monster 和 Spear 添加 Sprite 图片如下:

2)脚本组件

​ SpearController.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class SpearController : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
private bool isDragging = false; public void OnBeginDrag(PointerEventData eventData) {
GetComponent<Image>().raycastTarget = false;
isDragging = true;
} public void OnDrag(PointerEventData eventData) {
Drag1();
// Drag2();
} public void OnEndDrag(PointerEventData eventData) {
GetComponent<Image>().raycastTarget = true;
isDragging = false;
} public bool IsDragging() {
return isDragging;
} private void Drag1() { // Canvas 渲染模式为 Screen Space - Overlay
transform.position = Input.mousePosition;
} private void Drag2() { // Canvas 渲染模式为 Screen Space - Camera
Vector3 worldPostion = Vector3.zero;
RectTransformUtility.ScreenPointToWorldPointInRectangle(
transform.root as RectTransform,
Input.mousePosition,
Camera.main,
out worldPostion
);
transform.position = worldPostion;
}
}

​ 说明:SpearController 脚本组件附着在 Spear 对象上。

​ MonsterController.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; public class MonsterController : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
private Image image;
private SpearController spear; private void Start() {
image = GetComponent<Image>();
spear = GameObject.Find("Spear").GetComponent<SpearController>();
} public void OnPointerEnter(PointerEventData eventData) {
if (spear.IsDragging()) {
image.color = Color.red;
}
} public void OnPointerExit(PointerEventData eventData) {
if (spear.IsDragging()) {
image.color = Color.white;
}
}
}

​ 说明:MonsterController 脚本组件附着在 Monster 对象上。

3)运行效果

​ 声明:本文转自【Unity3D】UGUI回调函数

【Unity3D】UGUI回调函数的更多相关文章

  1. Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)

    背景 曾几何时,在Winform中,使用MessageBox对话框是如此happy,后来还有人封装了可以选择各种图标和带隐藏详情的MessageBox,现在Unity3d UGui就没有了这样的好事情 ...

  2. Unity 之 C# 利用回调函数实现C++匿名函数

    做C++开发的都用过匿名函数很好用,可是C#开发怎么实现呢?前几天做一个拍照功能的时候.我偶然发现某个函数假设是C++的话.用匿名函数太好了,于是開始研究C#的回调,代理.托付等,最后总算是实现了我想 ...

  3. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  4. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  5. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  6. 理解 JavaScript 回调函数并使用

    JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...

  7. 关于js的回调函数的一点看法

    算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...

  8. JS学习:第二周——NO.1回调函数

    [回调函数] 定义:把一个函数的定义阶段,作为参数,传给另一个函数: 回调函数调用次数,取决于条件: 回调函数可以传参: 回调函数可以给变this指向,默认是window: 回调函数没有返回值,for ...

  9. 【java回调】java两个类之间的回调函数传递

    背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ...

  10. Java|今天起,别再扯订阅和回调函数

    编程史上有两个令人匪夷所思的说辞,一个是订阅,一个是回调函数. 我想应该还有很多同学为“事件的订阅”和“回调函数”所困扰,因为事情本来就不应该按这个套路来解释. 多直白,所谓的“回调函数”你完全可以线 ...

随机推荐

  1. Makefile中的+=、:=、?=

    1.= "="是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用"="进行赋值,变量的值是整个makefile中最后被指定的值.不太容易理解 ...

  2. Linux-文件指令-cat-less-head-touch

  3. [转帖]dd - Linux世界中的搬运工

    <存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于dd.fio.vdbench.iozone.iometer.cosbench等性能负载工具,及strace等调试工具. dd ...

  4. 【转帖】linux 软连接的使用

    https://www.cnblogs.com/sueyyyy/p/10985443.html 软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接. 具体用法是: ...

  5. JVM内存配置的再次思考

    JVM内存配置的再次思考 摘要 最近研究过不少内存分配相关的处理 今天晚上突然感觉还不是非常系统. 还是想能够细致的在学习一下. 希望能够慢慢的拾遗,提高自己 操作系统内存的使用情况 本文主要想思考l ...

  6. Linux与Windows系统字符集的简要学习

    背景 最近同事反馈公司的产品再更新了mysql-8.0.31的驱动jar包后部分功能报错. 问题核心原因 研发这边石磊老师已经找到了. 结论是Mysql8.0.26之后的数据库驱动好像会识别操作系统的 ...

  7. 如何通过gRPC传输文件

    在gRPC中,可以通过将文件分割成多个小块,然后使用流式RPC将这些小块发送到服务器来传输文件.以下是一个简单的示例,展示了如何在gRPC中实现文件传输. 首先,我们需要定义一个服务来处理文件传输.在 ...

  8. Paddlenlp之UIE关系抽取模型【高管关系抽取为例】

    往期项目回顾: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...

  9. 4.4 Windows驱动开发:内核监控进程与线程创建

    当你需要在Windows操作系统中监控进程的启动和退出时,可以使用PsSetCreateProcessNotifyRoutineEx函数来创建一个MyCreateProcessNotifyEx回调函数 ...

  10. MySQL 索引与性能调优

    索引用于快速找出在某个列中有一特定值的行,如果不使用索引MySQL必须从第l条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,MySQL能快速到达某 ...