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
相关产品推荐
相关产品推荐

