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

2021.03.01:之前代码有些错误,现在重新改好了!可以直接Copy拿去用了!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Unity中,委托事件是用于处理对象间的消息传递和回调机制的重要工具。它们适合在以下情况下使用: 1. 回调函数:当一个对象需要在某个特定事件发生时通知其他对象,并且这些对象需要执行相应的操作时,可以使用委托事件。通过定义一个委托类型和事件,其他对象可以注册并提供相应的回调函数,以便在事件发生时被调用。 2. 解耦逻辑:委托事件可以帮助解耦游戏对象之间的逻辑关系。例如,在一个游戏中,当玩家击败敌人时,可以使用事件来通知其他对象(如计分系统)更新分数,而无需硬编码对特定对象的直接引用。 3. 扩展性和灵活性:委托事件使用可以增加代码的扩展性和灵活性。通过使用委托事件,你可以轻松地添加、删除或替换事件的订阅者,而不需要修改事件的发生者或其他相关代码。 4. 异步操作:当需要在异步操作完成后执行回调时,委托事件也非常有用。例如,在资源加载完成后执行某个操作,可以使用委托事件来处理相关的回调。 需要注意的是,委托事件应该在恰当的时候使用,并不是所有情况都适合使用它们。在一些简单的场景中,直接调用方法可能更加简洁和高效。此外,当需要处理大量的订阅者时,需要注意事件的性能和内存消耗。 总结起来,委托事件适合用于处理对象间的消息传递、回调机制、解耦逻辑以及异步操作等情况,可以提高代码的扩展性、灵活性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值