【C#】【UGUI】委托的参数是委托:弹出确认面板的回调函数

引言

我们经常碰到这样一个需求:用户点击了“删除”按钮,此时需要弹出一个“确认删除”的面板。根据用户点击的是“确认”还是“取消”,决定是执行“删除”操作还是什么都不做。
在这里插入图片描述
如果是你,接到这个需求会怎么做?

暴力的做法

如果是以前,我会这样做:

  • 获取到"btn_delete",向它添加一个回调函数,打开"confirm_delete_panel"。
  • 接着获取到"btn_confirm"和"btn_cancel",分别向它俩添加一个回调函数。
  • 由于在UGUI中,button的默认回调函数是没有参数的,所以,我可能会再定义一个bool值"b_confirm_delete",通过设置这个bool值,再由控制业务逻辑的脚本根据此bool值进行下一步操作。

这样的话,我要写3个函数,1个bool值。思路上也是很繁琐。

使用委托

1.定义一个弹出"confirm_delete_panel"的委托。

public System.Action<System.Action<bool>> ShowPopupConfirmDeleteObject = null;

2.向此委托添加监听函数:

void Start(){
	//向委托添加监听函数
	LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject += ShowPopupConfirmDeleteObject;
}

3.点击"btn_delete"后,执行弹出"confirm_delete_panel"的委托。

由于ShowPopupConfirmDeleteObject的参数也是一个委托,所以此时我们定义一个匿名函数:

根据输入的bool值,来决定是否执行“删除”操作。

private void OnSelectedObjectDeleteBtn(object p_obj, System.EventArgs p_args)
{
	if (m_GUI3dObject.SelectedObject != null)
	{
		if (LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject != null)
		{
			// show confirm delete popup
			//调用委托,填入参数(另一个函数)
			LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject.Invoke
			(
				(bool p_isDeleteConfirmed)=>
				{
					// delte object if confirmed
					if (p_isDeleteConfirmed)m_GUI3dObject.Delete();
				}
			);
		}
		else
		{
			Debug.LogError(" ");
		}
	}
	else
	{
		Debug.LogError(" ");
	}
}

4.执行的委托时,真正执行的监听函数:

由于监听函数可以拿到参数,所以可以执行参数所代表的的函数。将按钮对应的bool值传入,就真正执行了委托传入的匿名函数。

private void ShowPopupConfirmDeleteObject(System.Action<bool> p_confirmCallback)
{	
    confirm_delete_box.gameObject.SetActive(true);
    btn_confirm.onClick.AddListener(() =>
    {
    	//调用上述委托的时候,也可以再次调用委托中传过来的参数
        p_confirmCallback(true);//按下确认键,调用该函数,传入true
        confirm_delete_box.gameObject.SetActive(false);
    });
    btn_cancel.onClick.AddListener(() =>
    {
        p_confirmCallback(false);
        confirm_delete_box.gameObject.SetActive(false);
    });
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值