Godot 4 里这几个 3D 物理 Body 到底怎么选?
从“谁控制运动”这个角度,快速区分 CharacterBody3D、RigidBody3D、StaticBody3D 和 AnimatableBody3D 的用途、使用场景与典型例子。
基于 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()。
适合例子:
- 第一人称或第三人称玩家角色。
- 会巡逻、追人、攻击的敌人。
- 能跳跃、爬坡、下落、贴地移动的 NPC。
我一般会在“手感很重要”的对象上优先考虑它。比如平台跳跃游戏里的主角,如果完全交给真实物理,手感反而很难调。
RigidBody3D:给“交给物理引擎算”的物体用
RigidBody3D 是完整的 3D 刚体物理。它会受重力、碰撞、力、冲量等影响。
如果一个东西应该自然地滚动、掉落、翻倒、被撞开、被爆炸冲飞,它大概率适合用 RigidBody3D。常见操作是给它施加力或冲量,比如 apply_force()、apply_impulse(),而不是每帧强行改它的位置。
适合例子:
- 可以被玩家推开的箱子、木桶、石块。
- 从高处掉下来的道具、球、陷阱物。
- 爆炸、撞击后会飞出去的碎片或可破坏物。
如果你想要的是“它真的像物理物体一样反应”,用 RigidBody3D。如果你想要的是“它必须严格按我的输入和逻辑走”,不要硬用它做角色控制。
StaticBody3D:给“地图和固定障碍”用
StaticBody3D 适合做不会被外力推动的东西。最典型的就是地面、墙壁、楼梯、岩石、建筑碰撞体。
它的职责很朴素:挡住别人。玩家走在地面上,箱子撞到墙上,子弹打到固定障碍上,这些场景里的地面和墙就很适合用 StaticBody3D。
适合例子:
- 关卡地面、墙、天花板、楼梯。
- 不会移动的大石头、建筑、围栏。
- 地图里固定的碰撞边界和不可穿越区域。
这里有个容易踩的点:StaticBody3D 虽然也可以被代码移动,但它不是为“移动平台”设计的。如果你要做会托着玩家走的平台,通常应该看 AnimatableBody3D。
AnimatableBody3D:给“按预设移动的障碍物”用
AnimatableBody3D 可以理解成:会动的 StaticBody3D,但它移动时会影响其他物理体。
它不会因为外力被推走,但你可以通过动画或脚本移动它。它适合那些按照设计路线移动的东西,比如平台、电梯、机关门。
适合例子:
- 横向或纵向移动的平台。
- 电梯、升降台、机关桥。
- 自动门、旋转机关、按路径移动的障碍物。
它和 RigidBody3D 的区别很清楚:移动平台不是被玩家撞了才动,它是按照预设路线动。所以不应该交给物理引擎自由模拟,而应该用动画或代码控制。
最常见的选择方式
可以按这个顺序判断:
玩家、敌人、NPC 这种要精确控制的角色?
-> CharacterBody3D
需要被重力、碰撞、爆炸、推力自然影响?
-> RigidBody3D
基本固定不动,只负责挡住别人?
-> StaticBody3D
会按动画或脚本移动,并影响站在上面或挡在路上的物体?
-> AnimatableBody3D
再压缩成一句话:
角色用 CharacterBody3D。
真实物理物体用 RigidBody3D。
固定地图碰撞用 StaticBody3D。
移动平台和机关用 AnimatableBody3D。
一个小例子
假设做一个简单 3D 平台关卡:
- 玩家主角:
CharacterBody3D - 地面、墙、楼梯:
StaticBody3D - 可以推下悬崖的箱子:
RigidBody3D - 来回移动的平台:
AnimatableBody3D
这样分工以后,逻辑会清楚很多。玩家移动逻辑写在玩家脚本里,箱子的运动交给物理引擎,地面和墙只负责碰撞,平台按动画路线移动并带着玩家走。
最后记一个原则
不要只看名字,要看控制权。
Godot 这些物理 Body 的区别,本质上就是控制权的区别:是你控制、物理引擎控制、完全不动,还是按预设方式移动。这个问题想清楚以后,选节点就没那么玄学了。