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

Unity ScriptableObject事件系统中Raise方法传递的布尔值在最终回调方法中始终为false的问题求助

解决Unity自定义事件系统中bool参数始终为false的问题

首先,从你的代码流程来看,GameEventListenerBool.OnEventRaised(bool value)里的value是正确的,但到ToggleMusic里就变成false,问题几乎肯定出在Unity Inspector的事件绑定环节,而不是你的C#代码逻辑。下面是具体的排查和解决步骤:

1. 检查事件绑定的参数设置

在挂载了GameEventListenerBool组件的GameObject的Inspector面板中,找到Response(BoolEvent)的绑定项:

  • 如果你是通过拖拽方法到事件列表里的,要确保没有手动设置静态参数。Unity的事件系统默认会传递动态参数,但如果不小心勾选了Static Parameters并把值设为false,就会覆盖掉你通过代码传递的value。
  • 绑定方法时,要选择带参数的重载版本:比如ToggleMusic(bool),而不是误选了无参版本(如果有的话),或者手动指定了固定的false值。

2. 验证事件绑定的传递逻辑

你可以在GameEventListenerBool里加一行日志,确认参数传递到Response之前是正确的:

public void OnEventRaised(bool value) {
    Debug.Log($"传递给Response的参数值:{value}"); // 新增日志验证
    Response.Invoke(value);
}

如果日志显示值是正确的,但ToggleMusic里还是false,那100%是Inspector里的绑定把参数固定死了。此时重新绑定方法:

  1. 移除当前的ToggleMusic绑定项
  2. 重新拖拽目标脚本到事件列表,选择ToggleMusic(bool)方法,不要修改参数设置(保持动态传递)

3. 额外的排查点

  • 确认你触发的Toggle事件资产,和监听器绑定的GameEvent是同一个对象,没有搞错事件资产。
  • 检查是否有多个GameEventListenerBool监听同一个事件,其中某个监听器的错误绑定干扰了你的测试,但这种情况概率较低。

代码优化建议(可选)

为了避免这类Inspector操作失误,你可以在GameEventListenerBool里做一点防护,比如确保Response的绑定是正确的参数类型:

[Serializable]
public class GameEventListenerBool : GameEventListener {
    [SerializeField] public BoolEvent Response;
    public void OnEventRaised(bool value) {
        if(Response != null) {
            Response.Invoke(value);
        }
    }
}

不过这只是锦上添花,核心问题还是Inspector的绑定设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:47:45