How to Develop a Game
Prefab System
PublishDate: 2025-05-31 | CreateDate: 2025-05-31 | LastModify: 2025-05-31 | Creator:ljf12825

Unity提供Prefab这种非常强大的机制,用来复用游戏对象,让开发更高效、项目更模块化
Prefab就是一个可以重复使用的GameObject模板

什么是Prefab

Prefab是你在场景里创建好的GameObject(可以包含模型、脚本、组件、子物体等),然后把它拖到项目窗口中生成的资源文件。
之后就可以随时从Project中把这个模板拖入场景,生成和原始一样的对象

Prefab特点

特性描述
模板复用一次创建,多次使用
改动同步修改 Prefab,会自动同步所有实例
支持嵌套Prefab 可以包含另一个 Prefab
可分离Prefab 实例可以局部修改,不影响原始 Prefab

Prefab实例与原型的关系

当你把Prefab拖入场景,它会成为Prefab实例,你可以

图标颜色状态
蓝色立方体与原 Prefab 保持连接
灰色立方体已经解除连接(Unpacked)

Prefab编辑方式

1.Open Prefab:双击或点击小蓝箭头进入Prefab编辑模式
2.Override面板:查看并应用或还原你对实例的修改 3.Apply to Prefab:将实例的更改写入原始Prefab

Prefab的创建和使用

创建 1.在Hierarchy中创建好一个GameObject及其组件和子对象
2.拖拽到Project视图中,Unity自动保存为.prefab 3.你可以删除场景中的对象,只保留Project中的预制体

使用

void Shoot() => Instantiate(bulletPrefab, transform.position, transform.rotation);

Apply / Revert操作

Apply

把场景中的某个Prefab示例上做的修改,应用回Prefab Asset,让所有示例都得到这个更新
在 Hierarchy 选中一个修改过的 Prefab 实例 → 在 Inspector 顶部看到蓝色小条(表示有修改)→ 点击右上角小菜单 ≡ → 选择:
Apply All:把所有改动应用回 Prefab。
Apply to Prefab Name:只应用当前对象。
Apply to Root:应用根 Prefab(对于嵌套 Prefab 情况)。

Revert

同样的位置点击:
Revert All:撤销所有更改
Revert Component:仅撤销某个组件的改动

实例化Prefab

在运行时通过代码动态创建一个GameObject的副本

GameObject obj = Instantiate(prefab)

完整示例

using UnityEngine;

public class Spawner : MonoBehaviour
{
    public GameObject prefab;

    void Start()
    {
        Instantiate(prefab, transform.position, transform.rotation);
    }
}

Instantiate几种重载

用法说明
Instantiate(prefab)在默认位置 (0,0,0) 实例化,没旋转
Instantiate(prefab, position, rotation)指定位置和旋转
Instantiate(prefab, parent)设置父物体
Instantiate(prefab, position, rotation, parent)完整版本,常用

管理多个实例:比如使用List存储

List<GameObject> enemies = new List<GameObject>();

void SpawnEnemy()
{
    GameObject enemy = Instantiate(enemyPrefab, RandomPos(), Quaternion.identity);
    enemies.Add(enemy);
}

实例化后销毁

Destroy(gameObject); //下一帧销毁
Destroy(gameObject, 2f); //2秒后销毁

嵌套Prefab

Nested Prefab是指:一个Prefab内部再包含其他Prefab实例,这样可以构建更加复杂、模块化、易维护的结构

嵌套Prefab的优点

Prefab Variant

Prefab Variant(预制体变体)是一种现有Prefab派生出来的子类Prefab,它继承原始Prefab的结构和属性,但又可以进行自定义修改而不影响原始Prefab

在Project面板中选中一个Prefab,右键-Create-Prefabvariant

在Variant中,可以添加新组建,修改属性;但是不可以删除原有组件,并且最好不要修改结构(层级、命名),容易破坏继承结构

动态加载Prefab(Resources / Addressables)

在运行时从资源中加载一个Prefab并实例化它,常用于:

Resources.Load

基本语法

GameObject prefab = Resource.Loda<GameObject>("/path")
Instantiate(prefab, pos, roa);

使用流程

1.将Prefab放入Assets/Resources文件夹
2.加载并实例化

动态加载常用于需要灵活性、不是频繁生成的物体,运行时加载不如静态引用快
动态加载无法自动释放内存,建议手动Resources.UnloadUnusedAssets()

Addressables

如果项目大,Prefab多,建议使用Unity的Addressables System,支持:

Prefab和对象池的结合使用

将Prefab与Object Pooling结合使用,是Unity中非常高效的优化手段,特别适合用于:

Prefab + Object Pooling的基本原理

1.提前加载Prefab
2.批量生成一定数量的实例
3.禁用它们,加入池中
4.每次需要物体时,从池中取出并启用
5.用完后,返回池中而不是销毁

详见:Object Pooling

Prefab实战用法

场景Prefab 应用
UI 系统每个按钮、弹窗都是一个 Prefab
关卡组件场景中的房子、门、陷阱都可以做成 Prefab
敌人生成动态从代码中 Instantiate(enemyPrefab)
粒子特效爆炸、烟雾、光环 Prefab 可复用