🐸 青蛙编程网
首页 / C# / Unity 入门 / 4. 物理与碰撞

物理与碰撞

这是什么:Unity 的物理引擎——挂上 Rigidbody(刚体)和 Collider(碰撞体),物体就会自己下落、弹跳、被撞飞。

为什么用:前置知识:用 C# 脚本驱动,前面移动方块,每一步位置都是我们亲手算的。可苹果落地、皮球弹跳这类"符合直觉"的运动,手写公式又长又容易错。

如何用:本章先给一个 Cube 挂上 Rigidbody,看它自由落体,再补一个 Collider 让它撞墙反弹。

Rigidbody:把物体交给物理引擎

Rigidbody(刚体) 是一个组件,挂上它,物体就受物理规律管辖:受重力、能被撞飞、会互相挤压。

组件 管什么
Rigidbody 刚体 让物体"活"在物理世界里:重力、推力、速度全归引擎算
Collider 碰撞体 定义物体的"碰撞外形",没有它物体之间互相穿过

注意分工:Collider 只负责"形状轮廓"(物体不再穿墙),Rigidbody 才负责"受力运动"(会下落、会弹)。要动、要被撞的物体挂 Rigidbody;只当障碍物的静态物体(地板、墙)有 Collider 就够。

实验:自由落体

  1. 新建场景:Hierarchy 加一个 Plane 当地板,再加一个 Cube,摆在 (0, 5, 0) 半空中
  2. 选中 Cube → Inspector 最下 Add Component → 搜 Rigidbody 回车
  3. 点 ▶ 运行:方块"啪嗒"掉到地板上——你没写任何代码,重力是引擎送的

没挂 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 拿到它——之后判断"吃的是不是金币"全靠它。

小实验:弹跳小球

  1. Hierarchy → 3D Object → Sphere,位置 (0, 5, 0),加 Rigidbody
  2. Project 窗口右键 → Create → Folder 命名 Materials;在文件夹里右键 → Create → Material,命名 Bouncy
  3. 选中 Bouncy,Inspector 里把 Smoothness 拉到 0.8;展开下方附加设置,把 Bounciness 设为 0.8,Bounce Combine 设为 Maximum——材质决定弹性
  4. 把 Bouncy 材质拖到场景里的球上,运行:小球落地后欢快地弹跳,越弹越低,最终安静

想要"永动机弹球"?把材质的 Bounciness 设为 1、Bounce Combine 设为 Maximum,能量几乎不损失,它会一直弹下去。

记忆口诀:Rigidbody 管受力,Collider 管轮廓;实体碰撞用 Collision,幽灵穿过用 Trigger。

动手改

  1. 把 Cube 放在坡度 30° 的旋转 Plane 上加 Rigidbody,看它顺坡滚落
  2. 给小球脚本加 OnCollisionEnter,撞地时打印对方名字,验证地面叫 Plane
  3. 新建一个勾了 Is Trigger 的 Cube 悬在半空,让小球掉进去,观察 OnTriggerEnter 打印、小球径直穿过

下一章:综合练习,把三章所学串成一款能玩的小游戏 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。