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里的绑定把参数固定死了。此时重新绑定方法:
- 移除当前的
ToggleMusic绑定项 - 重新拖拽目标脚本到事件列表,选择
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
相关产品推荐
相关产品推荐

