Godot开发带道具的Pong游戏:达到指定分数时的场景重置问题
全局暂停后场景重置失效的核心原因
- 执行
get_tree().paused = true后,整个场景树会进入全局冻结状态,所有默认遵循Inherit运行模式的节点,其_process循环会直接停止运行。你写在_process里的重置按键检测逻辑根本没有执行机会,自然无法响应重置操作。 - 把分数判定、重置逻辑全部堆在每帧运行的
_process里,会出现时序错位:分数刚达到10分的帧立刻触发全局暂停,后续嵌在暂停逻辑块里的输入检测永远无法被执行。
可直接落地的修复方案
调整核心逻辑节点的运行优先级
找到挂载计分、重置逻辑的节点,在检查器中定位Process > Process Mode选项,将默认的Inherit修改为When Paused。这个设置能让该节点不受全局暂停影响,哪怕整个游戏树冻结,节点的输入检测、逻辑判断依然可以正常运行。重构逻辑放置位置,替代全量堆在
_process的写法- 将分数阈值判定迁移到得分触发的回调函数中:每次执行加分操作后,立刻检查当前双方分数是否达到10分的胜利线,满足条件则直接触发全局暂停,不需要每帧重复轮询判断分数值。
- 将重置按键的检测从轮询式的
_process逻辑,迁移到输入信号回调中,同时在场景重载前主动清除全局暂停状态,避免新场景加载后默认处于冻结状态。
参考可直接运行的代码结构:
# 挂载核心逻辑的节点脚本 func _ready(): # 代码层面设置节点不受全局暂停影响,等效于检查器里的配置 process_mode = Node.PROCESS_MODE_WHEN_PAUSED PlayerSore = 0 OpponentScore = 0 # 球碰到得分区域时触发的得分回调 func _on_goal_scored(scoring_side: String): # 按得分方更新分数 if scoring_side == "player": PlayerSore += 1 else: OpponentScore += 1 # 得分后检查是否触发胜利阈值 if PlayerSore >= 10 or OpponentScore >= 10: get_tree().paused = true # 不受暂停影响的输入检测回调 func _unhandled_input(event): # 仅在全局暂停状态下响应重置按键 if get_tree().paused and event.is_action_pressed("ui_reset"): # 先解除全局暂停,再重载当前场景 get_tree().paused = false get_tree().reload_current_scene()细节避坑
- 暂停状态下不要用持续检测按键状态的
Input.is_action_pressed()做重置判断,这类方法依赖每帧轮询按键状态,容易出现触发延迟;改用event.is_action_pressed()检测单次按键触发,响应更稳定。 - 执行
reload_current_scene()前必须将get_tree().paused重置为false,否则新加载的场景会继承旧的全局暂停状态,出现进场就卡死的问题。
- 暂停状态下不要用持续检测按键状态的
内容的提问来源于stack exchange,提问作者Jacob Mutale
相关产品推荐
相关产品推荐

