Prefab:复用对象,也复用配置
棋盘上有十六个物品,如果每个都手动添加图片、拖拽脚本和参数,很快就会出现不一致。Prefab 把一组对象及其组件配置保存成资源,让你能重复创建。
Prefab 像一个可实例化的对象模板。 它同时包含结构、组件和配置,不能只把它理解成 C# 类。
资产与实例,修改范围不同
| 你正在改哪里 | 影响范围 | 典型用途 |
|---|---|---|
| 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。下一站:帧循环与生命周期。