You need to enable JavaScript to run this app. Godot开发带道具的Pong游戏:达到指定分数时的场景重置问题
优惠活动
大模型
产品
解决方案
定价
更多

Godot开发带道具的Pong游戏:达到指定分数时的场景重置问题

全局暂停后场景重置失效的核心原因
  • 执行get_tree().paused = true后,整个场景树会进入全局冻结状态,所有默认遵循Inherit运行模式的节点,其_process循环会直接停止运行。你写在_process里的重置按键检测逻辑根本没有执行机会,自然无法响应重置操作。
  • 把分数判定、重置逻辑全部堆在每帧运行的_process里,会出现时序错位:分数刚达到10分的帧立刻触发全局暂停,后续嵌在暂停逻辑块里的输入检测永远无法被执行。
可直接落地的修复方案
  1. 调整核心逻辑节点的运行优先级
    找到挂载计分、重置逻辑的节点,在检查器中定位Process > Process Mode选项,将默认的Inherit修改为When Paused。这个设置能让该节点不受全局暂停影响,哪怕整个游戏树冻结,节点的输入检测、逻辑判断依然可以正常运行。

  2. 重构逻辑放置位置,替代全量堆在_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()
    
  3. 细节避坑

    • 暂停状态下不要用持续检测按键状态的Input.is_action_pressed()做重置判断,这类方法依赖每帧轮询按键状态,容易出现触发延迟;改用event.is_action_pressed()检测单次按键触发,响应更稳定。
    • 执行reload_current_scene()前必须将get_tree().paused重置为false,否则新加载的场景会继承旧的全局暂停状态,出现进场就卡死的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 00:06:08