Unity -- EventSystem完全掌握
Event System
组成
系统生成的Event System里面主要有两个Components,分别是Event System和Standalone Input Module。

其中Standalone Input Module是派生自BaseInputModule。
作用
1. EventSystem
负责处理输入、射线投射以及发送事件
一个场景中只能有一个EventSystem,否则EventSystem会失效
2. BaseInputModule
负责处理输入(点击、拖拽等),把输入事件发送到具体的对象
3. BaseRaycaster
负责确定目标对象
在UI中:就是GraphicRaycaster
非UI中:就需要自己在摄像机上绑定并且检测对象上要有Collider
小结
EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象。
工作流
- BaseInputModule接收用户的输入
- BaseRaycaster根据用户的输入,找到目标物体
- 根据用户的输入事件,调用目标物体上的对应接口实现。
内部工作机制
- EventSystem把其GameObject上的所有BaseInputModule放到一个内部列表中。
- 在每一帧调用UpdateModules方法,该方法会去调用列表中所有BaseInputModule的UpdateModule方法。
- 在UpdateModule方法中,BaseInputModule会把自己的状态修改为"Updated",之后BaseInputModule的Process接口才会被调用
事件
事件都必须在对象内操作才会发生
拖拉事件
| 接口 | 事件 | 作用 | 注意事项 |
|---|---|---|---|
| IBeginDragHandler | OnBeginDrag | 开始拖拉 | 必须同时实现IDragHandler,否则失效 |
| IDragHandler | OnDrag | 正在拖拉 | 每当移动一定距离,就发生一次拖拉事件 |
| IEndDragHandler | OnEndDrag | 结束拖拉 | 必须同时实现IDragHandler,否则失效 |
| IInitializePotentialDragHandler | OnInitializePotentialDrag | 可能发生拖拉 | 必须同时实现IDragHandler。在对象内点击就会发生 |
点击事件
| 接口 | 事件 | 作用 | 注意事项 |
|---|---|---|---|
| IPointerEnterHandler | OnPointerEnter | 鼠标进入对象 | |
| IPointerExitHandler | OnPointerExit | 鼠标离开对象 | |
| IPointerDownHandler | OnPointerDown | 按下鼠标 | |
| IPointerClickHandler | OnPointerClick | 点击中该对象 | 在OnPointerUp后发生 |
| IPointerUpHandler | OnPointerUp | 松开鼠标 |
其他事件
| 接口 | 事件 | 作用 | 注意事项 |
|---|---|---|---|
| IScrollHandler | OnScroll | 操作鼠标中间的滚轮 | |
| ISelectHandler | OnSelect | 当EventSystem选中该对象 | 使用EventSystem中的SetSelectedGameObject方法来选中 |
| IDeselectHandler | OnDeselect | 不再选中该对象 | 点击对象外的地方就会变成不选中 |
| IUpdateSelectedHandler | OnUpdateSelected | 当对象被选中,则每帧都会发生 | 对象被选中才会发生 |
| ISubmitHandler | OnSubmit | 点击Submit键(默认是Enter键) | 对象被选中才会发生 |
| ICancelHandler | OnCancel | 点击Cancel键(默认是Esc键) | 对象被选中才会发生 |
| IMoveHandler | OnMove | 点击方向键 | 对象被选中才会发生 |
| IDropHandler | OnDrop | 拖拉结束 | 拖拉开始的地方必须先实现IDragHandler,该事件在拖拉结束的对象上发生(但不能是拖拉开始的对象) |
OnDrop的一个例子:物体A上实现了IDragHandler(和IDropHandler),物体B上实现了IDropHandler。从物体A上开始Drag,在物体A上结束Drag,没有触发OnDrop;从物体A上开始Drag,在物体B上结束Drag,可以触发OnDrop。
实战 - UGUI监听事件
使用方式
- 实现一个UIEventListener类,继承自MonoBehaviour
- 在需要监听事件的UI物体上绑定UIEventListener
- 使用该类上的AddEventListener来给事件绑定回调函数
代码实现
public class TestUIListener : MonoBehaviour, IPointerClickHandler {
public delegate void GoDelegate(GameObject go);
public GoDelegate onClick;
void Start () {
}
void Update () {
}
public void AddListener(UIEventType eventType, object callBack)
{
//把回调函数转换为合适的委托函数
GoDelegate goCallBack = null;
if (callBack is LuaFunction)
{
goCallBack = delegate(GameObject obj)
{
(callBack as LuaFunction).Call(obj);
};
}
else
{
goCallBack = callBack as GoDelegate;
}
//把回调添加到点击事件上
if (eventType == UIEventType.CLICK)
{
onClick += goCallBack;
}
}
public void OnPointerClick(PointerEventData eventData)
{
if(onClick != null)
onClick(gameObject);
}
}
上述代码为了简单只实现了点击的事件监听。
Lua使用例子
local listener = TestBtn:GetComponent("TestUIListener");
listener:AddListener(UIEventType.CLICK, OnClick);
function OnClick(go)
...
end
Unity -- EventSystem完全掌握的更多相关文章
- Unity 实现物体拖拽
Unity实现拖拽: 也可以继承Unity EventSystem中的接口实现. 当鼠标按下的时候以左键为例: Using System.Collections; Using System.Colle ...
- Unity UGUI之Canvas&EventSystem
最近想写一套关于UGUI所有控件的基础使用教程系列,主要是根据本人的使用心得来写的,所以其中可能难以避免会有不正确的地方. 好了进入主题,既然是第一篇,我觉得我有必要先介绍一下UGUI必不可缺的两个组 ...
- unity API 之EventSystem.current.IsPointerOverGameObject()
命名空间 :UnityEngine.EventSystems 官方描述: public bool IsPointerOverGameObject(); public bool IsPointerOve ...
- Unity引擎GUI之Canvas和EventSystem
最近想写一套关于UGUI所有控件的基础使用教程系列,主要是根据本人的使用心得以及部分测试附带字面翻译来写的,所以其中可能难以避免会有不正确的地方. 好了进入主题,既然是第一篇,我觉得我有必要先介绍一下 ...
- unity 3D物体使用EventSystem响应事件
在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应.(可以通过UI>EventSystem创建EventSystem) EventSystem ...
- Unity事件系统EventSystem简析
相关组件和类 EventSystem 1.负责InputModule的切换(因为现在游戏大部分都只有一个StanaloneInputModule,所以切换这部分可以先不考虑). 2.负责InputMo ...
- Unity UI on the HoloLens
Following the steps under "Required configuration" will allow Unity UI to continue to work ...
- 自制Unity小游戏TankHero-2D(1)制作主角坦克
自制Unity小游戏TankHero-2D(1)制作主角坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...
- Gvr SDK for Unity 分析(一)
Gvr SDK概述 通过谷歌VR SDK for unity 为Android和iOS 构建虚拟现实应用程序 unity SDK在Android上支持构建应用程序for daydream 和 card ...
随机推荐
- Swift3.0P1 语法指南——函数
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- iOS开发——高级篇——图片轮播及其无限循环效果
平时APP中的广告位.或者滚动的新闻图片等用到的就是图片轮播这种效果,实现方式主要有两种,一种是ScrollView+ImageView,另一种则是通过CollectionView,今天总结的是Scr ...
- [转载]Java数组扩容算法及Java对它的应用
原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...
- MYSQL(二)
上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...
- C#高级编程笔记 2016年10月8日运算符和类型强制转换
1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...
- linux c 笔记-3 c语言基础知识
关键字 数据类型: 简单(7):int long short float double char enum 复杂(2):struct union 类型修饰符(8):auto unsigned sign ...
- 使用Angular2理由
1. 组件化 组件化编程是web 发展的一个趋势,Angular2提供高效简单的组件开发方式,使程序开发更加关注业务逻辑的实现,而不用关心如何加载组件和模块,如何引用及依赖注入的实现等. 如下代码所示 ...
- (转)Java中使用Jedis操作Redis
转自http://www.cnblogs.com/liuling/p/2014-4-19-04.html 使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://file ...
- 创建新用户,连接Oracle数据库
1.sys用户是最高管理员用户,那我们就用这个sys用户登录oracle:
- c语言中(*p)[n]和*p[n]的区别
写于2016年12月5日. c语言中(*p)[n]表示的数组指针,在该表达式中按照运算的优先级,首先计算()的中*p,在和[n]计算.含义为指向含有n个元素的一维数组. *p[n]表示的是指针数组,在 ...