物理与碰撞
这是什么:Unity 的物理引擎——挂上 Rigidbody(刚体)和 Collider(碰撞体),物体就会自己下落、弹跳、被撞飞。
为什么用:前置知识:用 C# 脚本驱动,前面移动方块,每一步位置都是我们亲手算的。可苹果落地、皮球弹跳这类"符合直觉"的运动,手写公式又长又容易错。
如何用:本章先给一个 Cube 挂上 Rigidbody,看它自由落体,再补一个 Collider 让它撞墙反弹。
Rigidbody:把物体交给物理引擎
Rigidbody(刚体) 是一个组件,挂上它,物体就受物理规律管辖:受重力、能被撞飞、会互相挤压。
| 组件 | 管什么 |
|---|---|
| Rigidbody 刚体 | 让物体"活"在物理世界里:重力、推力、速度全归引擎算 |
| Collider 碰撞体 | 定义物体的"碰撞外形",没有它物体之间互相穿过 |
注意分工:Collider 只负责"形状轮廓"(物体不再穿墙),Rigidbody 才负责"受力运动"(会下落、会弹)。要动、要被撞的物体挂 Rigidbody;只当障碍物的静态物体(地板、墙)有 Collider 就够。
实验:自由落体
- 新建场景:Hierarchy 加一个
Plane当地板,再加一个Cube,摆在(0, 5, 0)半空中 - 选中 Cube → Inspector 最下
Add Component→ 搜Rigidbody回车 - 点 ▶ 运行:方块"啪嗒"掉到地板上——你没写任何代码,重力是引擎送的
没挂 Rigidbody 的 Plane 稳如泰山(它只有 Collider,是静态障碍物)。勾掉 Rigidbody 组件右上角的复选框再运行,方块又悬空了——物理开关,一勾一世界。
OnCollision 与 OnTrigger:撞上 vs 穿过
两个回调都写在挂了组件的脚本里,但性格不同:
| OnCollisionEnter | OnTriggerEnter | |
|---|---|---|
| 触发条件 | 双方都有 Collider,至少一方有 Rigidbody | 双方有 Collider,其中一方勾选 Is Trigger |
| 表现 | 实打实地撞:会停、会弹、会把对方撞飞 | 幽灵式穿过:不受力,只是"路过打个招呼" |
| 典型用途 | 子弹打墙、球撞地板、车碰车 | 吃金币、进触发区开门、感应带 |
using UnityEngine;
public class CollisionTest : MonoBehaviour
{
void OnCollisionEnter(Collision other) // 撞上实体时调用
{
Debug.Log("撞到了:" + other.gameObject.name);
}
void OnTriggerEnter(Collider other) // 穿过触发器时调用
{
Debug.Log("穿过了:" + other.gameObject.name);
}
}
参数 other 就是"被撞/被穿的那个物体",用 other.gameObject 拿到它——之后判断"吃的是不是金币"全靠它。
小实验:弹跳小球
- Hierarchy →
3D Object→Sphere,位置(0, 5, 0),加 Rigidbody - Project 窗口右键 →
Create→Folder命名Materials;在文件夹里右键 →Create→Material,命名Bouncy - 选中
Bouncy,Inspector 里把Smoothness拉到 0.8;展开下方附加设置,把Bounciness设为 0.8,Bounce Combine设为Maximum——材质决定弹性 - 把
Bouncy材质拖到场景里的球上,运行:小球落地后欢快地弹跳,越弹越低,最终安静
想要"永动机弹球"?把材质的 Bounciness 设为 1、Bounce Combine 设为 Maximum,能量几乎不损失,它会一直弹下去。
记忆口诀:Rigidbody 管受力,Collider 管轮廓;实体碰撞用 Collision,幽灵穿过用 Trigger。
动手改
- 把 Cube 放在坡度 30° 的旋转 Plane 上加 Rigidbody,看它顺坡滚落
- 给小球脚本加
OnCollisionEnter,撞地时打印对方名字,验证地面叫Plane - 新建一个勾了 Is Trigger 的 Cube 悬在半空,让小球掉进去,观察
OnTriggerEnter打印、小球径直穿过
下一章:综合练习,把三章所学串成一款能玩的小游戏 🐸