Unity中使用Unity Events修改变量后Update函数未持久化问题
Unity按键检测变量不更新问题排查
我用Unity的Invoke Unity Events检测用户按下/按住按钮,RespawnInput函数已触发,且将respawnHeld设为true,但Update函数的日志始终显示该变量为false,找不到任何重置它的代码。
代码示例
private bool respawnHeld; // Update is called once per frame void Update() { Debug.Log($"In Update Function RespawnHeld is {respawnHeld}"); } public void RespawnInput(InputAction.CallbackContext callbackContext) { Debug.Log("SETTING RESPAWN HELD TO TRUE"); respawnHeld = true; Debug.Log($"In RespawnInput Function RespawnHeld is {respawnHeld}"); }
按下按键'R'后,预期Update日志显示In Update Function RespawnHeld is True,但实际并非如此:
排查方案
验证脚本实例一致性:如果脚本被重复挂载(同一物体多实例/多物体挂载),可能出现回调触发的是A实例变量,Update输出的是B实例变量。在日志中添加物体名称区分:
Debug.Log($"[{gameObject.name}] In Update Function RespawnHeld is {respawnHeld}"); Debug.Log($"[{gameObject.name}] In RespawnInput Function RespawnHeld is {respawnHeld}");对比两条日志的物体名称是否一致。
检查Input Action回调阶段:在RespawnInput中打印回调阶段,确认是否存在意外触发的
Canceled(松开)阶段导致变量被间接修改:Debug.Log($"Callback phase: {callbackContext.phase}");若存在
Canceled触发,需确认是否有其他逻辑绑定了该动作的松开事件。全局排查变量修改:在Unity编辑器中全局搜索
respawnHeld,检查是否有其他脚本引用并修改该变量;也可给变量添加[SerializeField],在Inspector面板实时监控值的变化。确认脚本状态:确保绑定Input Event的脚本实例与执行Update的脚本实例为同一个,且均处于启用状态。
内容的提问来源于stack exchange,提问作者MisterZeeba
相关产品推荐
相关产品推荐

