在2D平台游戏中,我应该何时使用KinematicBody或RigidBody来控制角色?

4

对于玩家角色、敌人和可收集物品,哪种物理体最好呢?StaticBodies非常简单易用,但是在选择KinematicBody或RigidBody时很容易混淆。

我最近正在制作一个2D平台游戏,当我制作敌人时,我突然想不知道哪种物理体最好...

我在互联网上查找了一些资料,但解释都很模糊。我想问任何知道的人,这两种物理体之间有什么区别,以及何时使用其中之一?

我为主角使用了KinematicBody2D,但我不知道对于敌人和可收集物品来说哪种物理体效果最好,特别是因为我的敌人将涉及复杂的动画和攻击序列,而硬币将具有一些基本的悬停和旋转动画。此外,我认为我的玩家与游戏内物体的交互并不如预期。如果有人能够给出一个简单的解释,并提供一个简单的平台元素列表以及最适合使用的物理对象,那就最好了...


这个问题可能被视为主观的。请参考这里 - Blue Robin
1个回答

6

RigidBody vs KinematicBody/CharacterBody

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

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

使用KinematicBody/CharacterBody,您的代码负责移动对象,使用move_and_slide等方法。而使用RigidBody时,物理引擎负责移动对象。

KinematicBody/CharacterBody类被设计用于角色。然而,您需要自己编写代码来控制它的重力。如果您希望有物体推动角色,您也需要自己编写代码实现。

只是为了明确:您负责移动 KinematicBody/CharacterBody 并不意味着它不与物理引擎交互。它会发生碰撞,它会推动其他物体(您无需编写代码来实现,不过您可以改进默认行为,请参阅Kinematic to Rigid body interaction)。

"物体能够推动角色吗?" 这个问题往往是选择使用 KinematicBody/CharacterBody 还是 RigidBody 的决定因素。

所以,是的,你可以使用 RigidBody 来控制角色。如果 KinematicBody/CharacterBody 给你带来了很多麻烦,这可能是值得的。然而,尽量避免直接移动它,这样你就不会与物理引擎相互抵消(例如,物理引擎想要将对象移动一种方式,而你的代码想要将其移动另一种方式)。如果需要的话,你可以控制 RigidBody(可能需要使用 _integrate_forces,或者改变它的 mode,或者与 PhysicsServer 类通信),但大多数情况下你会使用冲量和力来移动 RigidBody一个值得注意的例外情况是 传送

同样地,你也可以通过使用 KinematicBody/CharacterBody 的方式(借助其他节点,尤其是一个 Area),从理论上接近 RigidBody 的行为,但这是一个更大的挑战。


你的问题

角色

我为主角使用了KinematicBody2D,但是对于敌人来说,我不知道哪种方式最适合[…] 尤其是因为我的敌人会涉及复杂的动画和攻击序列。

先确定你想要什么,然后在此基础上构建会更容易。 是的,不是在你能够构建的基础上,而是有多种选择。也不是在你应该构建的基础上,而是在更容易的基础上。

正如我之前所说,你可以使用这个问题:“物体能推动角色吗?”如果是的话,那么推荐使用RidigBody,否则我建议使用KinematicBody/CharacterBody

顺便说一下,即使不使用KinematicBody/CharacterBody、RigidBody、StaticBody或Area也是一个选择。你可以在更低的级别上与PhysicsServer直接交互。这并不容易...但是可以做到。那么,你需要吗?可能不需要,除非你真的需要为了性能而压缩(只有当你有很多对象时,比如弹幕游戏,你才会用一个节点替换它们)。
另外,我认为我的玩家与游戏内的物体互动不如预期。
我相信你需要运动学到刚体的互动的解决方案(我也在上面提供了链接)。

收藏品

并且收藏品[...]硬币将具有一些基本的悬浮和旋转动画。

如果没有任何东西推动它,并且它也不推动任何东西,那就使用区域即使它会四处移动。


关于使用Area作为玩家角色

我想指出,官方教程使用Area作为玩家角色,这也是一种选择。在教程游戏中,玩家不会推动任何物体,也没有物体会推动它,它只需要检测其他需要Area的物体即可。然而,我认为对于初学者来说,使用KinematicBody/CharacterBody是一个更好的建议。特别是,初学者可能希望将他们在教程中学到的知识应用到Area不适合作为玩家角色的游戏中。


平台游戏常见节点

如果有人能给出一个简单的解释,并列出一些平台游戏元素以及最适合使用的物理对象,那就太好了...

游戏各不相同。但是,让我们来谈谈最通用的情况,但请记住这并不是一种束缚。以下是从使用案例开始的常见节点:

  • 静态平台和墙壁:使用 StaticBody
  • 移动平台:在 Godot 4 中使用 AnimatableBody,在 Godot 3 中使用 KinematicBody(例如通过 AnimationPlayerTween 进行移动)。
  • 角色:使用 KinematicBody/CharacterBody
  • 抛射物:使用 Area
  • 可收集物品:使用 Area
  • 可投掷和可推动物体:使用 RigidBody

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

  • 你可以使用physics_material_override属性使平台具有弹性。
  • 在2D中,你也可以使用TileMap来创建静态平台,或者在3D中使用GridMap
  • 对于传送带,请使用StaticBody
  • 对于需要使用Area检测的隐藏对象,请使用StaticBody
  • 如果需要在某个区域改变重力或施加力量,请使用Area
  • 如果需要在玩家踩到某个物体时触发事件,请使用Area
  • 同样地,如果需要交互式物体(玩家接近物体,然后按下一个键),请使用Area(角色有一个检测物体的区域,或者物体有一个检测玩家的区域,我更喜欢后者)。
  • 使用RayCast进行视线检测。你可以为敌人的视野范围设置一个Area,然后使用RayCast逐个检查视线(如果你从代码中移动RayCast,记得调用force_raycast_update)。
  • 如果发生爆炸,并且你需要将附近的物体推开,请使用Area进行检测。再次结合RayCast,这样物体可以被掩盖。
  • 如果需要检测平台的结束点,以防止角色掉落,请使用RayCast并将其偏移,使其在角色前方,并朝下指向。
※: 例如,您可以为“可听到的”对象专门创建一个物理层,然后在该层中生成一个StaticBody,当某物发出声音时,在该层中检测到身体的Area将能够“听到”的敌人。
※※: 由于您正在编写KinematicBody/CharacterBody的重力代码,这意味着要么从PhysicsServer.body_get_direct_state(get_rid()).total_gravity读取重力,要么以其他方式将更改通知给KinematicBody/CharacterBody。例如,请参阅如何在Area2D内覆盖KinematicBody2D的移动?

我有一个几乎涵盖了你在Godot中设置物理所需了解的一切的解释其他地方


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接