|
Unity关于事件系统的介绍,个人觉得文字过于生硬,因此这两天会对这块内容进行下梳理。
我的目标是:
本文为系列文章的第一篇:Unity事件系统(一),后续会持续更新。
欢迎关注支持: @打工人小棋
第二篇文章 2022/9/11 已更新:打工人小棋:Unity事件系统(二)EventTrigger组件
官方文档:事件系统 - Unity 手册
一、事件系统介绍
事件系统:可以根据输入(即键盘、鼠标、触摸或自定义输入)将事件发送到应用程序中的对象。
稍加思考就知道需要至少由两部分构成:发送事件 和 事件处理
1. 事件处理
如何自定义事件处理的方法呢?
在 UnityEngine.EventSystems 命名空间中,有一个名为“IEventSystemHandler”的基本接口。
从此接口扩展的任何内容都可以视为通过消息系统接收事件的目标。
先自定义一个接口,这个接口里面定义一些自己要用到的方法。
public interface ICustomMessageTarget : IEventSystemHandler
{
// 可通过消息系统调用的函数
void Message1();
void Message2();
}
然后,在继承了MonoBehaviour的脚本中,去实现这些接口:
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
public void Message1()
{
Debug.Log ("Message 1 received");
}
public void Message2()
{
Debug.Log ("Message 2 received");
}
}
2. 事件发送
现在有了可接收消息的脚本之后,我们需要发出消息。
举例:在 UI 系统中,我们为 PointerEnter 和 PointerExit 等事件发出事件,还有一些其他事件。
ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());
上面的代码会在挂载上文中 CustomMessageTarget 的游戏对象上执行 Message1 方法。
ExecuteEvents 类还有其他执行函数的形式,例如在子对象或父对象中执行。
参考文档:EventSystems.ExecuteEvents.Execute
二、 默认事件
unity为我们定义了一些常用的事件:
- IPointerEnterHandler - OnPointerEnter - 当指针进入对象时调用
- IPointerExitHandler - OnPointerExit - 当指针退出对象时调用
- IPointerDownHandler - OnPointerDown - 在对象上按下指针时调用
- IPointerUpHandler - OnPointerUp - 松开指针时调用(在指针正在点击的游戏对象上调用)
- IPointerClickHandler - OnPointerClick - 在同一对象上按下再松开指针时调用
- IInitializePotentialDragHandler - OnInitializePotentialDrag - 在找到拖动目标时调用,可用于初始化值
- IBeginDragHandler - OnBeginDrag - 即将开始拖动时在拖动对象上调用
- IDragHandler - OnDrag - 发生拖动时在拖动对象上调用
- IEndDragHandler - OnEndDrag - 拖动完成时在拖动对象上调用
- IDropHandler - OnDrop - 在拖动目标对象上调用
- IScrollHandler - OnScroll - 当鼠标滚轮滚动时调用
- IUpdateSelectedHandler - OnUpdateSelected - 每次勾选时在选定对象上调用
- ISelectHandler - OnSelect - 当对象成为选定对象时调用
- IDeselectHandler - OnDeselect - 取消选择选定对象时调用
- IMoveHandler - OnMove - 发生移动事件(上、下、左、右等)时调用
- ISubmitHandler - OnSubmit - 按下 Submit 按钮时调用
- ICancelHandler - OnCancel - 按下 Cancel 按钮时调用
三、使用默认事件
上面定义的默认事件接口,就类比我们在一、消息系统介绍中说到的自定义消息接口:ICustomMessageTarget
因此使用方法可以类比:CustomMessageTarget
以下面的代码为例,我们希望这个脚本响应点击事件,怎么做呢?
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
public void Message1()
{
Debug.Log (&#34;Message 1 received&#34;);
}
public void Message2()
{
Debug.Log (&#34;Message 2 received&#34;);
}
}
答案是继承IPointerClickHandler,并重写OnPointerClick方法。
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget, IPointerClickHandler
{
public void Message1()
{
Debug.Log (&#34;Message 1 received&#34;);
}
public void Message2()
{
Debug.Log (&#34;Message 2 received&#34;);
}
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log(&#34;Test Click&#34;);
}
} 把这个脚本挂载到UI物体身上,就可以响应玩家的点击了。
至于消息发送,这些默认事件,都是由Unity写好的,在事件发生时会默认发送,因此我们无需关心。 |
|