跳到主要内容

Prefab:复用对象,也复用配置

棋盘上有十六个物品,如果每个都手动添加图片、拖拽脚本和参数,很快就会出现不一致。Prefab 把一组对象及其组件配置保存成资源,让你能重复创建。

Prefab 像一个可实例化的对象模板。 它同时包含结构、组件和配置,不能只把它理解成 C# 类。

一个 Prefab 资产生成多个场景实例,实例可以有局部覆盖的示意

资产与实例,修改范围不同​

你正在改哪里影响范围典型用途
Prefab 资产使用该模板且没有相应覆盖的实例统一调整阴影、组件或默认外观
场景中的实例当前实例的覆盖属性特定位置、局部颜色
运行时创建的实例本次运行对象显示某个格子的当前物品

实例上的修改可能形成 Override。把覆盖 Apply 回源资产,会扩大修改范围;Revert 则恢复模板设置。操作前先看清当前对象和属性,不要为了让一个物品变大,误改所有物品的模板。

数据与 Prefab 各自保存什么​

合成游戏不一定需要“一级 Prefab、二级 Prefab、三级 Prefab”各一份。若结构相同,可以只有一个物品 Prefab,再由等级配置决定图片、分数和显示文本。

配置适合放稳定信息,例如某等级使用哪张图片。运行时信息则放棋盘状态,例如某格现在是几级、当前分数多少。Prefab 本身不应成为存档记录。

最小创建示例​

这是创建方式片段,假设已有 itemPrefab 和 boardRoot 引用。UI Prefab 的根应是 RectTransform;创建后还需要绑定格子与物品数据。

[SerializeField] private GameObject itemPrefab;
[SerializeField] private Transform boardRoot;

private GameObject CreateItem()
{
// false:使用父对象的局部空间,适合后续统一布局。
return Instantiate(itemPrefab, boardRoot, false);
}

不要在 Awake 中读取尚未由创建者绑定的等级。Instantiate 期间可能已经触发初始化回调。更清晰的方式是让组件在初始化时只准备自身依赖,再由 Bind 一类方法接收业务数据并刷新。

什么时候需要 Variant​

如果“普通物品”和“带锁物品”结构高度相似,但某些组件和默认配置不同,可以考虑 Prefab Variant。它适合表达稳定的结构差异。

单纯的等级数值差异通常用数据更直接。每个等级一个复杂 Variant 链,会让继承关系、覆盖和 AI 修改范围都更难理解。

AI 协作与验收​

要求 AI 说明:修改的是源 Prefab 还是实例;是否新增了覆盖;配置缺失怎么办;运行时怎样绑定与清理。

验收时至少放两个实例:只修改其中一个,观察另一份是否受影响;再修改源模板,确认预期的公共属性更新。最后退出 Play,检查资产和场景里留下了什么变化。

参考:Unity Prefabs。下一站:帧循环与生命周期。