HOME / 第 3 部分 · 2D 游戏开发实战 / 第 22 课
MODULE 3 · 2D 游戏开发实战

第 22 课 · RigidBody2D 刚体与力

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 3 部分 · 2D 游戏开发实战

🎯 本课学习目标

想让箱子被撞飞、弹珠滚动?用 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。