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 最舒服
  • 高速物体必须开连续碰撞检测
相关推荐
mxwin9 小时前
Unity Shader 顶点动画:在顶点着色器中实现风吹草动、河流波动、布料模拟
unity·游戏引擎·shader·着色器
DowneyJoy10 小时前
【Unity3D补充知识点】常用数据结构分析-集合(List<T>)
数据结构·unity·c#·list
DowneyJoy10 小时前
【Unity3D补充知识点】常用数据结构分析-数组(Array)
数据结构·unity·c#
w-白兰地11 小时前
配置Unity中的ADB环境变量
unity·adb·游戏引擎
mxwin11 小时前
Unity Shader 几何着色器:动态生成图元与顶点拓扑修改
unity·游戏引擎·着色器
呆呆敲代码的小Y13 小时前
【Unity-AI开发篇】| 游戏中接入DeepSeek实现AI对话,完整详细步骤
人工智能·游戏·unity·ai·游戏引擎·u3d·deepseek
相信神话20211 天前
第四章:Godot 4.6 核心概念与开发环境搭建
游戏引擎·godot·2d游戏编程·godot4·2d游戏开发
代数狂人1 天前
在Godot中应用面向对象原则:C#脚本实践
c#·游戏引擎·godot
Sator11 天前
Unity关于射击游戏人物动画的设计经验
游戏·unity·游戏引擎