Unity UGUI事件接口概述
UGUI 系统虽然提供了很多封装好的组件,但是要实现一些特定的功能还是显得非常有限,这时候就需要使用事件接口来完成UI功能的实现。比如我们想实现鼠标移动到图片上时自动显示图片的文字介绍,一般思路会想到写个射线来检测,但其实这样的检测UGUI已经替我们完成了,我们只需要实现检测到目标对象后所要执行的代码即可!
UI 组件都是基于 UGUI 封装好的类和接口以及一些 Editor 文件来进行封装制作供开发者使用的,开发者利用这些封装好的工具,只需更专注于功能开发即可。UGUI 的代码是开源的,开发者可以查阅 UGUI 系统的具体细节来进行更深入的学习。UGUI 源码传送门:Unity-Technologies/UI
Unity官方也为开发者提供了很多完整的案例,可以在 Assets Store上进行下载,搜索“Unity Samples: UI”。
【接口介绍】
命名空间:using UnityEngine.EventSystems;
IPointerEnterHandler
该接口实现方法如下:
public void OnPointerEnter(PointerEventData eventData)
{
//当鼠标光标移入该对象时触发
}
IPointerExitHandler
该接口实现方法如下:
public void OnPointerExit(PointerEventData eventData)
{
//当鼠标光标移出该对象时触发
}
IPointerDownHandler
该接口实现方法如下:
public void OnPointerDown(PointerEventData eventData)
{
//鼠标点击A对象,按下鼠标时A对象响应此事件
}
IPointerUpHandler
该接口实现方法如下:
public void OnPointerUp(PointerEventData eventData)
{
//鼠标点击A对象,抬起鼠标时响应
//无论鼠标在何处抬起(即不在A对象中)
//都会在A对象中响应此事件
//注:响应此事件的前提是A对象必须响应过OnPointerDown事件
Debug.Log("OnPointerUp " + name);
}
IPointerClickHandler
该接口实现方法如下:
public void OnPointerClick(PointerEventData eventData)
{
//鼠标点击A对象,抬起鼠标时A对象响应此事件
//注:按下和抬起时鼠标要处于同一对象上
}
IDragHandler
该接口实现方法如下:
public void OnDrag(PointerEventData eventData)
{
//当鼠标在A对象按下并拖拽时 A对象每帧响应一次此事件
//注:如果不实现此接口,则后面的四个接口方法都不会触发
Debug.Log("OnDrag " + name); if (Input.GetMouseButton())
{
//拖拽移动图片
SetDraggedPosition(eventData);
}
}
private void SetDraggedPosition(PointerEventData eventData)
{
var rt = gameObject.GetComponent<RectTransform>();
Vector3 globalMousePos;
if(RectTransformUtility.ScreenPointToWorldPointInRectangle(rt,eventData.position, eventData.pressEventCamera, out globalMousePos))
{
rt.position = globalMousePos;
}
}
IInitializePotentialDragHandler
该接口实现方法如下:
public void OnInitializePotentialDrag(PointerEventData eventData)
{
//当鼠标在A对象按下还没开始拖拽时 A对象响应此事件
//注:此接口事件与IPointerDownHandler接口事件类似
// 二者的执行顺序:先执行IPointerDownHandler,然后执行此接口事件
Debug.Log("OnInitializePotentialDrag " + name);
}
IBeginDragHandler
该接口实现方法如下:
public void OnBeginDrag(PointerEventData eventData)
{
//当鼠标在A对象按下并开始拖拽时 A对象响应此事件
// 此事件在OnInitializePotentialDrag之后响应 OnDrag之前响应
Debug.Log("OnBeginDrag " + name);
}
IEndDragHandler
该接口实现方法如下:
public void OnEndDrag(PointerEventData eventData)
{
//当鼠标抬起时 A对象响应此事件
Debug.Log("OnEndDrag " + name);
}
IDropHandler
该接口实现方法如下:
public void OnDrop(PointerEventData eventData)
{
//A、B对象必须均实现IDropHandler接口,且A至少实现IDragHandler接口
//当鼠标从A对象上开始拖拽,在B对象上抬起时 B对象响应此事件
//此时name获取到的是B对象的name属性
//eventData.pointerDrag表示发起拖拽的对象(GameObject)
Debug.Log(eventData.pointerDrag.name + " OnDrop to " + name);
}
Unity UGUI事件接口概述的更多相关文章
- Unity3D学习笔记(二十二):ScrollView和事件接口
昨天问题 InputField光标被遮挡问题:背景图片输入层级高于光标的层级,把光标弄成子物体,子物体层级高 自制的滑动框,选项怎么对齐,把Template的Pivot.y改为1 分辨率的区别:16: ...
- UGUI 事件穿透规则
UGUI事件分为两大类:点击和拖拽. 点击包括 pointerdown, pointerup. 拖拽包括 begindrag, drag, enddrag. 点击事件无穿透:只会被最上层UI响应,不会 ...
- Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)
简述 最近在用UGUI的时候遇到了鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件.比如下图中 这里给Cube加了一个鼠标点击改变颜色的代码,如下 ...
- unity UI事件
由于工作需要到持续按键,所以了解了一下unity UI事件,本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_source=tuico ...
- AS3事件机制概述
事件机制是AS3的核心功能之一,没有充分掌握事件机制的方方面面,就不能算是精通AS3语言. 1. AS3事件机制的主要成员 IEventDispatcher:事件派发对象接口,定义了添加.派发.移除. ...
- Unity UGUI —— 无限循环List
还记得大学毕业刚工作的时候是做flash的开发,那时候看到别人写的各种各样的UI组件就非常佩服,后来自己也慢慢尝试着写,发现其实也就那么回事.UI的开发其实技术的成分相对来说不算多,但是一个好的UI是 ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
随机推荐
- C语言面试题22. 链表中倒数第k个节点
要求:输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5.6. ...
- C++ stringstream用法(转)
一直觉得C++ iostream的cout输出比起printf差了太多,今天查c++字符串拼接的时候偶然看到原来还有stringstream这个类,还是挺好用的,该类位于<sstream> ...
- idea 配置 tomcat 教程
最近在搞一个项目需要用到idea 配置tomcat,翻了翻网上的帖子发现稂莠不齐,最后决定还是自己写个吧!(其实我挺蠢的走了好多的弯路,哎~) 1.首先准备一个需要大家tomcat的工程,然后使用id ...
- DE1_MSEL
基础的一般实验:01001(现在用的)或10010 马上换linux,做个记录: sd卡启动linux系统时,启动开关0至4位拨至00000
- 虚拟机中CentOS 6.5 添加扩展分区
此扩展方法要求支持LVM 1.更改虚拟机配置 虚拟机->设置->硬盘->扩展磁盘容量 fdisk -l 查看,发现硬盘空间变大了 [root@thj Desktop]# fdisk ...
- turtleh海龟库
Turtle海龟库 导入 import turtle turtle.setup(width,height,startx,starty) -setup():设置窗体的位置和大小 相对于桌面的起点的坐标以 ...
- 怎么把apk文件部署在云服务器上
你服务器直接使用nginx,将请求映射到固定目录,把你的apk放到该目录.其他都不用干了.
- ICPC2019 亚洲区域赛 南京站
蒟蒻终于打完了人生的第一场ICPC了. 终榜去星后rank36,AG,和AU差几十罚时了. 虽有遗憾但总体也是正常发挥了. 不愿再去对比赛做什么回顾,甚至很不愿去想.很多题已经在能力之外,即便是平常熟 ...
- 什么是类的hashcode值
1.要知道什么是类的hashcode值,首要要了解什么是hash(哈希).Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换 ...
- 第五十二篇 Linux相关——数据库服务MySQL
No.1. MySQL基本操作 CentOS7默认安装mariadb数据库,先将其移除 移除命令:sudo yum -y remove mariadb-libs.x86_64 下载MySQL源 ...