注:此文内容所使用Unity版本为5.1.1f1,在较早的版本中,代码可能略有不同,最后一行代码trigger.triggers.Add(…) 可能为 trigger.delegates.Add(…)
一直觉得用脚本给UGUI绑定事件过程很繁琐,不易记。最近发现如果对比着手动绑定事件的过程,是非常容易记住的,因为两者的过程几乎是一致的,下面对比一下:
一、先来看看手动绑定的过程:
- EventTrigger提供了很多事件,我们可以手动给任何UI元素添加一个EventTrigger(如图1),在EventTrigger中可以手动为UI添加鼠标划入、鼠标点击、鼠标划出等一系列非常丰富的事件。
2. 手动添加方法很简单直白,在EventTrigger组件中点击”Add New Event Type”,(如图2)在菜单中选择需要的事件即可添加事件。一个组件可以添加多个事件(图3即为Image对象添加了鼠标进入、鼠标划出两个事件)。
3. 添加好事件以后,在每个事件下通过点击下方的”+”按钮,为事件绑定一个侦听函数,过程很简单不再赘述。每个事件当然也可以绑定多个侦听函数(图4中我们分别为PointerEnter和PointerExit各自添加了两个侦听函数)。需要注意的是,侦听函数的参数必须是BaseEventData类型,因为它接受的是“基础的事件数据”。
二、看脚本绑定过程之前先看一下相关的几个类,他们都是包含在UnityEngine.EventSystem命名空间下:
UnityEngine.EventSystem.EventTrigger
事件触发器,就是手动绑定里第一步我们添加的EvnetTrigger组件,提供了丰富的交互事件UnityEngine.EventSystem.BaseEventData
所有新事件系统的事件类型的父类UnityEngine.EventSystem.EventTrigger.Entry
一个Entry就是一个事件类型入口,即图2中添加的一个元素。图3中包含了两个Entry。
Entry保存了事件类型信息(EventID,是EventTriggerType枚举类型)以及一个要调用的事件列表(callback,是TriggerEvent类型,需要初始化),该列表可以通过AddListener来添加多个侦听函数UnityEngine.EventSystem.TriggerEvent
一个TriggerEvent是一个可以通知多个函数的委托(通过AddListener来添加)图4中PointerEnter 这个Entry下包含的两个处理函数就是被TriggerEvent通知的两个函数,手动添加的第三步即可以对应为这里的AddListener()
三、下面看看用脚本绑定的过程:
创建一个C#脚本/类,名称随意,这里叫EventHandler。包含EvnetSystem命名空间,Using UnityEngine.EventSystem由于侦听事件必须依赖事件触发器EventTrigger组件,所以在类上方写上
[RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))]
获取EventTrigger引用
EventTrigger trigger = GetComponent();
声明2个Entry并设置其事件类型,一个设置为鼠标划入,一个设置为鼠标划出。
EventTrigger.Entry mouseInEntry = new EventTrigger.Entry(); mouseInEntry.eventID = EventTriggerType.PointerEnter; EventTrigger.Entry mouseOutEntry = new EventTrigger.Entry(); mouseOutEntry.eventID = EventTriggerType.PointerExit;
初始化Entry的callback,并分别向其中添加两个处理函数(对应手动操作是第三步,在每个事件下方点”+”添加函数。处理函数的参数是BaseEventData 类型,具体内容就略过不表)
mouseInEntry.callback = new EventTrigger.TriggerEvent(); mouseInEntry.callback.AddListener(OnMouseEnter1); mouseInEntry.callback.AddListener(OnMouseEnter2); mouseOutEntry.callback = new EventTrigger.TriggerEvent(); mouseOutEntry.callback.AddListener(OnMouseOut1); mouseOutEntry.callback.AddListener(OnMouseOut2);
最后,向trigger的triggers中添加上述两个Entry,结合第3步,对应手动操作的第三步-”Add New Event Type”。
Trigger.triggers.Add(mouseInEntry); Trigger.triggers.Add(mouseOutEntry);