how-to-make-a-video-game-in-unity-collision-e05
Course: 【油管100w+】 Unity 入门视频
🎮 视频标题|How to make a Video Game in Unity — COLLISION (E05)
👤 主讲人|Brackeys
📅 系列定位|Unity 初学者系列 Episode 05
🏷 关键词|Collision | Rigidbody | Collider | Tag | OnCollisionEnter | Debug.Log | 组件引用
🏛 课程目标
学习如何检测物体之间的碰撞事件,
并在玩家撞到障碍物时执行特定逻辑(如禁用移动、重启游戏等)。
🧭 逻辑概览
1️⃣ 为玩家添加新的脚本:PlayerCollision.cs
2️⃣ 使用 Unity 提供的 OnCollisionEnter 函数检测碰撞。
3️⃣ 通过参数获取被撞物体的信息。
4️⃣ 使用 Tag 而非 Name 识别对象类型。
5️⃣ 当碰撞到“障碍物”时禁用玩家移动脚本。
📦 创建脚本:PlayerCollision.cs
步骤:
- 在 Player 对象上点击 Add Component → New Script → PlayerCollision。
- 打开脚本编辑器,删除
Start()与Update()。
🧠 编写碰撞检测逻辑
using UnityEngine;
public class PlayerCollision : MonoBehaviour
{
void OnCollisionEnter(Collision collisionInfo)
{
Debug.Log("We hit something!");
}
}OnCollisionEnter():Unity 自动调用,当该对象与其他物体碰撞时执行。- 参数
Collision collisionInfo:包含本次碰撞的所有信息(接触点、碰撞对象、刚体等)。 - 若未严格拼写正确,Unity 不会报错,但函数不会触发。
📚 前置条件
- 两个对象必须至少满足以下条件之一:
- 都有 Collider,其中一个包含 Rigidbody。
- 例:Player(带 Rigidbody)+ Obstacle(带 Box Collider)。
✅ 确保物理系统被启用,否则事件不会触发。
🧩 测试碰撞输出
void OnCollisionEnter(Collision collisionInfo)
{
Debug.Log("We hit " + collisionInfo.collider.name);
}运行游戏时,控制台会打印:
- 玩家掉落时 → “We hit Ground”
- 撞上障碍时 → “We hit Obstacle”
📘 collisionInfo.collider.name
- 访问当前碰撞到的对象的 Collider 名称。
- 若对象名为 “Obstacle”,则输出对应文字。
🧱 在场景中添加障碍物(Obstacle)
1️⃣ Hierarchy → 右键 → 3D Object → Cube
2️⃣ 调整 Transform:
Position: (0, 1, 10)Scale: (2, 2, 2)3️⃣ 创建材质(Material) → 改为灰色或深色 → 拖入 Cube
4️⃣ 确认:
含 Box Collider
添加 Rigidbody(设置 Mass ≈ 2)
📘 结果:玩家在前进时会与障碍物发生物理碰撞。
🧠 使用 if 条件检测特定对象
void OnCollisionEnter(Collision collisionInfo)
{
if (collisionInfo.collider.name == "Obstacle")
{
Debug.Log("We hit an obstacle!");
}
}⚠️ 不推荐长期使用对象名判断。
- 改名后脚本会失效。
- 场景多对象时性能开销大。
🏷 使用 Tag 替代 Name(推荐方法)
设置标签:
1️⃣ 选中 Obstacle → Inspector 顶部 Tag → Add Tag
2️⃣ 点击 “+” 添加新标签 → 命名为 Obstacle
3️⃣ 返回物体 → 将 Tag 设置为 Obstacle
更新代码:
void OnCollisionEnter(Collision collisionInfo)
{
if (collisionInfo.collider.tag == "Obstacle")
{
Debug.Log("Hit an obstacle!");
}
}🎯 现在无论场景中多少障碍物,只要带此 Tag 都会触发相同逻辑。
🧩 在碰撞后禁用玩家移动脚本
public PlayerMovement movement;
void OnCollisionEnter(Collision collisionInfo)
{
if (collisionInfo.collider.tag == "Obstacle")
{
movement.enabled = false;
}
}Unity 操作步骤:
- 将
PlayerMovement脚本从 Player 拖入 Inspector 的Movement插槽。 - 撞上障碍物后,玩家移动脚本会被关闭,Player 停止响应输入。
📘 可扩展逻辑:
- 调用“Game Over”界面
- 重新加载关卡
- 播放特效音效等
✅ 完整代码:PlayerCollision.cs
using UnityEngine;
public class PlayerCollision : MonoBehaviour
{
public PlayerMovement movement;
void OnCollisionEnter(Collision collisionInfo)
{
if (collisionInfo.collider.tag == "Obstacle")
{
movement.enabled = false;
}
}
}🎯 功能总结:
- 玩家检测到与带有 “Obstacle” 标签物体的碰撞;
- 禁用玩家移动;
- 预留后续扩展空间(如关卡重启、UI 提示等)。
🧠 概念回顾
| 概念 | 说明 |
|---|---|
| Collider(对撞体) | 用于检测物体间物理接触(Box、Sphere、Mesh 等)。 |
| Rigidbody(刚体) | 使对象参与物理模拟(重力、碰撞力)。 |
| OnCollisionEnter() | Unity 在碰撞时自动调用的事件函数。 |
| Collision 参数 | 包含此次碰撞的信息(接触点、被撞物体等)。 |
| Tag | 用于标识对象类型,比 Name 判断更高效安全。 |
| movement.enabled | 控制脚本启用与禁用状态。 |
🪄 延伸练习建议
✳️ 实现“Restart Level”功能:
SceneManager.LoadScene(SceneManager.GetActiveScene().name);需
using UnityEngine.SceneManagement;💡 在障碍物上添加粒子特效或破坏动画。
🧱 添加多种 Tag(如 Enemy、Pickup)并分类响应。
🧩 结合 UI 显示 “Game Over” 界面。
📚 下一集预告:Restart & Game Over System
Episode 06 将实现完整的“关卡重启机制”和“结束界面逻辑”,
玩家撞击障碍物后自动重新加载场景。