Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

碰撞形状(2D)

本指南介绍以下内容:

  • Godot 中可用于 2D 的碰撞形状类型。

  • 使用转换为多边形的图像作为碰撞形状。

  • 有关 2D 碰撞的性能注意事项。

Godot 提供了多种碰撞形状,它们在性能和精度方面各有权衡。

你可以通过添加一个或多个 CollisionShape2DsCollisionPolygon2Ds 作为直接子节点来定义 PhysicsBody2D 的形状。间接子节点(即子节点的子节点)会被忽略,不会用作碰撞形状。另外请注意,你必须在检查器面板中为碰撞形状节点添加一个 Shape2D 资源

备注

当你为单个 PhysicsBody2D 添加多个碰撞形状时,不必担心它们会重叠。它们不会相互“碰撞”。

基本碰撞形状

Godot 提供以下基本碰撞形状类型:

你可以使用一个或多个基本形状来表示大多数较小物体的碰撞。但是,对于更复杂的物体,例如大型飞船或整个关卡,你可能需要使用凸形或凹形。下面会有更详细的介绍。

我们建议动态物体(如 RigidBody 和 CharacterBody)优先使用基本形状,因为它们的行为最可靠,通常也能提供更好的性能。

凸形碰撞形状

警告

Godot 目前没有提供创建 2D 凸形碰撞形状的内置方法。本节内容主要供参考。

凸碰撞形状是基本碰撞形状和凹碰撞形状之间的折衷方案。它们可以表示任何复杂程度的形状,但有一个重要的限制。顾名思义,单个形状只能表示形状。例如,金字塔是的,而空心盒子是的。要用单个碰撞形状定义凹形物体,你需要使用凹碰撞形状。

根据物体的复杂程度,使用多个凸形而不是一个凹形碰撞形状可能会获得更好的性能。Godot 允许你使用凸分解来生成与空心物体大致匹配的凸形。请注意,超过一定数量的凸形后,这种性能优势就不复存在了。对于像整个关卡这样的大型复杂物体,我们建议使用凹形。

凹形或三角网格碰撞形状

凹碰撞形状(也称为三角网格碰撞形状)可以呈现任何形式,从几个三角形到数千个三角形不等。凹形是性能最差的选项,但在 Godot 中也是最精确的。你只能在 StaticBody 中使用凹形。除非 RigidBody 的模式设置为 Static,否则它们不适用于 CharacterBody 或 RigidBody。

备注

尽管凹形提供了最精确的碰撞,但接触报告的精度可能不如基本形状。

在不使用 TileMap 进行关卡设计时,凹形是关卡碰撞的最佳方法。

你可以在检查器中配置 CollisionPolygon2D 节点的 Build Mode。如果设置为 Solids(默认),碰撞将包括多边形及其内部区域。如果设置为 Segments,碰撞将仅包括多边形的边缘。

你可以通过选择 Sprite2D 节点并使用 2D 视口顶部的 Sprite2D 菜单,在编辑器中生成凹碰撞形状。Sprite2D 菜单下拉列表中有一个名为创建 CollisionPolygon2D 同级节点的选项。点击它后,会显示一个包含 3 个设置的菜单:

  • 简化:值越大,生成的形状细节越少,这会以精度为代价提升性能。

  • 收缩(像素):值越大,生成的碰撞多边形相对于精灵边缘的收缩程度越大。

  • 扩展(像素):值越大,生成的碰撞多边形相对于精灵边缘的扩展程度越大。请注意,将“扩展”和“收缩”设置为相等的值,产生的结果可能与将两者都设置为 0 时不同。

备注

如果你的图像包含许多小细节,建议创建一个简化版本并用它来生成碰撞多边形。这样可以带来更好的性能和游戏体验,因为玩家不会被细小的装饰性细节阻挡。

要使用单独的图像生成碰撞多边形,可以创建另一个 Sprite2D 节点,从中生成碰撞多边形同级节点,然后移除 Sprite2D 节点。这样就可以将细小细节排除在生成的碰撞之外。

性能注意事项

每个 PhysicsBody 并不局限于一个碰撞形状。不过,我们建议尽量减少形状数量以提升性能,尤其是对于 RigidBody 和 CharacterBody 这类动态物体。此外,避免对 CollisionShape 进行平移、旋转或缩放,以便从物理引擎的内部优化中受益。

当在 StaticBody 中使用单个未经变换的碰撞形状时,引擎的 broad phase(粗略检测)算法可以忽略不活跃的 PhysicsBody。这样 narrow phase(精确检测)就只需考虑活跃物体的形状。如果 StaticBody 有多个碰撞形状,broad phase 就会失效。速度较慢的 narrow phase 就必须对每个形状执行碰撞检查。

如果遇到性能问题,你可能需要在精度方面做出妥协。大多数游戏的碰撞都不是 100% 精确的。它们会找到巧妙的方法来隐藏这一点,或者让它在正常游戏过程中不易被察觉。