Unity2D物理系统-从入门到实战优化

在 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性能优化

  1. 静态物体不要加 Rigidbody2D
  2. 静止物体自动休眠,不参与物理计算
  3. 高速物体开启 Continuous 碰撞检测
  4. 尽量用简单碰撞体(Box/Circle)
  5. 大量物体使用对象池,避免频繁创建销毁
  6. 冻结不需要的旋转(Freeze Rotation Z)

五、新手最常见坑总结

  • 不要直接改 Transform.position
  • 物理代码必须写在 FixedUpdate
  • 2D 只冻结 Z 轴旋转
  • 跳跃前必须重置 y 速度,否则会跳不高
  • 重力 Scale 3~5 最舒服
  • 高速物体必须开连续碰撞检测
相关推荐
阿松爱学习13 小时前
【Unity开发】Rigidbody中Body Type属性
unity·游戏引擎·unity开发
winlife_13 小时前
AI 怎么验证 Unity PlayMode 行为:截图 + 输入模拟的完整闭环
人工智能·unity·游戏引擎·ai编程·claude·playmode
CandyU216 小时前
Cursor AI Unity
unity
LF男男16 小时前
Bullect.cs(bullet)——子弹基类
unity
mxwin1 天前
unity shader中 ddx ddy是什么
unity·游戏引擎·shader
郝学胜-神的一滴1 天前
[简化版 GAMES 101] 计算机图形学 08:三角形光栅化上
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
nnsix1 天前
Unity ILRuntime 笔记
unity·游戏引擎
nnsix2 天前
Unity API 兼容的 .NET Standard 2.1 和 .NET Framework 区别
unity·游戏引擎·.net
mxwin2 天前
Unity Shader 制作半透明物体 使用多Pass提前写入深度的方式 避免穿模
unity·游戏引擎
nnsix2 天前
Unity HybridCLR 笔记
笔记·unity·游戏引擎