Unity基础:Prefab预制体入门——从创建到实例化的完整流程

大家好,欢迎回到Unity教程系列。前面我们学习了Instantiate和Destroy——运行时创建和销毁物体的方法。但你可能会问:Instantiate需要传入一个模板,这个模板从哪来?答案就是今天的主角——Prefab(预制体)。
预制体是Unity中最核心的资源类型之一。它让你可以"定义一次,复用无数次"——创建一个子弹预制体,然后射出一万发;创建一个敌人预制体,然后刷出几百个。没有预制体,就没有高效的游戏开发流程。
一、预制体的核心概念
1.1 什么是预制体
💡 预制体(Prefab)是一个预先配置好的GameObject模板。它保存在Assets文件夹中(.prefab文件),包含了完整的GameObject结构——组件配置、属性值、子物体层级——就像一个"场景物体的快照"。
你可以把预制体理解为"模具":
- 预制体 = 模具
- 场景中的预制体实例 = 用模具浇铸出来的产品
- 修改模具 → 所有产品都跟着变
1.2 预制体的核心价值
复用性:创建一个敌人预制体,在场景中放100个实例。每个实例都是预制体的"分身",修改预制体就会影响所有100个实例。
一致性:所有实例共享预制体的基础配置。你不会出现"这个敌人的速度是5,那个敌人的速度不小心设成了50"的情况。
动态生成:通过Instantiate在运行时生成。没有预制体,你就无法在代码中生成子弹、敌人、特效。
版本管理:预制体以单个文件形式存在,方便Git管理和团队协作。
1.3 预制体在Project窗口中的标识
预制体在Project窗口中显示为白色(或蓝色)立方体图标。当你将预制体拖到Hierarchy或Scene中时,新创建的实例名称在Hierarchy中显示为蓝色文字(区别于普通GameObject的白色文字)。
实例的Inspector顶部会有几个特殊的按钮:Open(打开预制体编辑模式)、Select(在Project中选中预制体资源)、Overrides(查看覆盖的属性)。
二、创建预制体
2.1 从场景物体创建预制体
① 在场景中创建一个GameObject并配置好(添加组件、调整属性、设置子物体等)
② 在Hierarchy中选中这个GameObject
③ 将它从Hierarchy拖到Project窗口中的目标文件夹
④ 松开鼠标——预制体创建完成!
场景中的原物体自动变成新预制体的实例(文字变蓝)。
2.2 创建空预制体
① 在Project窗口中右键 → Create → Prefab
② 这会创建一个空的预制体资源(白板状态)
③ 你可以双击打开它进入预制体编辑模式,在里面添加组件和子物体
2.3 从预制体变体创建
后续文章会详细讲解Prefab Variant(预制体变体)——它是基于已有预制体创建的有继承关系的"子预制体"。
2.4 创建预制体的时机
✅ 只要一个物体/物体结构需要在游戏中多次出现,就应该做成预制体:
- 玩家角色、敌人、NPC
- 子弹、导弹、弹壳
- 道具、金币、宝箱
- UI面板、按钮、弹窗
- 建筑物、装饰物
- 特效(爆炸、尘埃、魔法)
三、预制体的编辑
3.1 打开预制体编辑模式
有三种方式进入预制体编辑模式:
方式一:双击预制体资源
在Project窗口中双击.prefab文件。
方式二:点击实例的Open按钮
选中Hierarchy中的预制体实例,在Inspector顶部点击"Open"。
方式三:点击实例名旁的箭头
在Hierarchy中,预制体实例名称右侧有一个小箭头(>),点击即可进入编辑模式。
3.2 预制体编辑模式界面
进入预制体编辑模式后:
- Scene视图会切换到独立的预制体编辑场景(画面背景变暗)
- Hierarchy只显示预制体的结构(没有其他场景物体)
- Inspector正常显示
- 顶部出现面包屑导航栏:
场景名 > 预制体名
3.3 在预制体编辑模式中修改
你可以在预制体编辑模式中做任何操作:
- 添加/删除子物体
- 添加/删除组件
- 修改组件属性
- 调整Transform
所有修改会自动保存(无需手动保存操作),点击面包屑导航中的场景名即可退出编辑模式。
3.4 在场景中覆写实例属性
即使物体是预制体实例,你仍然可以在Inspector中单独修改它的属性——这些修改被视为对预制体的覆写(Override)。
被覆写的属性在Inspector中会以加粗显示,并在左侧显示蓝色竖线标记。右键被覆写的属性,可以选择:
- Revert:恢复到预制体的默认值
- Apply to Prefab:将这个修改应用到预制体(使所有实例都获得此修改)
3.5 Overrides窗口
选中预制体实例,Inspector顶部的"Overrides"下拉窗口会显示所有被覆写的属性:
- 点击"Apply All":将所有覆写应用到预制体
- 点击"Revert All":恢复所有覆写到预制体默认值
- 单独选择某个覆写项进行Apply或Revert
四、预制体的实例化
4.1 编辑器中的实例化
方式一:拖拽到Scene/Hierarchy
将预制体从Project窗口拖到Scene视图或Hierarchy窗口中。每次拖拽创建一个新实例。
方式二:拖拽到Inspector
对于需要引用的脚本(如GameObject、Transform字段),将预制体拖到Inspector的引用槽中。
4.2 脚本中的实例化
public class PrefabSpawner : MonoBehaviour
{
public GameObject enemyPrefab; // 在Inspector中拖拽预制体到此处
public Transform spawnPoint;
void Start()
{
// 方式一:无参数
GameObject enemy1 = Instantiate(enemyPrefab);
// 方式二:指定位置和旋转
GameObject enemy2 = Instantiate(enemyPrefab, spawnPoint.position, spawnPoint.rotation);
// 方式三:指定父物体
GameObject enemy3 = Instantiate(enemyPrefab, spawnPoint);
// 方式四:完整参数
GameObject enemy4 = Instantiate(enemyPrefab, spawnPoint.position, spawnPoint.rotation, spawnPoint);
}
}
4.3 实例化时的特殊处理
// 实例化后立即修改实例属性
GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
Bullet bulletScript = bullet.GetComponent<Bullet>();
bulletScript.damage = currentWeaponDamage;
bulletScript.speed = currentWeaponSpeed;
// 或者给实例设置特定的子物体状态
GameObject enemy = Instantiate(enemyPrefab, spawnPos, Quaternion.identity);
enemy.name = $"Enemy_{enemyIndex}"; // 给唯一名称方便调试
enemy.GetComponent<Enemy>().level = Random.Range(1, 5); // 随机等级
五、预制体的嵌套
5.1 预制体中的预制体引用
预制体内部可以包含其他预制体的实例。例如:
Character.prefab
├── Model(3D模型)
├── WeaponHolder
│ └── Sword.prefab 实例(子预制体引用)
└── HeadArmor
└── Helmet.prefab 实例
这种方式非常灵活——角色预制体包含了武器的引用,但武器本身也是独立的预制体。
5.2 修改嵌套预制体
如果你修改了Sword.prefab(在Project中双击打开编辑),所有引用它的角色预制体实例都会自动更新武器的外观——这就是预制体系统的强大之处。
六、预制体与场景工作流
6.1 推荐的工作流
① 制作预制体:在场景中搭建好物体 → 拖入Project创建预制体
② 批量放置:将预制体拖到场景中需要的位置,创建多个实例
③ 调整实例:对特殊位置的实例做个别覆写(如旋转角度、颜色变化)
④ 长期维护:需要全局修改时,编辑预制体本身
6.2 预制体的解包(Unpack)
如果你想断掉实例与预制体的关联:
① 选中Hierarchy中的预制体实例
② 右键 → Prefab → Unpack
③ 实例变回普通的GameObject(不再蓝色显示、不再受预制体修改影响)
Unpack Completely:完全解包,包括所有嵌套的预制体引用。
6.3 将修改过的实例创建为新预制体
如果你对某个实例做了大量覆写,想将其保存为新的预制体:
① 选中该实例
② 将它从Hierarchy拖到Project窗口中
③ 选择"Create Original Prefab"或"Create Prefab Variant"
七、预制体的最佳实践
7.1 合理的预制体粒度
不是粒度越细越好。一个预制体应该是一个"有意义的功能单元":
- ✅ 好:一个完整的敌人(模型+动画+脚本+碰撞器+血条UI)
- ❌ 太细:只包含一个BoxCollider的预制体(复用价值低)
- ❌ 太粗:整个关卡做成一个预制体(几乎无法复用)
7.2 命名规范
- 预制体名称清晰描述其内容:
Enemy_Goblin、Bullet_Fireball、UI_DialogPanel - 使用前缀或后缀区分类型:
PF_前缀(如PF_Player)有助于在Project窗口中快速识别
7.3 预制体文件夹组织
Assets\Prefabs\
├── Characters\
│ ├── Player.prefab
│ ├── Enemy_Goblin.prefab
│ └── NPC_Merchant.prefab
├── Projectiles\
│ ├── Bullet_Normal.prefab
│ └── Bullet_Homing.prefab
├── Items\
│ ├── Coin.prefab
│ └── HealthPotion.prefab
├── Effects\
│ ├── Explosion.prefab
│ └── MagicCircle.prefab
└── UI\
├── HUD.prefab
└── PopupDialog.prefab
八、常见问题
8.1 实例修改没有生效
如果你是修改预制体资源(双击打开编辑),所有实例会自动更新。但如果某个实例对该属性做了覆写(蓝色竖线+加粗),预制体的修改不会覆盖这个实例的覆写值。
解决方案:打开该实例的Overrides窗口,Revert需要更新的属性。
8.2 预制体丢失(红色/Missing)
预制体文件被删除或移动了,但场景中还有它的实例引用。实例Inspector中会显示红色"Missing"。
解决方案:恢复预制体文件到原位置,或重新分配引用。
8.3 预制体引用断开
在代码中,如果将预制体资源赋值给了GameObject prefab字段,但后来修改了prefab变量在Inspector中的引用,需要确保新引用也是一个有效的预制体。
九、本篇总结
✅ 本文核心知识点回顾:
- 预制体(Prefab)是预先配置好的GameObject模板,保存在Assets中
- 场景中的预制体实例显示蓝色文字,Inspector中有Open/Select/Overrides按钮
- 双击预制体进入编辑模式,修改会自动保存并影响所有实例
- 实例可以覆写属性,Overrides窗口管理覆写(Apply/Revert)
- Instantiate在运行时根据预制体创建实例
- 合理组织预制体文件夹,使用有意义的命名规范
- 预制体可以嵌套(预制体包含其他预制体的实例)
📝 下一篇文章将学习Prefab Variant预制体变体——继承与覆写的艺术。
动手任务:
① 创建一个敌人预制体(包含模型/碰撞器/脚本等完整配置)
② 在场景中放置10个该预制体的实例,尝试修改预制体观察效果
③ 用代码Instantiate预制体并在不同位置生成
关于作者:拥有多年Unity开发经验的游戏开发者,专注Unity系统化教学与最佳实践分享。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_43151418/article/details/170242862




