Unity开发UGUI Button 动态绑定带参数方法

我有3个按钮,它们的功能相似,在被点击时需要为一个字段赋不同的值,分别是0,1,2。我在一个脚本里通过委托的方式为这三个按钮的OnClick事件添加带有不同参数的委托,代码如下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class  : MonoBehaviour {
 
    public Button[] buttons;
 
    
    void Start () {
        for(int i=0; i < 3; i++){
            buttons[i].onClick.AddListener(delegate { OnSelect(i); });
        }
    }
   
    // Update is called once per frame
    void Update () {
       
    }
 
    private void OnSelect(int index=0){
        Debug.Log(index);
    }
}

结果发现三个按钮点击的输出都是3,这就很奇怪了。3应该是Start里循环结束后i的值,而i作为整型应该是按值传递而非按引用传递的,怎么会三个按钮的参数全部引用的同一个变量上了呢。

后来在Unity论坛发帖问了之后(包括查阅了一下其他的Post),发现原来在C#中使用匿名委托时,会捕捉本地调用方法的完整上下文,也就意味着OnSelect的参数实际上保留着对Start方法里的i的饮用,这也是为什么三个按钮输出相同的原因。

如果要避免这一点,就应该让不同的按钮事件捕捉不同的上下文,或者是引用不同的变量。

前者可以通过下列方式实现:

void Start(){
    for(int i=0; i < 3; i++){
        int index = new int();
        index = i;
        buttons[i].onClick.AddListener(delegate { OnSelect(i); });
    }
}

后者通过创建一个新的添加监听的函数并将i作为参数传递实现:

void AddListener(Button button, int parameter)
{
   button.onClick.AddListener(delegate { OnSelect(parameter);  });
}

转自https://www.dazhuanlan.com/2020/01/31/5e33ee22648c9/

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值