Unity EventTrigger

一、相关知识

查看Button的源代码可以发现,就只有onClick而已,如果想要添加其它事件就必须使用EventSystem.EventTrigger和delegate(代理)
这里写图片描述
EventTrigger 总共提供了17个事件接口供我们调用
1. OnBeginDrag(PointerEventData eventData);
2. OnCancel(PointerEventData eventData);
3. OnDeselect(PointerEventData eventData);
4. OnDrag(PointerEventData eventData);
5. OnDrop(PointerEventData eventData);
6. OnEndDrag(PointerEventData eventData);
7. OnInitializePotentialDrag(PointerEventData eventData);
8. OnMove(AxisEventData eventData);
9. OnPointerClick(PointerEventData eventData);
10. OnPointerDown(PointerEventData eventData);
11. OnPointerEnter(PointerEventData eventData);
12. OnPointerExit(PointerEventData eventData);
13. OnPointerUp(PointerEventData eventData);
14. OnScroll(PointerEventData eventData);
15. OnSelect(BaseEventData eventData);
16. OnSubmit(BaseEventData eventData);
17. OnUpdateSelected(BaseEventData eventData);

这里写图片描述

二、代码实战

仅需要配置PerformClick.cs的public对象,就不需要用传统的方法对每个button绑定事件了。

传统的方法如下
这里写图片描述

EventTriggerListener.cs

using UnityEngine;
using UnityEngine.EventSystems;

public class EventTriggerListener : EventTrigger {
    public delegate void VoidDelegate(GameObject obj);

    public VoidDelegate onClick;
    public VoidDelegate onDown;
    public VoidDelegate onUp;
    public VoidDelegate onEnter;
    public VoidDelegate onExit;
    public VoidDelegate onSelect;
    public VoidDelegate onUpdateSelect;//关联更新

    public static EventTriggerListener Get(GameObject obj)
    {
        //这样就不需要为每个按钮添加脚本了
        EventTriggerListener listener = obj.GetComponent<EventTriggerListener>();
        if(listener == null)
        {
            listener = obj.AddComponent<EventTriggerListener>();
        }
        return listener;
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (onDown != null) onDown(gameObject);
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (onUp != null) onUp(gameObject);
    }

    public override void OnPointerClick(PointerEventData eventData)
    {
        if(onClick != null) onClick(gameObject);
    }

    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (onEnter != null) onEnter(gameObject);
    }

    public override void OnPointerExit(PointerEventData eventData)
    {
        if (onExit != null) onExit(gameObject);
    }

    public override void OnSelect(BaseEventData eventData)
    {
        if (onSelect != null) onSelect(gameObject);
    }

    public override void OnUpdateSelected(BaseEventData eventData)
    {
        if (onUpdateSelect != null) onUpdateSelect(gameObject);
    }
}

PerformClick.cs

using UnityEngine;
using UnityEngine.UI;

public class PerformClick : MonoBehaviour {
    public Button btn;

    // Use this for initialization
    void Start () {
        EventTriggerListener listener = EventTriggerListener.Get(btn.gameObject);
        listener.onClick = OnBtnClick;
        listener.onEnter = OnBtnEnter;
    }

    private void OnBtnEnter(GameObject obj)
    {
        Debug.Log("enter");
    }

    private void OnBtnClick(GameObject obj)
    {
        Debug.Log("click");
    }
}

猜你喜欢

转载自blog.csdn.net/chy555chy/article/details/79175885
今日推荐