HOME / 第 3 部分 · 2D 游戏开发实战 / 第 25 课
MODULE 3 · 2D 游戏开发实战

第 25 课 · 游戏状态管理

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 3 部分 · 2D 游戏开发实战

🎯 本课学习目标

游戏需要知道「现在在干什么」:正在玩、暂停了、结束了。本课用状态机思路管理游戏状态。

📖 详细教学步骤

什么是游戏状态?概念

大多数游戏都有几种状态

  • PLAYING 进行中:玩家可操作
  • PAUSED 暂停:一切停止
  • GAME_OVER 结束:玩家死亡/过关

用状态变量控制「哪些逻辑生效」,是管理复杂游戏的关键。

用枚举定义状态代码

在根节点脚本定义状态枚举:

GDSCRIPTextends Node2D

enum GameState { PLAYING, PAUSED, GAME_OVER }
var state: GameState = GameState.PLAYING

func _process(delta):
    match state:
        GameState.PLAYING:
            # 进行中的逻辑
            pass
        GameState.PAUSED:
            # 暂停时不做任何更新
            pass
        GameState.GAME_OVER:
            pass

func set_state(new_state: GameState):
    state = new_state
    print("当前状态:", state)

实现暂停代码

Godot 有内置暂停:get_tree().paused = true。把要「暂停时也动」的节点勾选 Process Mode = Always(检查器 Node → Process):

GDSCRIPTfunc _unhandled_input(event):
    # 按 Esc 暂停/继续
    if event.is_action_pressed("pause"):
        toggle_pause()

func toggle_pause():
    if state == GameState.PLAYING:
        state = GameState.PAUSED
        get_tree().paused = true
    elif state == GameState.PAUSED:
        state = GameState.PLAYING
        get_tree().paused = false

暂停菜单的节点处理实操

  1. 场景里放一个「暂停面板」(Control + Panel),默认隐藏
  2. 暂停时显示它:pause_panel.visible = true
  3. 给它挂脚本,把 Process Mode 设为 Always,这样暂停时按钮仍可点击
  4. 按钮「继续」→ 调用 toggle_pause()

游戏结束状态代码

玩家死亡时切到结束状态:

GDSCRIPTfunc game_over():
    state = GameState.GAME_OVER
    get_tree().paused = true
    game_over_panel.visible = true
    print("游戏结束")
⚠️
暂停后按钮点不了?

暂停会停掉所有默认节点。给 UI/按钮设 Process Mode = Always(或 When Paused)。

⚠️
暂停后物理还动?

get_tree().paused = true 会暂停大多数处理;确实需要继续的节点单独设 Process Mode。

🧪 动手试一试

🏋️ 课后练习

用枚举实现 PLAYING/PAUSED 状态,按 P 键暂停并显示暂停面板,再按 P 恢复。

创建 pause 动作绑定 P;get_tree().paused 切换;面板 Process Mode=Always。

💡

状态机思想(枚举 + match)几乎适用所有游戏,务必掌握。

💡

把暂停逻辑集中在 Game 根节点脚本,方便统一管理。

🎓 本课小结

游戏状态用枚举+match 管理;get_tree().paused 实现暂停;暂停时仍要响应的节点设 Process Mode=Always。