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 将实现完整的“关卡重启机制”和“结束界面逻辑”,

玩家撞击障碍物后自动重新加载场景。