Skip to content

物理系统

unity-physics-system-deep-dive

1. 物理系统管什么

Unity 物理系统主要负责:

c
重力
受力
速度
碰撞
触发器
射线检测
摩擦
反弹
关节约束

最核心的组件是:

c
Rigidbody:让物体受物理控制
Collider:给物体一个碰撞形状
Physics / Physics2D:主动检测,比如 Raycast

2. 3D 和 2D 是两套系统

3D 用:

c
Rigidbody
BoxCollider / SphereCollider / CapsuleCollider / MeshCollider
Physics.Raycast
OnCollisionEnter
OnTriggerEnter

2D 用:

c
Rigidbody2D
BoxCollider2D / CircleCollider2D / CapsuleCollider2D
Physics2D.Raycast
OnCollisionEnter2D
OnTriggerEnter2D

不要混用。RigidbodyCollider2D,或者 Rigidbody2DBoxCollider,都会让你很痛苦。

3. Rigidbody 是“运动权”

一个物体只有 Transform,你改的是位置。

一个物体有 Rigidbody,就相当于告诉 Unity:

c
这个物体交给物理系统管理。
它可以受重力、受力、撞到东西、被弹开。

常见属性:

c
Mass:质量
Use Gravity:是否受重力
Is Kinematic:是否由脚本/动画控制,而不是由力控制
Linear Damping:线性阻尼,像空气阻力
Angular Damping:旋转阻尼
Constraints:冻结位置或旋转
Collision Detection:碰撞检测模式
Interpolation:平滑显示,减少抖动

Unity 6 里推荐用 linearVelocity;老教程常用 velocity,在旧版本里很常见。

4. Collider 是“碰撞形状”

Collider 不一定等于模型外形。它是物理系统看的形状,通常越简单越好。

c
BoxCollider:盒子
SphereCollider:球
CapsuleCollider:胶囊,常用于角色
MeshCollider:贴合网格,更贵
BoxCollider2D:2D 盒子
CircleCollider2D:2D

官方文档也强调:Collider 是不可见的物理形状,不必和模型完全一样。游戏里通常用粗略形状就够了。

5. 三种常见物体类型

c
静态物体:有 Collider,没有 Rigidbody
动态物体:有 Collider,有 Rigidbody,Is Kinematic 关闭
运动学物体:有 Collider,有 Rigidbody,Is Kinematic 开启

例子:

c
地面、墙壁:静态 Collider
箱子、球、掉落物:动态 Rigidbody
移动平台、电梯、机关门:Kinematic Rigidbody

6. Collision 和 Trigger

普通碰撞:

c
会阻挡
会产生物理接触
会调用 OnCollisionEnter

触发器:

c
不阻挡
只检测进入/停留/离开
会调用 OnTriggerEnter

比如金币一般用 Trigger:

c
private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        Destroy(gameObject);
    }
}

敌人撞墙、球撞地面,用 Collision:

c
private void OnCollisionEnter(Collision collision)
{
    Debug.Log("撞到了:" + collision.gameObject.name);
}

7. FixedUpdate 是物理节奏

普通画面更新用:

c
Update()

物理更新用:

c
FixedUpdate()

默认情况下,Unity 的物理步长是 0.02 秒,也就是大约每秒 50 次。

推荐习惯:

c
Update:读取输入
FixedUpdate:移动 Rigidbody、AddForce、MovePosition

例子:

c
using UnityEngine;

public class RigidbodyMover : MonoBehaviour
{
    public float speed = 5f;

    private Rigidbody rb;
    private Vector3 input;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        input = new Vector3(
            Input.GetAxisRaw("Horizontal"),
            0f,
            Input.GetAxisRaw("Vertical")
        ).normalized;
    }

    private void FixedUpdate()
    {
        Vector3 nextPosition = rb.position + input * speed * Time.fixedDeltaTime;
        rb.MovePosition(nextPosition);
    }
}

8. AddForce、linearVelocity、MovePosition 怎么选

c
AddForce:想要真实物理感,比如推箱子、爆炸、弹跳
linearVelocity:想要直接改速度,比如跳跃瞬间
MovePosition:想要可控移动,比如角色或移动平台
Transform.position:非物理物体可以用;物理物体慎用

跳跃例子:

c
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);

ForceMode.Impulse 表示瞬间冲量,适合跳跃、爆炸、击退。

9. Raycast:主动探测

Raycast 是“从一个点发出一条线,看看打到了什么”。

常见用途:

c
检测是否在地面
鼠标点击选中物体
枪械射击命中
敌人视线检测
角色前方是否有墙

例子:检测地面。

c
public LayerMask groundLayer;
public float checkDistance = 1.1f;

private bool IsGrounded()
{
    return Physics.Raycast(
        transform.position,
        Vector3.down,
        checkDistance,
        groundLayer
    );
}

LayerMask 很重要。不要让射线乱打所有东西。

10. Physics Material

物理材质控制:

c
Friction:摩擦
Bounciness:弹性

例子:

c
冰面:低摩擦
橡胶球:高弹性
泥地:高摩擦

3D 用 Physic Material,2D 用 Physics Material 2D

11. Layer Collision Matrix

路径:

c
Edit > Project Settings > Physics

里面有碰撞矩阵,可以控制哪些 Layer 之间发生碰撞。

比如:

c
Player 不和 PlayerBullet 碰撞
Enemy 不和 EnemyBullet 碰撞
Projectile 只和 Ground / Enemy 碰撞

这是大型项目里非常重要的设置。

12. 最常见错误

c
物体有 Collider 但没有 Rigidbody,却期待它自己掉下来
2D3D 组件混用
用 Transform.position 移动物理物体,导致穿墙或抖动
把 AddForce 写在 Update 里
忘记 Collider 的 Is Trigger 是否开启
Trigger 没反应,因为双方都没有 Rigidbody
高速子弹穿墙,没有设置连续碰撞检测
角色旋转倒下,忘了冻结 Rigidbody 的 X/Z Rotation
Raycast 没设置 LayerMask,打到自己或无关物体

学习路线

c
1. 会用 Rigidbody + Collider 让方块掉下来
2. 会区分 Collision 和 Trigger
3. 会在 FixedUpdate 移动物理物体
4. 会用 Raycast 做地面检测
5. 会用 LayerMask 和碰撞矩阵筛选对象
6. 会用 Physics Material 做摩擦和反弹
7. 再学 Joint、CharacterController、复杂载具

一句话记住:

c
Rigidbody 管运动,Collider 管形状,Trigger 管事件,FixedUpdate 管物理节奏,Raycast 管主动探测。

参考:Unity 官方 Rigidbody physicsRigidbody 2DCollision / ColliderFixedUpdateTime settingsPhysics.RaycastRigidbody.linearVelocity

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0