我什么时候应该为 2D 平台游戏角色使用 KinematicBody 或 RigidBody?

4 2d game-physics godot

哪种物理体最适合,比如玩家角色、敌人和收藏品。StaticBodies 非常不同且简单,但当我们必须在 KinematicBody 或 RigidBody 之间进行选择时,它会非常令人困惑。我最近正在制作一款 2D 平台游戏,当我制作敌人时,我突然意识到我不知道哪个身体是最好的……我查了一下互联网,但解释非常模糊。我问任何知道的人,这两种机构之间有什么区别以及何时使用其中一种而不是另一种?

我为主要玩家使用了 KinematicBody2D,但我不知道什么对敌人和收藏品最有效,特别是因为我的敌人将涉及复杂的动画和攻击序列,而硬币将有一些基本的悬停和转动动画。另外,我认为我的玩家没有按照预期与游戏中的对象进行交互。如果有人能对此给出一个简单的解释,并且提供一个简单的平台元素列表以及要使用的最佳物理对象,我将是最好的......

The*_*aot 10

RigidBodyKinematicBody/CharacterBody

\n

这适用于这些类的 2D 和 3D 版本。

\n

RigidBodyKinematicBody/之间的主要区别CharacterBody在于谁负责移动物体。

\n

使用KinematicBody/CharacterBody您的代码负责使用move_and_slideet.al移动对象。方法。用RigidBody物理引擎负责移动物体。

\n

KinematicBody/类CharacterBody旨在用于字符。然而,事实上,你负责移动它,这意味着你为它编码了重力。如果你想要一些东西来推动角色,你也必须自己编写代码。

\n

需要明确的是:您负责移动KinematicBody/ 的事实CharacterBody并不意味着它不与物理相互作用。确实如此。它会发生碰撞,并且会推动事物(您不需要为此编写代码,但是您可以改进默认行为,请参阅运动学与刚体交互)。

\n

问题是“事物能推动性格吗?” KinematicBody通常可以成为/CharacterBody和之间的决定因素RigidBody

\n

所以,是的,您可以用于RigidBody角色。KinematicBody如果/CharacterBody给你带来很多麻烦,那么这可能是值得的。但是,请避免直接移动它,这样您就不会与物理引擎发生冲突(例如,物理引擎想要以一种方式移动对象,而您的代码想要以另一种方式移动它)。如果需要,您可以控制RigidBody(这可能需要使用_integrate_forces,或更改其mode,或与PhysicsServer班级交谈),但大多数时候您将使用冲动和力量来移动RigidBody一个值得注意的陷阱案例是传送

\n

RigidBody同样,理论上,您可以使用KinematicBody/ CharacterBody(在其他节点的帮助下,特别是 )来处理 a 的行为Area,但这是一个更大的挑战。

\n
\n

你的问题

\n

人物

\n
\n

我为主要玩家使用了 KinematicBody2D,但我不知道什么最适合敌人 [\xe2\x80\xa6],特别是因为我的敌人将涉及复杂的动画和攻击序列

\n
\n

弄清楚你想要什么,然后在此基础上构建它会更容易。是的。除了您可以构建的内容之外,还会有多种选择。也不是在你应该构建它的基础上。但最重要的是它更容易。

\n

正如我之前所说,你可以使用这样的问题:“事物可以推动角色吗?” 如果是,那么更喜欢 a RidigBody,否则我建议KinematicBody/ CharacterBody

\n

顺便说一句,甚至不使用KinematicBody/ CharacterBody、nor RigidBody、nornorStaticBody也不Area是一个选项。您可以在较低级别工作并直接交谈PhysicsServer。这并不容易\xe2\x80\xa6但可行。那么,你需要吗?可能不会,除非您确实需要压缩性能(并且只有当您使用许多对象(例如弹幕地狱游戏)时,您才能真正达到目标,您可以用单个节点替换它们)。

\n
\n
\n

另外,我认为我的玩家没有按照预期与游戏中的对象进行交互

\n
\n

