Unity/C#观察者模式问题:升级按钮TurnOff方法无法生效
问题分析与解决方案
一、先解决TurnOff()失效的核心问题
你当前的事件传递逻辑是正常的(扣积分、加倍率都能执行),说明upgradeButton的引用没问题,失效大概率出在TurnOff()方法本身或者外部干扰:
1. 检查TurnOff()的实现是否正确
确保方法确实在修改按钮的可见/交互状态,比如:
// UpgradeButton.cs 中正确的TurnOff实现示例 public void TurnOff() { // 直接禁用整个按钮对象(最彻底的隐藏方式) gameObject.SetActive(false); // 如果只是想禁用点击、保留灰色显示,用下面的写法: // Button btn = GetComponent<Button>(); // btn.interactable = false; // GetComponent<Image>().color = new Color(0.5f, 0.5f, 0.5f); }
如果你的TurnOff()只是修改了局部UI组件(比如隐藏文本但没禁用按钮对象),就会出现逻辑执行但按钮没消失的情况。
2. 验证TurnOff()是否被实际调用
在TurnOff()里加日志,确认方法是否触发:
public void TurnOff() { Debug.Log($"[{gameObject.name}] TurnOff执行"); gameObject.SetActive(false); }
如果日志打印了但按钮没变化,说明有其他脚本在修改该按钮的active状态(比如父物体被禁用、或者其他UI管理脚本强制重置状态)。
3. 排查外部干扰
检查按钮所在的父物体是否被设置为inactive,或者有没有其他脚本(比如UI布局、状态控制脚本)在自动恢复按钮的显示状态。
二、关于观察者模式的适用性
这个场景非常适合用观察者模式,你之前的直接调用方式耦合度极高——新增预制体按钮时要逐个绑定管理器方法,而观察者模式刚好解决了这个痛点:
- 按钮只需要负责触发
OnUpgrade事件,不用关心谁来处理; - 管理器只需要监听一次事件,所有升级按钮的点击都会统一处理;
- 新增预制体时,只需要挂载
UpgradeButton脚本,无需额外配置,维护成本极低。
三、额外优化建议
静态事件存在内存泄漏风险,记得在UpgradeManager销毁时取消订阅:
// UpgradeManager.cs private void OnDestroy() { UpgradeButton.OnUpgrade -= UpgradeClick; }
否则场景切换或管理器销毁后,事件引用依然存在,可能导致空引用异常或内存泄漏。
内容的提问来源于stack exchange,提问作者Shadykhaos
相关产品推荐
相关产品推荐

