Unity使用委托完成点击事件注册
一、需要创建2个脚本
1.ClickListener .cs
2.UIManager.cs
二、具体步骤
1.ClickListener
首先要确定ClickListener中需要干什么!
1.1
我们需要定义一个委托,这个委托ClickCallBack有两个参数,一个Transform类型,一个object类型,再定义两个私有的全局变量ClickCallBack mCallBack、object mParm
// An highlighted block
public delegate void ClickCallBack(Transform t, object parm);
private ClickCallBack mCallBack;
private object mParm;
1.2
定义三个方法:
- AddCallBack(Transform trans,ClickCallBack callBack,object parm) //外部进行回调田添加用的
- SetCallBack(ClickCallBack callBack,object parm)//内部进行设置
- OnPointerClick(PointerEventData eventData)//点击触发事件
注意:第三个OnPointerClick是从接口IPointerClickHandle中实现的
using UnityEngine;
using UnityEngine.EventSystems;
public class ClickListener : MonoBehaviour, IPointerClickHandler
{
public delegate void ClickCallBack(Transform t, object param);
private ClickCallBack mCallBack;
private object mParam;
public void SetCallBack(ClickCallBack callBack,object param)
{
//通过UIManager中调用AddCallBack来进行委托的绑定
mCallBack = callBack;
mParam = param;
}
public void OnPointerClick(PointerEventData eventData)
{
//触发事件
Debug.Log("------ClickTrigger------");
mCallBack(transform, mParam);
}
public static void AddCallBack(Transform trans,ClickCallBack callBack,object param)
{
//TODO 引用SetCallBack进行方法的绑定
ClickListener cl = trans.GetComponent<ClickListener>();
if (cl == null)
{
Debug.Log("----------GetComponentFailed----------");
}
cl.SetCallBack(callBack, param);
}
}
2.UIManager
2.1给需要注册监听的物体声明并绑定方法
声明一个需要进行监听绑定的变量 Transform btn1;还有一个处理逻辑(触发)的方法
using UnityEngine;
public class UIManager : MonoBehaviour
{
public Transform btn1;
private void Awake()
{
ClickListener.AddCallBack(btn1, OnBtn1Click, null);
}
// 这里的参数必须和定义的委托保持一致
public void OnBtn1Click(Transform trans,object param)
{
Debug.Log("---------btn1Click----------");
}
}
总结
这个点击方法,适用于所有的UI元素,只需要通过给UI元素添加ClickListener组件,并且在管理器中添加监听和注册方法即可!
补充:如果需要3D物体也有按钮点击响应,可以直接在ClickListener.cs中添加函数OnMouseDown();因为OnPointerClick()只对UI有响应,而OnMouseDown()只对带有碰撞器的物体响应;两者放在ClickListener.cs中不会冲突
private void OnMouseDown()
{
Debug.Log("------OnMouseDown--------");
mCallBack(transform, mPram);
}