9.1 预制体(Prefab)的概念
预制体是一种可复用的 GameObject 模板。它将一个游戏对象及其所有组件、子对象、属性保存为资源文件(.prefab)。
创建预制体
- 在场景中搭建好一个 GameObject(例如:附带脚本、碰撞体、材质的敌人)
- 从 Hierarchy 拖拽到 Project 面板 → 自动生成
.prefab 文件
- 场景中的物体变为预制体实例(Inspector 顶部显示预制体关联)
预制体的优势
- 复用:一个预制体可多次放入场景
- 一致性:修改预制体资源,所有实例同步更新
- 动态生成:运行时通过
Instantiate 创建
- 嵌套:预制体内可包含子预制体
9.2 预制体实例化(Instantiate)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class Spawner : MonoBehaviour { [SerializeField] private GameObject enemyPrefab; [SerializeField] private Transform spawnPoint;
void Update() { if (Input.GetKeyDown(KeyCode.Space)) { GameObject enemy = Instantiate(enemyPrefab); GameObject enemy2 = Instantiate( enemyPrefab, spawnPoint.position, Quaternion.identity ); GameObject enemy3 = Instantiate( enemyPrefab, spawnPoint.position, Quaternion.identity, transform ); } } }
|
9.3 销毁对象(Destroy)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Destroy(gameObject);
Destroy(gameObject, 2f);
Destroy(otherGameObject);
Destroy(GetComponent<Rigidbody>());
DontDestroyOnLoad(gameObject);
|
9.4 实例化进阶用法
返回组件引用
1 2 3 4 5 6 7 8
| Enemy enemyScript = Instantiate(enemyPrefab, pos, rot) .GetComponent<Enemy>(); enemyScript.Initialize(health: 100, damage: 20);
public Enemy enemyPrefab; Enemy enemy = Instantiate(enemyPrefab, pos, rot);
|
对象池的基础写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class BulletPool : MonoBehaviour { [SerializeField] private GameObject bulletPrefab; private Queue<GameObject> pool = new Queue<GameObject>();
public GameObject Get() { if (pool.Count > 0) { GameObject bullet = pool.Dequeue(); bullet.SetActive(true); return bullet; } return Instantiate(bulletPrefab); }
public void Return(GameObject bullet) { bullet.SetActive(false); pool.Enqueue(bullet); } }
|
9.5 预制体变体(Prefab Variant)
预制体变体基于一个基础预制体,允许在变体中覆盖和添加属性。
使用场景
- 基础敌人预制体 → 变体:飞行敌人、地面敌人、Boss
- 基础武器预制体 → 变体:剑、弓、法杖
创建方式:右键预制体 → Create → Prefab Variant
9.6 本章小结
- 预制体是可复用的 GameObject 模板
Instantiate 在运行时动态创建对象
Destroy 销毁对象(可延迟)
- 实例化后可获取组件进行初始化设置
- 预制体变体实现基础 + 变种的高效工作流
- 频繁创建/销毁的场景应考虑对象池优化
练习题
- 制作一个子弹预制体(Sphere + Rigidbody),按鼠标左键发射子弹
- 实现点击鼠标在鼠标位置生成一个敌人
- 为子弹添加 3 秒后自动销毁的逻辑
- 制作一个简单对象池管理子弹的复用