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.
Checking the stable version of the documentation...
碰撞形状(2D)
本指南介绍以下内容:
Godot 中可用于 2D 的碰撞形状类型。
使用转换为多边形的图像作为碰撞形状。
有关 2D 碰撞的性能注意事项。
Godot 提供了多种碰撞形状,它们在性能和精度方面各有权衡。
你可以通过添加一个或多个 CollisionShape2Ds 或 CollisionPolygon2Ds 作为直接子节点来定义 PhysicsBody2D 的形状。间接子节点(即子节点的子节点)会被忽略,不会用作碰撞形状。另外请注意,你必须在检查器面板中为碰撞形状节点添加一个 Shape2D 资源。
备注
当你为单个 PhysicsBody2D 添加多个碰撞形状时,不必担心它们会重叠。它们不会相互“碰撞”。
基本碰撞形状
Godot 提供以下基本碰撞形状类型:
SeparationRayShape2D(专为角色设计)
WorldBoundaryShape2D(无限平面)
你可以使用一个或多个基本形状来表示大多数较小物体的碰撞。但是,对于更复杂的物体,例如大型飞船或整个关卡,你可能需要使用凸形或凹形。下面会有更详细的介绍。
我们建议动态物体(如 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% 精确的。它们会找到巧妙的方法来隐藏这一点,或者让它在正常游戏过程中不易被察觉。