【Unity3D】UGUI回调函数
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回调函数的更多相关文章
- Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)
背景 曾几何时,在Winform中,使用MessageBox对话框是如此happy,后来还有人封装了可以选择各种图标和带隐藏详情的MessageBox,现在Unity3d UGui就没有了这样的好事情 ...
- Unity 之 C# 利用回调函数实现C++匿名函数
做C++开发的都用过匿名函数很好用,可是C#开发怎么实现呢?前几天做一个拍照功能的时候.我偶然发现某个函数假设是C++的话.用匿名函数太好了,于是開始研究C#的回调,代理.托付等,最后总算是实现了我想 ...
- 小兔JS教程(三)-- 彻底攻略JS回调函数
这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...
- 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比
C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
- JS学习:第二周——NO.1回调函数
[回调函数] 定义:把一个函数的定义阶段,作为参数,传给另一个函数: 回调函数调用次数,取决于条件: 回调函数可以传参: 回调函数可以给变this指向,默认是window: 回调函数没有返回值,for ...
- 【java回调】java两个类之间的回调函数传递
背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ...
- Java|今天起,别再扯订阅和回调函数
编程史上有两个令人匪夷所思的说辞,一个是订阅,一个是回调函数. 我想应该还有很多同学为“事件的订阅”和“回调函数”所困扰,因为事情本来就不应该按这个套路来解释. 多直白,所谓的“回调函数”你完全可以线 ...
随机推荐
- 07 - HTTP
HTTP 强烈推荐学习:HTTP | MDN 一 .基础概念 请求和响应报文 客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端. 请求报文结构 ...
- [转帖]windows10彻底关闭Windows Defender的4种方法
https://zhuanlan.zhihu.com/p/495107049 Windows Defender是windows10系统自带的杀毒软件.默认情况下它处于打开的状态.大多数第三方的杀毒软件 ...
- [转帖]Linux ps -o 查看进程启动时间
https://www.cnblogs.com/apink/p/17572435.html 时间参数 如下表 参数 含义 start 显示进程启动时间的简短格式.通常,它会显示日期时间中的月-日 或 ...
- Grafana监控Oracle数据库的表大小等信息
Grafana监控Oracle数据库的表大小等信息 方案 oracledb_exporter 以及 prometheus grafana 使用的SQL以及配置文件 [[metric]] context ...
- [转帖]RAC AWR重要指标说明
1.Global Cache Load Profile Global Cache blocks received: 接收到的全局缓冲块 Global Cache blocks served: 发送的 ...
- [转帖]Shell三剑客之awk
目录 awk简述 awk的工作过程 awk的工作原理 awk的基本格式及其内置变量 getline 文本内容匹配过滤打印 对字段进行处理打印 条件判断打印 awk的三元表达式与精准筛选用法 awk的精 ...
- [转帖]rclone将本地文件或文件夹导入minio中
1.背景:公司数据迁移涉及到文件迁移,原有文件服务器没有使用minio,但是现在的新系统使用了minio.所以这就需要我们将文件上传到minio文件服务器中:由于历史文件数据量大,甲方要求可以通过服务 ...
- [转帖]《Linux性能优化实战》笔记(十九)—— DNS 解析原理与故障案例分析
一. 域名与 DNS 解析 域名主要是为了方便让人记住,而 IP 地址是机器间的通信的真正机制.以 time.geekbang.org 为例,最后面的 org 是顶级域名,中间的 geekbang 是 ...
- [转帖]ChatGPT研究框架(2023)
https://www.eet-china.com/mp/a226595.html ChatGPT是基于OpenAI公司开发的InstructGPT模型的对话系统,GPT系列模型源自2017年诞生的T ...
- 手把手带你开发starter,点对点带你讲解原理
京东物流 孔祥东 _____ _ ____ _ / ____| (_) | _ \ | | | (___ _ __ _ __ _ _ __ __ _| |_) | ___ ___ | |_ \___ ...