UG3L12——EventTrigger 事件触发器

EventTrigger

事件触发器是EventTrigger​组件,它是一个集成了上节课中学习的所有事件接口的脚本
它可以让我们更方便的为控件添加事件监听

EventTrigger​可以让我们写更少的代码,可以在面板类中处理面板控件的事件逻辑,更加的面向对象,便于管理

如何使用事件触发器

需要声明一个参数为 BaseEventData​ 类型的方法,参数用来表示本次监听事件的具体数据(例如点击时间位置等)
可以根据使用的监听类型,将参数 as​ 成其派生类(例如用于 PointerEnter​ 的函数可以将参数 as​ 成 PointerEventData​ 使用)

  1. 拖脚本进行关联

    假设要为按钮添加一个监听鼠标进入的事件

    在Add New Event Type之后,在脚本内根据要求写好函数,然后将脚本挂载到某个对象(不一定要挂载到自己上)
    将挂载脚本的对象拖入左下角的参数上,再选择拖入对象上的函数,
    注意!需要选择动态参数类型的函数,否则参数不能获取到监听事件数据

    image

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    using UnityEngine;
    using UnityEngine.EventSystems;

    public class Lesson19 : MonoBehaviour
    {
    public void TestPointEnter(BaseEventData data)
    {
    PointerEventData eventData = data as PointerEventData;
    print("鼠标进入" + eventData.position);
    }
    }
  2. 代码添加

    假设要为按钮添加一个监听鼠标按下后抬起的事件

    1. 首先需要申明一个希望监听的事件对象,类型为Entry​,是EventTrigger​的内部类
      设置好Entry​的监听类型(eventID​,EventTriggerType​即监听类型的枚举)和回调函数(callback​)

      1
      2
      3
      4
      5
      6
      EventTrigger.Entry entry = new EventTrigger.Entry();
      entry.eventID = EventTriggerType.PointerUp; //这是监听鼠标指针抬起的事件
      entry.callback.AddListener((data) =>
      {
      print("抬起");
      });
    2. 将该Entry​添加到EventTrigger​的triggers​当中(triggers​本质是Entry​类型的列表List<EventTrigger.Entry>​)

      1
      2
      EventTrigger eventtrigger = GetControl<Button>("btnStart").gameObject.AddComponent<EventTrigger>();
      eventTrigger.triggers.Add(entry);

    如果有相同监听类型的函数要添加,可以重新声明一个对象,但这样较浪费内存
    可以直接 在同监听类型的Entry​添加到列表前 再添加一个回调函数
    也可以先遍历一遍列表,得到监听类型相同的Entry​,直接再往该Entry​的回调函数添加函数即可,
    要注意该事件监听器队列是否真的有这种类型的****​Entry!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //重复步骤的
    EventTrigger.Entry entry = new EventTrigger.Entry();
    entry.eventID = EventTriggerType.PointerUp;
    entry.callback.AddListener((data) =>
    {
    print("抬起");
    });
    //重复添加函数的步骤
    entry.callback.AddListener((data) =>
    {
    print("抬起2");
    });

    eventTrigger.triggers.Add(entry);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //遍历列表的,要注意该事件监听器队列是否真的有这种类型的Entry!
    foreach (var entry in eventTrigger.triggers)
    {
    if (entry.eventID == EventTriggerType.PointerUp)
    {
    entry.callback.AddListener((data) =>
    {
    print("抬起3");
    });
    }
    }