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)
什么时候使用信号
跨模块通知很适合信号;若只是父子节点间的简单调用,直接方法调用通常更清晰。不要为了“解耦”把所有行为都变成难以追踪的全局事件。
状态机组织行为
当角色从移动扩展到跳跃、攻击、受伤时,大量布尔值会迅速失控。可以把每种行为封装为状态,通过 enter、update 和 exit 管理转换。
下一步
接下来会加入动画状态同步、受击反馈和一个小型测试关卡。每次只验证一个机制,能让游戏原型保持可控。