预制体与动态实例化

9.1 预制体(Prefab)的概念

预制体是一种可复用的 GameObject 模板。它将一个游戏对象及其所有组件、子对象、属性保存为资源文件(.prefab)。

创建预制体

  1. 在场景中搭建好一个 GameObject(例如:附带脚本、碰撞体、材质的敌人)
  2. 从 Hierarchy 拖拽到 Project 面板 → 自动生成 .prefab 文件
  3. 场景中的物体变为预制体实例(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
);

// 指定父级(保持整洁的 Hierarchy)
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);

// 延迟销毁(2 秒后)
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 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 销毁对象(可延迟)
  • 实例化后可获取组件进行初始化设置
  • 预制体变体实现基础 + 变种的高效工作流
  • 频繁创建/销毁的场景应考虑对象池优化

练习题

  1. 制作一个子弹预制体(Sphere + Rigidbody),按鼠标左键发射子弹
  2. 实现点击鼠标在鼠标位置生成一个敌人
  3. 为子弹添加 3 秒后自动销毁的逻辑
  4. 制作一个简单对象池管理子弹的复用
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
Unity3D开发基础教程 系列
第 9/20 篇
分享: