UGUI事件绑定脚本

主要的是通过实现Unity提供的接口,这里继承UnityEngine.EventSystems.EventTrigger,直接继承接口也是一样的.

using UnityEngine;
using UnityEngine.EventSystems;

class UGUIEventTriggerListener : UnityEngine.EventSystems.EventTrigger
{
    public delegate void VoidDelegate_New(GameObject go, PointerEventData eventData);
    public delegate void VoidDelegate(GameObject go);
    public VoidDelegate onClick;
    public VoidDelegate_New onDrag;
    public VoidDelegate_New onBeginDrag;
    public VoidDelegate_New onEndDrag;
    public VoidDelegate_New onDown;
    public VoidDelegate onEnter;
    public VoidDelegate onExit;
    public VoidDelegate_New onUp;
    public VoidDelegate onSelect;
    public VoidDelegate onUpdateSelect;
    public VoidDelegate onLongClick; // 长按事件

    public object parameter;
    public byte testLongClickFlag = 0; // 用于长按检测,当长按过程中同时进行了拖动,我们将取消长按事件 0:未进行长按检测或长按已经取消 1:正在测 2:长按已触发

    static public UGUIEventTriggerListener Get(GameObject go)
    {
        UGUIEventTriggerListener listener = go.GetComponent<UGUIEventTriggerListener>();
        if (listener == null) listener = go.AddComponent<UGUIEventTriggerListener>();
        return listener;
    }

    public override void OnPointerClick(PointerEventData eventData)
    {
        if (testLongClickFlag == 2) return; // 长按已经触发,则取消单击事件
        if (onClick != null) onClick(gameObject);
    }

    public override void OnPointerDown(PointerEventData eventData)
    {
        if (onDown != null) onDown(gameObject, eventData);
        if (onLongClick != null)
        {
            testLongClickFlag = 1;
            Invoke("LongClickFunc", 0.5f); // 长按0.5秒钟
        }
    }

    private void LongClickFunc()
    {
        testLongClickFlag = 2;
        if (onLongClick != null) onLongClick(gameObject);
    }

    public override void OnPointerUp(PointerEventData eventData)
    {
        if (onUp != null) onUp(gameObject, eventData);
        if (testLongClickFlag == 1)
        {
            testLongClickFlag = 0;
            CancelInvoke("LongClickFunc");
        }
    }

    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);
    }

    public override void OnDrag(PointerEventData eventData)
    {
        //Core.Log.Trace("OnEndDrag: " + eventData.pressPosition.x + "," + eventData.position.x);
        if (onDrag != null) onDrag(gameObject, eventData);
        if (testLongClickFlag == 1)
        {
            float dx = Mathf.Abs(eventData.position.x - eventData.pressPosition.x);
            float dy = Mathf.Abs(eventData.position.y - eventData.pressPosition.y);
            if (dx > 5 || dy > 5) // 如果只是手指抖动,我们不当拖动处理
            {
                testLongClickFlag = 0;
                CancelInvoke("LongClickFunc");
            }
        }
    }

    public override void OnBeginDrag(PointerEventData eventData)
    {
        if (onBeginDrag != null) onBeginDrag(gameObject, eventData);
    }

    public override void OnEndDrag(PointerEventData eventData)
    {
        if (onEndDrag != null) onEndDrag(gameObject, eventData);
    }
}

使用方法

        GameObject go = transform.Find("Test").gameObject;//对象
        UGUIEventTriggerListener.Get(go).parameter = index;//额外的参数,有没有都行
        UGUIEventTriggerListener.Get(go).onClick = OnClickCallBack;//回调方法

猜你喜欢

转载自blog.csdn.net/Marccco/article/details/128534528