首页/ 第 6 章 · 游戏对象与组件交互/ 第 76 课
LESSON 76 · 游戏对象与组件交互

实例化 Instantiate 动态创建对象

实例化已掌握。下一课学习销毁对象 Destroy。

⏱ 约 15 分钟📊 难度:入门🗂 第 6 章 · 游戏对象与组件交互📍 第 76 / 300 课
课程进度
76 / 300

🎯本节学习目标

  • 理解实例化的作用
  • 掌握 Instantiate 语法
  • 用实例化生成游戏对象

🚀课程导读

游戏里到处是“动态生成”:按一下射一颗子弹、刷一波敌人。这全靠实例化(Instantiate)。

什么是实例化

“从模板复制出新对象”。

  1. 实例化 = 根据一个“模板”(预制体或已有对象)在运行时创建新对象。
  2. 语法:Object.Instantiate(模板) 或简写 Instantiate(模板)。
  3. 最常用模板是预制体(第 32-34 课),也可是场景里的现有对象。
  4. 例:Instantiate(bulletPrefab); 生成一个子弹对象。
  5. 【返回引用】GameObject newObj = Instantiate(prefab); 可拿到新对象做后续操作。
  6. 【指定位置】Instantiate(prefab, position, rotation); 在指定位置与角度生成。
  7. Unity 的简写:MonoBehaviour 里的 Instantiate 可直接使用(省略 Object)。
💡
学会实例化 = 学会“量产”:一颗子弹的预制体可以瞬间变出 100 颗。

实例化实战:发射子弹

做一个按空格发射子弹的效果。

  1. 先做【子弹预制体】:场景里创建一个 Sphere(小球),缩小到 (0.2,0.2,0.2),加黄色材质,加 Rigidbody。
  2. 把它拖到 Project 的 Prefabs 文件夹变成预制体,然后从场景中删除这个“模板原型”。
  3. 把子弹预制体拖回场景放在原点外,选中它,改名为 Bullet,确认有 Rigidbody 后把它也变成预制体(或在 Prefabs 里直接用它)。
  4. 创建脚本 Shooter,挂到空对象上:
  5. public GameObject bulletPrefab; // 在 Inspector 拖入子弹预制体
  6. void Update() { if (Input.GetKeyDown(KeyCode.Space)) { Instantiate(bulletPrefab, transform.position, Quaternion.identity); } }
  7. 保存播放:按空格,场景里不断生成子弹!
  8. 【说明】Quaternion.identity 表示“无旋转”(Quaternion 四元数第 81 课提及)。
  9. 【进阶】给子弹脚本让它自己向前飞:在子弹预制体上加 MoveForward 脚本(transform.Translate(Vector3.forward * speed * Time.deltaTime))。
Instantiate + 预制体 = 游戏开发的核心循环:生成→行动→销毁。

常见错误与排查

错误:实例化出的对象没有任何位置/属性?
原因:忘了设置 position/rotation 参数
解决:用 Instantiate(prefab, pos, rot) 三个参数版本。
错误:每帧生成一堆对象导致卡顿?
原因:在 Update 里无条件实例化
解决:只在触发时生成(按键/定时),并记得销毁(第 77 课)。

动手练习

课后小任务(做出来才算真的学会)

  • 把子弹做成预制体并通过 Instantiate 生成
  • 给生成的子弹加一个自动前进的脚本
  • 把生成位置改成枪口处的一个空对象

本节小结

实例化已掌握。下一课学习销毁对象 Destroy。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课向量 Vector3 基础