介绍
封装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);
}
}
结语
这个监听器是可以任由我们拓展的,我们可以根据自己的需求来加入更多的点击事件。
今天的内容就到这里啦,有什么不对的地方请大家指点,谢谢各位的支持。我会持续更新的。😊😊😊