HOME / 第 3 部分 · 2D 游戏开发实战 / 第 20 课
MODULE 3 · 2D 游戏开发实战
第 20 课 · 物理引擎基础与碰撞检测
🎯 本课学习目标
- 理解 Godot 物理体系与碰撞形状
- 学会给节点添加碰撞体
- 用 Area2D 检测碰撞并触发事件
没有碰撞,角色会穿墙。本课带你认识 Godot 物理世界,并完成第一次「碰撞检测」。
📖 详细教学步骤
物理三兄弟概念
Godot 2D 物理围绕三种物理体节点:
| 节点 | 行为 | 典型用途 |
|---|---|---|
| StaticBody2D | 静止不动 | 地面、墙壁、障碍 |
| RigidBody2D | 受物理力影响 | 箱子、弹珠、掉落的物品 |
| CharacterBody2D | 代码控制移动+碰撞 | 玩家、敌人(最常用) |
| Area2D | 感应区域(不阻挡) | 触发器、陷阱、捡物 |
碰撞形状(CollisionShape2D)概念
物理体要配合碰撞形状才有「体积」:
- 给物体节点添加子节点
CollisionShape2D - 在检查器 Shape 属性 → 新建形状:矩形 / 圆 / 胶囊
- 按物体大小调整形状尺寸
💡 碰撞形状最好贴合图片轮廓,圆用圆形、角色用胶囊等。
静态地面 + 玩家完整搭建实操
- 在 main.tscn 加一个
StaticBody2D命名为 Ground - 给 Ground 加子节点 CollisionShape2D,形状选矩形,放在屏幕底部当「地面」
- 给 Ground 加子节点 ColorRect 或 Sprite2D 当「可视化地面」
(可视化层与碰撞层可以分开:一个管「看得见」,一个管「碰得到」)
用 Area2D 检测进入区域实操
在场景里加一个 Area2D(命名为 CoinArea),子节点加 CollisionShape2D(圆形)。当玩家进入时触发:
GDSCRIPTextends Area2D
func _ready():
# 进入区域时触发
body_entered.connect(_on_body_entered)
func _on_body_entered(body):
# body 是进入区域的物体
if body.name == "Player":
print("玩家进入金币区域!")
queue_free() # 删除金币(被吃掉)
调试物理:显示碰撞形状调试
运行游戏时想看碰撞框?
- 菜单 调试 → 可见碰撞形状(Visible Collision Shapes)
- 运行时会用线框画出所有碰撞形状
- 位置不对一眼看出
⚠️
物体没碰撞,直接穿透?
检查:①是否加了 CollisionShape2D;②形状是否设置;③物理体类型是否选对(如用 CharacterBody2D 才能挡玩家)。
⚠️
Area2D 的 body_entered 没触发?
确认 Area2D 有 CollisionShape2D、进入的物体有碰撞形状,且两者不在同一物理层(层级问题第 21 课讲)。
🧪 动手试一试
🏋️ 课后练习
在 main.tscn 搭一个「地面 + 金币」,玩家(CharacterBody2D,第21课)进入金币 Area2D 时,金币消失并打印'获得金币'。
金币:Area2D + CollisionShape2D(圆) + body_entered 信号 + queue_free()。
💡
打开「调试→可见碰撞形状」是排查物理问题的第一招。
💡
形状尽量简单(圆/矩形),物理性能更好,也更稳定。
🎓 本课小结
物理体系:StaticBody2D 静止、RigidBody2D 受力、CharacterBody2D 代码移动、Area2D 感应;配合 CollisionShape2D 才有碰撞体积;Area2D 用 body_entered 检测进入。