UGUI的事件机制

UGUI使用了新的event机制,我们之前在NGUI中,为了处理ui的交互,通常是在ui组件挂载的mono上写onclick(),onpress()这些函数,换到ugui后,unity使用了新的event 机制。但是unity的文档解释的很乱,这里整理一下。


这里面有个主要的模块:

 EventSystem,全局需要有一个,我们创建一个ui会自动生成一个,这是整个事件系统的管理器,通常不需要特殊设置它的参数

InputModule,他是用来管理输入设备的输入事件,提供一个抽象层,默认在创建ui时会生成一个StandartInputModule,这是针对鼠标键盘的输入管理,如果要支持触控的移动设备,我们需要再加一个TouchInputModule,可以同时加几个input module,EventSystem会根据设备自动选择。


RayCaster,他等于是一个事件的检测器,因为ugui也是3Dui,所有的触碰选择都涉及到射线cast,所以在每个canvas上要放置一个CanvasRayCast,这个canvas上的ui就可以进行事件检测,以发出事件,注意ui本身是不需要加入包围盒组件的(NGUI的做法)


 然后就是事件的产生和处理,ugui的方式有些类似QT,他有一个事件event,一个事件的处理器handler,event加入handler进行listen,当event发生时,handler就会执行,这样event和handler就连接在了一起,

事件的定义

event的类型是是UnityEngine.EventSystem.EventtriggerType,我们看下所有支持的event


这里有很多的pointer事件,所谓了pointer就是对鼠标和触控的统一抽象,在鼠标下鼠标,在触控下是触控,如pointerdrag,是鼠标或者触屏的拖拽。


事件的产生

unity的事件是系统负责产生的,我们不能自己模拟,比如当一个按钮上触发了一个click,unity会自动发出来自这个按钮的click事件


事件和handler的连接触发方式

1对于某些ui组件,可以直接设置其对自己产生的事件的handler,如button的onpointerclick

2.对于任何ui组件,都可以使用eventtrigger这个component,这个trigger放置在产生事件的UI组件上,里面包含了一个事件的类型,以及这个类型关联的处理函数,处理函数可以使用两种函数参数,一种是使用int string简单类型,一种是使用BaseEventData类型,因为当event发生时,会跟随者把这个事件包装成一个PointerEventData类型的参数送进来,里面包含ui事件的详细信息,包括鼠标在哪,而对于前一种简单类型,在编辑器上可以填写当事件发生时传什么参数,这就好比qt的signal和slot连接。

3.强制让某个事件发生在某个handler上(也就是强制某个handler执行):调用ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());

这个调用将执行target身上所有继承 了ICustomMessageTarget接口的mono的Message1函数,个人认为这个和给target发送Message1 的sendmessage没什么区别,可能是我还没有立即好这个接口。


以上就是在ugui中使用新的event系统进行ui的交互的原理和做法。




posted on 2016-06-16 20:28  leonwei  阅读(424)  评论(0编辑  收藏  举报