在 Unity 2D 游戏开发中,Rigidbody2D 是实现物理效果的核心组件,也是制作写实物理交互、碰撞弹跳、重力下落等效果的基础。无论是平台跳跃、物理解谜、休闲闯关,只要涉及物理驱动的物体运动(比如掉落的金币、碰撞的箱子、跳跃的角色),都离不开 Rigidbody2D的灵活运用。
一、2D刚体
在Unity的2D **物理引擎(Box2D)**中,Rigidbody2D组件用于给游戏对象赋予物理属性,让对象不再受Transform 直接控制的 "瞬移" 运动影响,而是遵循 2D 物理定律运动(重力、阻力、碰撞反弹、外力等)。
简单来说:
- 无 Rigidbody2D:对象由 Transform.position 直接控制,物理引擎不会计算运动与碰撞反馈;
- 有 Rigidbody2D:对象由力、速度、重力驱动,物理引擎自动计算位置、旋转、碰撞反弹。
二、Rigidbody2D核心属性
2.1 基础物理属性
| 属性名 | 作用 | 常用值 / 使用场景 |
|---|---|---|
| Mass(质量) | 刚体质量,影响力的效果 | 角色 1~3,箱子 3~8 |
| Linear Drag(线性阻力) | 移动减速快慢 | 地面物体 2~5 |
| Angular Drag(角阻力) | 旋转减速快慢 | 防止乱转设为 10+ |
| Gravity Scale(重力系数) | 2D 专属重力控制 | 角色 3~5,漂浮物 0 |
| Material | 物理材质(弹性 / 摩擦) | 弹跳物使用 |
2.2 刚体类型BodyType属性
| 类型 | 说明 | 使用场景 |
|---|---|---|
| Dynamic | 受重力、力、碰撞影响 | 玩家、箱子、道具 |
| Kinematic | 不受物理影响,代码控制 | 移动平台、门、剧情物体 |
| Static | 完全静止,性能最高 | 地面、墙壁 |
2.3 运动与约束
| 属性 | 作用 |
|---|---|
| Interpolate | 消除运动抖动,建议选 Interpolate |
| Freeze Rotation Z | 2D 只需要冻结 Z 轴旋转 |
| Freeze Position | 锁定 X / Y 轴移动 |
| Collision Detection | 防止高速穿透 |
| Sleeping Mode | 静止后休眠,节省性能 |
三、Rigidbody2D实战
3.1 获取Rigidbody2D对象
前提条件是游戏物体添加了Rigidbody2D组件。
using UnityEngine;
public class Player2DController : MonoBehaviour
{
public Rigidbody2D rb;
void Start()
{
if (rb == null)
rb = GetComponent<Rigidbody2D>();
}
}
3.2 力控制:AddForce
移动
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.AddForce(new Vector2(h * 500 * Time.fixedDeltaTime, 0));
}
跳跃
public float jumpForce = 350;
void Update()
{
if (Input.GetButtonDown("Jump") && IsGrounded())
{
rb.velocity = new Vector2(rb.velocity.x, 0); // 重置垂直速度
rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
bool IsGrounded()
{
return Physics2D.OverlapCircle(transform.position, 0.1f, LayerMask.GetMask("Ground"));
}
3.3 设置速度
float h = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(h * 6f, rb.velocity.y);
3.4 移动位置
void FixedUpdate()
{
rb.MovePosition(rb.position + new Vector2(1,0) * Time.fixedDeltaTime);
}
3.5 旋转控制
rb.AddTorque(10);
四、Rigidbody2D性能优化
- 静态物体不要加 Rigidbody2D
- 静止物体自动休眠,不参与物理计算
- 高速物体开启 Continuous 碰撞检测
- 尽量用简单碰撞体(Box/Circle)
- 大量物体使用对象池,避免频繁创建销毁
- 冻结不需要的旋转(Freeze Rotation Z)
五、新手最常见坑总结
- 不要直接改 Transform.position
- 物理代码必须写在 FixedUpdate
- 2D 只冻结 Z 轴旋转
- 跳跃前必须重置 y 速度,否则会跳不高
- 重力 Scale 3~5 最舒服
- 高速物体必须开连续碰撞检测