跳到主内容
Godot
文章阅读

Godot 4 里这几个 3D 物理 Body 到底怎么选?

从“谁控制运动”这个角度,快速区分 CharacterBody3D、RigidBody3D、StaticBody3D 和 AnimatableBody3D 的用途、使用场景与典型例子。

2026/05/25370 次阅读5 分钟

基于 Godot 4.x / Godot 4.6 stable 文档整理。这里讨论的是 3D 物理节点:CharacterBody3D、RigidBody3D、StaticBody3D 和 AnimatableBody3D。

学 Godot 物理节点时,最容易混乱的不是名字,而是“不知道什么时候该用谁”。我更推荐用一个问题来记:这个物体的运动,到底是谁控制的?

  • 你写代码精确控制:CharacterBody3D
  • 物理引擎控制:RigidBody3D
  • 基本固定不动:StaticBody3D
  • 用动画或代码移动,但要像障碍物一样影响别人:AnimatableBody3D

这几个 Body 通常还需要搭配 CollisionShape3D 才能参与碰撞。如果还要显示出来,再搭配 MeshInstance3D、模型场景或其他可视节点。

一张表先记住区别

节点运动由谁控制适合做什么
CharacterBody3D代码 / 玩家输入 / AI玩家、怪物、NPC
RigidBody3D物理引擎箱子、球、碎片、掉落物
StaticBody3D基本不动地面、墙、固定障碍
AnimatableBody3D动画 / 代码移动平台、门、电梯

CharacterBody3D:给“我来控制怎么走”的角色用

CharacterBody3D 最适合做角色。这里的角色不一定是玩家,也可以是敌人、NPC,或者任何需要你精确控制移动规则的对象。

它的重点不是“真实物理模拟”,而是“可控”。玩家按键后往哪里走、什么时候跳、斜坡上怎么滑、撞墙后怎么处理,这些逻辑通常都由脚本决定。常见用法是在 _physics_process() 里维护 velocity,然后调用 move_and_slide()。

适合例子:

  1. 第一人称或第三人称玩家角色。
  2. 会巡逻、追人、攻击的敌人。
  3. 能跳跃、爬坡、下落、贴地移动的 NPC。

我一般会在“手感很重要”的对象上优先考虑它。比如平台跳跃游戏里的主角,如果完全交给真实物理,手感反而很难调。

RigidBody3D:给“交给物理引擎算”的物体用

RigidBody3D 是完整的 3D 刚体物理。它会受重力、碰撞、力、冲量等影响。

如果一个东西应该自然地滚动、掉落、翻倒、被撞开、被爆炸冲飞,它大概率适合用 RigidBody3D。常见操作是给它施加力或冲量,比如 apply_force()、apply_impulse(),而不是每帧强行改它的位置。

适合例子:

  1. 可以被玩家推开的箱子、木桶、石块。
  2. 从高处掉下来的道具、球、陷阱物。
  3. 爆炸、撞击后会飞出去的碎片或可破坏物。

如果你想要的是“它真的像物理物体一样反应”,用 RigidBody3D。如果你想要的是“它必须严格按我的输入和逻辑走”,不要硬用它做角色控制。

StaticBody3D:给“地图和固定障碍”用

StaticBody3D 适合做不会被外力推动的东西。最典型的就是地面、墙壁、楼梯、岩石、建筑碰撞体。

它的职责很朴素:挡住别人。玩家走在地面上,箱子撞到墙上,子弹打到固定障碍上,这些场景里的地面和墙就很适合用 StaticBody3D。

适合例子:

  1. 关卡地面、墙、天花板、楼梯。
  2. 不会移动的大石头、建筑、围栏。
  3. 地图里固定的碰撞边界和不可穿越区域。

这里有个容易踩的点:StaticBody3D 虽然也可以被代码移动,但它不是为“移动平台”设计的。如果你要做会托着玩家走的平台,通常应该看 AnimatableBody3D。

AnimatableBody3D:给“按预设移动的障碍物”用

AnimatableBody3D 可以理解成:会动的 StaticBody3D,但它移动时会影响其他物理体。

它不会因为外力被推走,但你可以通过动画或脚本移动它。它适合那些按照设计路线移动的东西,比如平台、电梯、机关门。

适合例子:

  1. 横向或纵向移动的平台。
  2. 电梯、升降台、机关桥。
  3. 自动门、旋转机关、按路径移动的障碍物。

它和 RigidBody3D 的区别很清楚:移动平台不是被玩家撞了才动,它是按照预设路线动。所以不应该交给物理引擎自由模拟,而应该用动画或代码控制。

最常见的选择方式

可以按这个顺序判断:


玩家、敌人、NPC 这种要精确控制的角色?
-> CharacterBody3D

需要被重力、碰撞、爆炸、推力自然影响?
-> RigidBody3D

基本固定不动,只负责挡住别人?
-> StaticBody3D

会按动画或脚本移动,并影响站在上面或挡在路上的物体?
-> AnimatableBody3D

再压缩成一句话:


角色用 CharacterBody3D。
真实物理物体用 RigidBody3D。
固定地图碰撞用 StaticBody3D。
移动平台和机关用 AnimatableBody3D。

一个小例子

假设做一个简单 3D 平台关卡:

  • 玩家主角:CharacterBody3D
  • 地面、墙、楼梯:StaticBody3D
  • 可以推下悬崖的箱子:RigidBody3D
  • 来回移动的平台:AnimatableBody3D

这样分工以后,逻辑会清楚很多。玩家移动逻辑写在玩家脚本里,箱子的运动交给物理引擎,地面和墙只负责碰撞,平台按动画路线移动并带着玩家走。

最后记一个原则

不要只看名字,要看控制权。

Godot 这些物理 Body 的区别,本质上就是控制权的区别:是你控制、物理引擎控制、完全不动,还是按预设方式移动。这个问题想清楚以后,选节点就没那么玄学了。

参考

返回顶部