EventTrigger 事件触发器

本文介绍了Unity的EventTrigger事件触发器,它是一个集成UI事件监听的组件,简化了事件处理。通过在Inspector窗口添加Event Trigger并设置响应类型,可以方便地管理UI逻辑。通常,事件监听脚本会声明委托并由Panel脚本调用以执行逻辑代码。文中还详细阐述了如何通过拖曳脚本关联和代码添加方式来设置事件监听,以及EventTrigger内部的triggers列表工作原理。使用EventTrigger可以减少代码量,提高UI事件管理的面向对象性。

1、EventTrigger 事件触发器是什么

一个EventTrigger组件,是一个集成了所有UI事件监听接口的脚本,可以让我们更方便地为控件添加事件监听

2、如何使用事件触发器

在对象的Inpector窗口中->Add Component->Event Trigger->Add New Event Type,选择响应类型

在实际应用场景上,我们为了更好地管理UI的逻辑,通常会在一个Panel中添加UI组件,通过Panel关联的脚本对其中的UI对象进行逻辑处理,而事件监听接口需要将脚本直接和相应的UI关联,如果按照常规操作,那么Panel脚本就没办法对UI对象的逻辑进行管理,这是不太方便的,因此在进行事件监听时,通常是在监听脚本中声明对应的委托/事件,并在事件监听函数中调用委托/事件,而再Panel脚本中则可以通过应用情况对监听脚本中的委托/事件添加逻辑代码,从而实现较好地管理,比如,一个长按的事件监听脚本:

/// <summary>
/// 长按按钮脚本,提供两个Event给外部,让外部去处理对应的逻辑
/// </summary>
public class LongPress : MonoBehaviour, IPointerDownHandler, IPointerUpHandler {
    public event UnityAction upEvent;
    public event UnityAction downEvent;

    public void OnPointerDown(PointerEventData eventData) {
        downEvent?.Invoke();
    }

    public void OnPointerUp(PointerEventData eventData) {
        upEvent?.Invoke();
    }
}

而在Panel脚本中:

public class GamePanel : MonoBehaviour {
    // 关联长按功能按钮
    public LongPress longPress;

    void Start() {
        longPress.downEvent += BtnDown;
        longPress.upEvent += BtnUp;
    }
   
    private void BtnUp() {
        // 鼠标抬起的逻辑代码
    }

    private void BtnDown() {
        // 鼠标按下的逻辑代码
    }    
}

那么在对UI对象上抬起和按下时,就会执行Panel脚本中实现的逻辑代码,这也差不多是事件触发器的原理


(1)拖曳脚本进行关联

参数为BaseEventData

public void TestPointEnter(BaseEventData data) {
        PointerEventData eventData = data as PointerEventData;
        print("鼠标进入 " + eventData.position);
}

步骤与之前的类似


(2)代码添加

EventTrigger中管理监听的是一个triggers列表,triggers 其实是一个Entry类型的List,其中Entry有响应事件的id枚举与对应的callback函数,通过将这些信息添加到这个List,就可以实现监听的功能

public class Lesson : MonoBehaviour {
    // 将相应UI对象的触发器进行关联
    public EventTrigger et;

    private void Start() {
        // 声明一个需要监听的事件对象,
        EventTrigger.Entry entry = new EventTrigger.Entry();
        // 声明事件的类型
        entry.eventID = EventTriggerType.PointerUp;
        // 监听函数关联
        entry.callback.AddListener((data) => {
            print("代码监听:抬起");
        });
        // 把声明好的事件对象加入到EventTrigger中
        et.triggers.Add(entry);

        // 每次添加新的监听类型都需要new一个新对象
        entry = new EventTrigger.Entry();
        // 声明事件的类型
        entry.eventID = EventTriggerType.PointerExit;
        // 监听函数关联
        entry.callback.AddListener((data) => {
            print("代码监听:离开");
        });
        // 把声明好的事件对象加入到EventTrigger中
        et.triggers.Add(entry);
    }
}

如果new了两个一样的事件监听类型也不会报错,可以通过这样添加代码,也可以通过遍历triggers的Entry,通过类型寻找,找到相应类型后直接在callback中添加相应的函数也可以

3、总结

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值