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);
    }

猜你喜欢

转载自blog.csdn.net/weixin_44870508/article/details/113980175
今日推荐