HOME / 第 3 部分 · 2D 游戏开发实战 / 第 22 课
MODULE 3 · 2D 游戏开发实战
第 22 课 · RigidBody2D 刚体与力
🎯 本课学习目标
- 掌握 RigidBody2D 受物理影响的行为
- 用施力与冲量推动刚体
- 理解四种物理体的选型
想让箱子被撞飞、弹珠滚动?用 RigidBody2D 刚体。本课讲清刚体的力、冲量与脚本控制。
📖 详细教学步骤
创建刚体箱子搭建
新建场景,根节点 RigidBody2D,命名 Crate,保存 crate.tscn;子节点:Sprite2D(箱子图)+ CollisionShape2D(矩形)。放入场景运行后,箱子受重力下落并停在地面上。
💡 刚体无需任何代码,物理引擎自动处理运动和碰撞。
给刚体施加力与冲量代码
用代码推动刚体:
GDSCRIPTextends RigidBody2D
func _ready():
# 持续力(适合每帧调用)
apply_central_force(Vector2(500, 0))
func kick():
# 瞬间冲量(更「猛」的一次性推动)
apply_central_impulse(Vector2(800, -300))
func _physics_process(delta):
# 施加扭矩让它旋转
apply_torque_impulse(5)
刚体常用属性属性
- Mass 质量:越重越难推动
- Friction 摩擦:越大停得越快
- Bounce 弹性:越大弹得越高
- Gravity Scale 重力系数:1 正常、0 无重力、负值上浮
- Freeze 冻结:冻结为静态
全部在检查器直接调整。
玩家推动箱子实战
玩家(CharacterBody2D)撞到刚体箱子时推它:
GDSCRIPT# player.gd 中
func _physics_process(delta):
move_and_slide()
# 遍历本次移动产生的所有碰撞
for i in get_slide_collision_count():
var col = get_slide_collision(i)
var body = col.get_collider()
if body is RigidBody2D:
# 沿碰撞法线方向推箱子
body.apply_central_impulse(col.get_normal() * 300)
四种物理体怎么选?总结
| 需求 | 选择 |
|---|---|
| 地面/墙(不动) | StaticBody2D |
| 玩家/可控角色 | CharacterBody2D |
| 会被撞飞/滚动 | RigidBody2D |
| 只感应不阻挡 | Area2D |
⚠️
刚体不受力?
apply_central_force 是持续力,要在 _physics_process 里每帧调用才明显;一次性推用 apply_central_impulse。
⚠️
刚体一直抖动?
检查是否每帧施加过大冲量,或把 Sleeping 勾选让它静止后休眠。
🧪 动手试一试
🏋️ 课后练习
堆 3 个 RigidBody2D 箱子,玩家走过去能推动它们,观察重力与摩擦让箱子停下。
把 crate.tscn 实例 3 个叠放在地面即可,运行看物理堆叠。
💡
Gravity Scale=0 可做太空漂浮物。
💡
子弹打箱子 = 检测碰撞 + apply_central_impulse,常见组合。
🎓 本课小结
RigidBody2D 自动受重力与碰撞;持续力 apply_central_force、瞬间冲量 apply_central_impulse;按需求选 Static/Character/Rigid/Area。