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

Unity3D观察者模式失效问题:手枪脚本事件响应异常排查

问题原因及解决方法

第一种写法无响应的原因

要么是事件仅在Awake/Start中绑定一次,但在OnDisable里执行了解绑,后续组件再次激活时未重新绑定;要么是枪口物体初始处于失活状态,Awake/Start未执行,事件从未完成绑定。

解决方法

将事件绑定逻辑移到OnEnable中,解绑逻辑移到OnDisable中,确保组件每次激活都绑定事件,失活时自动解绑:

void OnEnable()
{
    Debug.Log("Pistol enabled");
    EventManager.OnSpeedIncrease += PistolSpeedIncrease;
}

void OnDisable()
{
    Debug.Log("Pistol disabled");
    EventManager.OnSpeedIncrease -= PistolSpeedIncrease;
}

void PistolSpeedIncrease()
{
    Debug.Log("Speed increased!");
}

第二种Lambda写法重复触发的原因

Lambda属于匿名委托,每次使用+= () => ...都会生成全新的委托实例。你在OnDisable里试图解绑的是另一个新创建的Lambda实例,无法移除之前绑定的委托,导致每次激活都新增一个绑定,事件触发时就会重复执行。

解决方法

提前将Lambda赋值给一个委托变量,绑定和解绑都操作这个变量,保证处理的是同一个实例:

private Action _speedIncreaseHandler;

void Awake()
{
    _speedIncreaseHandler = () => PistolSpeedIncrease();
}

void OnEnable()
{
    Debug.Log("Pistol enabled");
    EventManager.OnSpeedIncrease += _speedIncreaseHandler;
}

void OnDisable()
{
    Debug.Log("Pistol disabled");
    EventManager.OnSpeedIncrease -= _speedIncreaseHandler;
}

void PistolSpeedIncrease()
{
    Debug.Log("Speed increased!");
}

额外注意点

  • 不要在Awake/Start中绑定需要随组件激活状态变化的事件,这两个生命周期仅执行一次,无法适配频繁激活失活的场景。
  • 确认事件本身逻辑正常(比如是Action类型的静态事件,未被其他代码误修改)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:53:20