← 返回博客

Godot 2D游戏开发学习笔记

从场景树、信号到角色状态机,整理 Godot 2D 项目起步阶段最重要的几个概念。

Godot 2D游戏开发学习笔记 封面

Godot 的节点与场景模型很适合快速组合 2D 游戏。本文记录一个角色控制原型中的核心概念。

场景不是关卡文件

场景更接近“可复用对象”。角色、子弹、UI 面板都可以是独立场景,再实例化到主关卡中。每个场景内部是一棵节点树:

Player (CharacterBody2D)
├── AnimatedSprite2D
├── CollisionShape2D
└── Camera2D

清晰的场景边界能避免主场景不断膨胀,也便于单独运行和调试。

角色移动

_physics_process 中读取输入,设置速度后调用 move_and_slide()

extends CharacterBody2D

@export var speed := 220.0

func _physics_process(_delta: float) -> void:
    var direction := Input.get_vector("left", "right", "up", "down")
    velocity = direction * speed
    move_and_slide()

使用 Input Map 而不是直接判断键盘按键,后续接入手柄或允许玩家改键会更轻松。

用信号降低耦合

信号允许节点广播事件,而不必知道接收方是谁。例如角色生命值变化时发出事件,UI 只负责监听:

signal health_changed(current: int, maximum: int)

什么时候使用信号

跨模块通知很适合信号;若只是父子节点间的简单调用,直接方法调用通常更清晰。不要为了“解耦”把所有行为都变成难以追踪的全局事件。

状态机组织行为

当角色从移动扩展到跳跃、攻击、受伤时,大量布尔值会迅速失控。可以把每种行为封装为状态,通过 enterupdateexit 管理转换。

下一步

接下来会加入动画状态同步、受击反馈和一个小型测试关卡。每次只验证一个机制,能让游戏原型保持可控。