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

第 20 课 · 物理引擎基础与碰撞检测

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

🎯 本课学习目标

没有碰撞,角色会穿墙。本课带你认识 Godot 物理世界,并完成第一次「碰撞检测」。

📖 详细教学步骤

物理三兄弟概念

Godot 2D 物理围绕三种物理体节点:

节点行为典型用途
StaticBody2D静止不动地面、墙壁、障碍
RigidBody2D受物理力影响箱子、弹珠、掉落的物品
CharacterBody2D代码控制移动+碰撞玩家、敌人(最常用)
Area2D感应区域(不阻挡)触发器、陷阱、捡物

碰撞形状(CollisionShape2D)概念

物理体要配合碰撞形状才有「体积」:

  1. 给物体节点添加子节点 CollisionShape2D
  2. 在检查器 Shape 属性 → 新建形状:矩形 / 圆 / 胶囊
  3. 按物体大小调整形状尺寸

💡 碰撞形状最好贴合图片轮廓,圆用圆形、角色用胶囊等。

静态地面 + 玩家完整搭建实操

  1. 在 main.tscn 加一个 StaticBody2D 命名为 Ground
  2. 给 Ground 加子节点 CollisionShape2D,形状选矩形,放在屏幕底部当「地面」
  3. 给 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 检测进入。