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 parm);
private ClickCallBack mCallBack;
private object mPram;
public static void AddCallBack(Transform trans,ClickCallBack callBack,object pram)
{
//TODO 引用SetCallBack进行方法的绑定
ClickListener cl= trans.GetComponent<ClickCallBack>();
if(cl==null)
{
Debug.Log("----------GetComponentFailed----------");
}
SetCallBack(callBack,pram);
}
public void SetCallBack(ClickCallCack callBack,object pram)
{
//通过UIManager中调用AddCallBack来进行委托的绑定
mCallBack=callBack;
mPram=pram;
}
public void OnPointerClick(PointerEventData eventData)
{
//触发事件
Debug.Log("------ClickTrigger------");
mCallBack(transform,pram);
}
}
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 pram)
{
Debug.Log("---------btn1Click----------");
}
}
总结
这个点击方法,适用于所有的UI元素,只需要通过给UI元素添加ClickListener组件,并且在管理器中添加监听和注册方法即可!
补充:如果需要3D物体也有按钮点击响应,可以直接在ClickListener.cs中添加函数OnMouseClick();因为OnPointerClick()只对UI有响应,OnMouseClick()只对3D物体响应;故两者放在ClickListener.cs中不会冲突
private void OnMouseClick()
{
Debug.Log("------OnMouseClick--------");
mCallBack(transform, mPram);
}