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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:14