You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Button组件问题:OnClick事件无法添加委托,点击无响应

问题解决:Unity Button OnClick委托添加后无响应

核心原因:闭包捕获迭代变量的引用问题

你的代码里,匿名委托直接捕获了foreach循环的迭代变量employee,在Unity常用的.NET/Mono版本中,这个迭代变量是在循环外部声明的,所有生成的委托都会共享同一个变量引用。当循环结束后,这个变量要么指向最后一个Employee实例(若该实例的Upgrade()无可见效果),要么因作用域问题导致引用失效,最终点击按钮时无法正确触发预期逻辑。

而设置文本的代码是即时执行的,能直接获取当前循环中employee的Name值,因此不受闭包延迟执行的影响。

修复方案

在循环内部创建临时变量保存当前迭代的employee实例,让委托捕获这个临时变量即可:

[SerializeField] private Employee[] employees;
[SerializeField] private Transform uiList;
[SerializeField] private GameObject logPrefab;

private void OnEnable()
{
    foreach (var employee in employees)
    {
        // 创建临时变量保存当前employee实例
        var currentEmployee = employee;
        
        var obj = Instantiate(logPrefab, uiList).transform;
        var button = obj.GetChild(0).GetComponent<Button>();
        // 绑定委托时使用临时变量
        button.onClick.AddListener(() => currentEmployee.Upgrade());
       
        var nameText = obj.GetChild(1).GetComponent<TextMeshProUGUI>();
        nameText.text = employee.Name;
    }
}

额外排查点

如果修复后仍无响应,可以检查以下内容:

  • 确认obj.GetChild(0)确实包含Button组件,可添加Debug.Assert(button != null, "未找到Button组件");验证
  • 检查Button的interactable属性是否为true,是否被其他UI元素遮挡导致无法触发点击
  • 确认Employee.Upgrade()方法内部逻辑正常,可在方法开头添加Debug.Log("Upgrade方法触发");验证执行情况

内容的提问来源于stack exchange,提问作者GedJack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:17:35