我相信您需要运动学与刚体交互(我也在上面链接)涵盖的解决方案。

\n
\n

收藏品

\n
\n

收藏品 [\xe2\x80\xa6] 硬币将有一些基本的悬停和转动动画

\n
\n

如果没有任何东西推动它,并且它也没有推动任何东西,那么使用Area. 即使它确实四处移动。

\n
\n

关于用于Area玩家角色

\n

我想指出的是,官方教程使用的Area是玩家角色,这也是一个选项。在教程游戏中,玩家没有推动任何东西,也没有任何东西推动它,它只需要检测其他物体就Area足够了。然而,我发现对于初学者来说使用KinematicBody/CharacterBody是更好的建议。特别是,初学者可能希望将他们在教程中学到的知识转移到游戏中,而这Area对于玩家角色来说不是一个好的选择。

\n
\n

Node平台游戏的常见问题

\n
\n

如果有人能对此给出一个简单的解释,并且提供一个简单的平台元素列表以及要使用的最佳物理对象\xe2\x80\xa6,我将是最好的

\n
\n

游戏不同。但是当然,让我们讨论最常见的情况,但请记住,这不是紧身衣。这些是从用例开始的常见节点:

\n
    \n
  • 静态平台和墙壁:StaticBody.
  • \n
  • 移动平台:在 Godot 4 中使用AnimatableBody. 在 Godot 3 中使用KinematicBody(例如由AnimationPlayer或 a移动Tween)。在某些情况下, anAnimatableBody本身不会移动,但它是移动对象的子对象,其行为不符合预期...尝试使用 anStaticBody或 a CharacterBody。最糟糕的情况:在 中编写代码AnimationPlayer以跟随其他对象。
  • \n
  • 人物:KinematicBody/ CharacterBody
  • \n
  • 射弹:Area.
  • \n
  • 收藏品:Area.
  • \n
  • 可抛出和可推送:RigidBody.
  • \n
\n

我还想提一下其他一些事情:

\n
    \n
  • 您可以使用该physics_material_override属性使平台有弹性。
  • \n
  • 您还可以使用TileMap2D 或GridMap3D 制作静态平台。
  • \n
  • 用于StaticBody传送带。
  • \n
  • 用于使用\xe2\x80\xbbStaticBody检测到的隐藏对象Area
  • \n
  • 如果需要改变重力或在某个区域施加力,请使用Area\xe2\x80\xbb\xe2\x80\xbb。
  • \n
  • 如果您需要在玩家踩到某些东西时触发它,请使用Area
  • \n
  • 同样,如果您需要交互式对象(玩家接近它,然后按下一个键),请使用Area(角色有一个检测对象的区域,或者对象有一个检测玩家的区域,我更喜欢后者)。
  • \n
  • 用于RayCast视线检查。你可以有一个敌人的视野范围,然后检查每个敌人Area的视线(如果你正在移动代码,你可能会这样做,请调用)。RayCastforce_raycast_updateRayCast
  • \n
  • 如果发生爆炸,并且您需要推开附近的物体,请使用 来Area检测它们。与背面结合RayCast,可以将物体隐藏起来。
  • \n
  • 如果您需要检测平台的末端,为了防止角色掉落,请使用偏移量,RayCast使其位于角色前面,并使其指向下方。
  • \n
\n

\xe2\x80\xbb:例如,您可以为“可听”对象指定一个物理层,然后StaticBody在该层中生成一个发出声音的物体,并为敌人提供可以“听到”的物体,以Area检测该层中的身体。

\n

KinematicBody\xe2\x80\xbb\xe2\x80\xbb:由于您为/编写了重力代码,CharacterBody这意味着要么从 / 读取重力PhysicsServer.body_get_direct_state(get_rid()).total_gravity,要么以其他方式将更改传达给KinematicBody/ CharacterBody。例如,请参阅在 Area2D 中覆盖 KinematicBody2D 运动?

\n
\n

我对(几乎)您需要了解的有关在其他地方设置戈多物理学的所有内容进行了解释。

\n