RigidBody
vs KinematicBody
/CharacterBody
这适用于这些类的2D和3D版本。
RigidBody
和KinematicBody
/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
(例如通过 AnimationPlayer
或 Tween
进行移动)。
- 角色:使用
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中设置物理所需了解的一切的解释其他地方。