Appearance
物理系统
1. 物理系统管什么
Unity 物理系统主要负责:
c
重力
受力
速度
碰撞
触发器
射线检测
摩擦
反弹
关节约束最核心的组件是:
c
Rigidbody:让物体受物理控制
Collider:给物体一个碰撞形状
Physics / Physics2D:主动检测,比如 Raycast2. 3D 和 2D 是两套系统
3D 用:
c
Rigidbody
BoxCollider / SphereCollider / CapsuleCollider / MeshCollider
Physics.Raycast
OnCollisionEnter
OnTriggerEnter2D 用:
c
Rigidbody2D
BoxCollider2D / CircleCollider2D / CapsuleCollider2D
Physics2D.Raycast
OnCollisionEnter2D
OnTriggerEnter2D不要混用。Rigidbody 配 Collider2D,或者 Rigidbody2D 配 BoxCollider,都会让你很痛苦。
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 Rigidbody6. 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,却期待它自己掉下来
2D 和 3D 组件混用
用 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 physics、Rigidbody 2D、Collision / Collider、FixedUpdate、Time settings、Physics.Raycast、Rigidbody.linearVelocity。