碰撞形状(2D)
本指南解释:
Godot 2D 中可用的碰撞形状类型。
使用转换为多边形的图像作为碰撞形状。
有关 2D 碰撞的性能注意事项。
Godot提供多种碰撞形状, 具有不同的性能和精度权衡.
You can define the shape of a PhysicsBody2D by adding one or more CollisionShape2Ds or CollisionPolygon2Ds as direct child nodes. Indirect child nodes (i.e. children of child nodes) will be ignored and won't be used as collision shapes. Also, note that you must add a Shape2D resource to collision shape nodes in the Inspector dock.
备注
当你将多个碰撞形状添加到单个 PhysicsBody2D 时,不必担心它们会重叠。它们不会相互“碰撞”。
基本碰撞形状
Godot提供了以下基本碰撞形状类型:
SeparationRayShape2D (专为角色设计)
WorldBoundaryShape2D (无限平面)
你可以使用一个或多个原始形状来表示大多数较小物体的碰撞. 然而, 对于更复杂的物体, 如大型船舶或整个水平面, 你可能需要凸形或凹形来代替. 下面会有更多的介绍.
建议动态对象使用原始图形(如 RigidBodies 和 KinematicBodies),因为它们的行为是可靠的,通常也能提供更好的性能。
凸型碰撞形状
警告
Godot 目前没有提供创建 2D 凸形碰撞形状的内置方法。本节内容主要供参考。
凸碰撞形状 是图元碰撞形状和凹碰撞形状之间的折衷。它们可以表示任何复杂程度的形状,但有一个重要的注意事项。顾名思义,单个形状只能表示凸形状。例如,金字塔是凸的,而空心盒子是凹的。要用单个碰撞形状定义凹物体,你需要使用凹碰撞形状。
根据对象的复杂程度, 可能要通过使用多个凸形而不是一个凹形碰撞形状来获得更好的性能.Godot可以使用 凸分解 来生成与空心物体大致匹配的凸形. 请注意, 在一定数量的凸形之后, 就没有了这种性能优势, 对于大而复杂的对象, 如整个关卡, 建议使用凹形代替.
凹面或三面体碰撞形状
Concave collision shapes, also called trimesh collision shapes, can take any form, from a few triangles to thousands of triangles. Concave shapes are the slowest option but are also the most accurate in Godot. You can only use concave shapes within StaticBodies. They will not work with CharacterBodies or RigidBodies unless the RigidBody's mode is Static.
备注
即使凹形提供了最准确的 碰撞, 但触碰信息的精度可能不如基础形状.
在不使用 TileMap 进行关卡设计时,凹形是关卡碰撞的最佳方法。
You can configure the CollisionPolygon2D node's build mode in the inspector. If it is set to Solids (the default), collisions will include the polygon and its contained area. If it is set to Segments, collisions will only include the polygon edges.
你可以通过选择 Sprite2D,并使用 2D 视口顶部的 Sprite2D 菜单,从编辑器生成凹碰撞形状。Sprite2D 菜单下拉菜单显示一个名为 创建 CollisionPolygon2D 同级节点 的选项。点击它后,它会显示一个包含 3 个设置的菜单:
简化:较高的值将导致形状的细节较少,从而以准确性为代价来提高性能。
收缩(像素):较高的值将使生成的碰撞多边形相对于精灵的边缘收缩。
增长(像素):数值越大,生成的碰撞多边形就越会相对于精灵边缘增长。需要注意的是,将 “增长 ”和 “收缩 ”设置为相等的值,产生的结果可能会与将它们都设置为 0 的结果不同。
备注
如果你的图片包含许多小细节,建议创建一个简化版本并使用它来生成碰撞多边形。这样可以带来更好的性能表现和游戏体验,因为玩家不会被小小的、装饰性的细节阻碍。
要使用单独的图像生成碰撞多边形,可创建另一个 Sprite2D,从中生成一个碰撞多边形的同级节点,然后移除 Sprite2D 节点。这样就可以将小细节排除在生成的碰撞之外。
性能方面的注意事项
每个 PhysicsBody(物理体)不限于一个碰撞形状。尽管如此,我们还是建议尽量减少碰撞形状的数量以提高性能。特别是对于像 RigidBody(刚体)和 CharacterBody(角色体)这样的动态对象。除此之外,避免平移、旋转或缩放碰撞形状,以从物理引擎的内部优化中受益。
在 StaticBody 中使用单个未变换的碰撞形状时,引擎的宽相位算法可以丢弃不活跃的 PhysicsBody。这个窄相位只需考虑到活跃物体的形状。如果一个 StaticBody 有许多碰撞形状, 那么宽相位就会失败。较慢的窄相位必须对每个形状执行碰撞检查。
如果遇到性能问题,你可能需要在准确性方面进行权衡。大多数游戏都没有100%的精确碰撞。他们找到了一些具有创造性的方法来隐藏它,或者在正常的游戏中让它变得不被人注意到。