Unity开发通用UI事件监听器

介绍

封装UI事件,以方便对UI的一些通用操作的编写。例如:点击,鼠标按下,鼠标抬起,拖拽,开始拖拽,结束拖拽等等。

一.封装UI事件监听类

1.引入事件系统,并且继承接口(看自己需求继承),并且实现接口方法,在这里我们实现了点击拖拽
2.创建委托并且设置参数为,PointerEventData(与指针(鼠标/触摸)事件关联的事件有效负载)和object[](传递任意数量引用类型参数)
3.在实现的方法中执行委托事件

using System;
using UnityEngine;
using UnityEngine.EventSystems;

public class UIListener : MonoBehaviour,IPointerClickHandler,IPointerDownHandler,IPointerUpHandler,IDragHandler
{
    public Action<PointerEventData, object[]> onClick;
    public Action<PointerEventData, object[]> onDrag;
    public object[] args = null;
    public void OnDrag(PointerEventData eventData)
    {
        onDrag?.Invoke(eventData, args);
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        onClick?.Invoke(eventData, args);
    }
}

二.封装一个UI事件根类

1.根据在UI事件监听类中的委托事件来生成对应的添加委托侦听的方法
2.封装一个获取或者添加组件的方法(用来获取或者添加UI事件监听类到UI上)。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class UIRoot : MonoBehaviour
{
    //获取或者添加组件
    private T GetOrAddComponent<T>(GameObject go) where T : Component
    {
        T t = go.GetComponent<T>();
        if(t==null)
        {
            t = go.AddComponent<T>();
        }
        return t;
    }
    protected void OnClick(GameObject go, Action<PointerEventData, object[]> clickCB,params object[] args)
    {
        UIListener listener = GetOrAddComponent<UIListener>(go);
        listener.onClick=clickCB;
        if(args!=null)
        {
            listener.args=args;
        }
    }
    protected void OnDrag(GameObject go, Action<PointerEventData, object[]> clickCB, params object[] args)
    {
        UIListener listener = GetOrAddComponent<UIListener>(go);
        listener.onDrag = clickCB;
        if (args != null)
        {
            listener.args = args;
        }
    }
}

三.应用

当我们实例化一个UI的时候,我们就可以给他添加相应的UI事件

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class GameStart : UIRoot {
    public GameObject goods;
    void Start() {
            GameObject go = Instantiate(goods,transform);
            OnClick(go, ClickItemDown, go);
            OnDrag(go, DragItem, go);

    }

    private void ClickItem(PointerEventData ped, object[] args) {
        GameObject go = args[0] as GameObject;
        Debug.Log("Click:" + go.name);
    }
    private void DragItem(PointerEventData ped, object[] args) {
        GameObject go = args[0] as GameObject;
        Debug.Log("Drag:" + go.name);
    }

}

结语

这个监听器是可以任由我们拓展的,我们可以根据自己的需求来加入更多的点击事件。
今天的内容就到这里啦,有什么不对的地方请大家指点,谢谢各位的支持。我会持续更新的。😊😊😊
请添加图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不敲注释的呆呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值