找回密码
 立即注册
查看: 218|回复: 0

Unity事件系统(一)

[复制链接]
发表于 2022-9-12 06:32 | 显示全部楼层 |阅读模式
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 ("Message 1 received");
    }

    public void Message2()
    {
        Debug.Log ("Message 2 received");
    }
}
答案是继承IPointerClickHandler,并重写OnPointerClick方法。
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget, IPointerClickHandler
{
    public void Message1()
    {
        Debug.Log ("Message 1 received");
    }

    public void Message2()
    {
        Debug.Log ("Message 2 received");
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Test Click");
    }
} 把这个脚本挂载到UI物体身上,就可以响应玩家的点击了。
至于消息发送,这些默认事件,都是由Unity写好的,在事件发生时会默认发送,因此我们无需关心。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-7-2 08:51 , Processed in 0.087815 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表