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;//回调方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值