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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:47:14