预制体功能说明
阅读本文大概需要 20 分钟
为了开发者更好的了解与使用预制体,本文主要包含以下 3 个内容:
(1)预制体简介(2)预制体使用指南(3)使用注意事项
预制体简介
预制体是什么
- 预制体是可重复使用的游戏对象组合,是一种将游戏对象组合成一个整体并保存为一个独立资源的机制。预制体可以用来创建和存储一个游戏对象的所有组件、各项属性和子对象。当需要多次重复使用同一个游戏对象时,便可以使用预制体,将该游戏对象设置为预制体。
预制体基础规则
- 预制体结构
预制体均包含一个预制体头结点,当创建一个空预制体时,会自动生成一个默认的头节点。
预制体头结点下为预制体子对象,子对象间可以是平级、父子级结构关系
预制体引用对象
- 编辑状态下将预制体拖拽挂载至主视口、对象管理器中的操作称为预制体引用,生成的对象称为预制体引用对象
预制体使用指南
预制体的创建与存储
新建预制体
方法:点击工程内容-预制体分类中【新建预制体】按钮
已有对象生成为预制体
方法 1:选中对象管理器中对象,点击右键菜单中【生成为预制体】,将选中对象及其子对象生成为预制体
- 仅同一父节点的对象支持创建
- 方法 2:选中对象管理器中某实例状态的预制体引用对象头结点,点击右键菜单中【另存为新预制体】,选中的实例状态预制体引用对象将与原预制体脱离引用关系,并生成为新预制体
- 方法 3:从对象管理器中选中对象拖入至工程内容-预制体分类下
若选中的对象为同父节点且不包含预制体引用的对象,将选中对象及其子对象生成为新预制体,在工程内容-预制体根目录下创建预制体文件夹,在该文件夹中定位并选中预制体
对象管理器中该对象及其子对象变更为预制体引用对象
预制体的存储
- 工程内容-预制体分类中存储着当前工程下所有的预制体资源
每个预制体以单独的 prefab 文件存在,其所引用的脚本、UI、材质均分别存于对应的文件类型下,不会与 prefab 文件整合
- 名为“示例”的预制体中引用了名为“DefaultUI”的 UI 文件和名为“test”的脚本文件,锥体 1 引用了名为“新建材质”的材质文件
- 此时各文件存于各自的目录下
预制体的编辑
预制体编辑视口中进行编辑
- 入口 1:在工程内容中选中某预制体,点击右键菜单中【编辑】或双击预制体文件,可在预制体编辑视口中打开选中预制体进行编辑
(通过工程内容打开预制体进行编辑)
- 入口 2:在对象管理器中选中某预制体头结点,点击右键菜单中【编辑预制体】,可在预制体编辑视口中打开选中预制体进行编辑
(通过对象管理器打开预制体进行编辑)
保存预制体修改
预制体编辑视口中保存
- 点击工程内容中【保存】按钮保存对预制体的修改
- 切换编辑状态及编辑对象时,点击保存提示弹窗中【保存】按钮
- 主编辑器中保存
- 点击某预制体右键菜单中【更新预制体】,将当前在对象管理器中对预制体引用对象的修改保存
- 点击某预制体右键菜单中【另存为新预制体】,将当前在对象管理器中对预制体引用对象的修改另存为新预制体
预制体的使用
编辑状态
- 可以在资源库或工程内容中找到预制体,拖拽至对象管理器及主视口中创建预制体引用对象
运行状态
- 通过 API 动态生成预制体引用对象
ts
/*动态生成预制体引用对象,需要本地资源库或工程内容中预制体资源ID(需要预加载资源)*/
GameObject.spawn("AssetId")
/*异步生成预制体引用对象,需要本地资源库或工程内容中预制体资源ID(无需预加载资源)*/
GameObject.asyncSpawn("AssetId")
/*动态生成预制体引用对象,需要本地资源库或工程内容中预制体资源ID(需要预加载资源)*/
GameObject.spawn("AssetId")
/*异步生成预制体引用对象,需要本地资源库或工程内容中预制体资源ID(无需预加载资源)*/
GameObject.asyncSpawn("AssetId")
预制体的删除
当工程内容中的预制体时,将校验场景中是否含有该预制体的引用对象
- 若有引用对象,则弹出弹窗
删除引用对象:删除此预制体的同时,删除此预制体在场景中的引用对象
解除引用关系:删除此预制体,但保留场景中的对象,使其变为普通对象,不再依赖于原预制体文件
若没有引用对象,则显示二次确认弹窗
- 删除预制体文件夹时,显示二次确认弹窗,点击确认后,将对文件夹中的所有预制体执行“删除引用对象”逻辑
预制体的导入、导出
导出预制体
在工程内容-预制体分类下选中某预制体,点击右键菜单中【导出】按钮,在资源管理器中选择导出路径后将该预制体打包导出
将该预制体描述文件(.prefab 文件)以及所有其引用的文件全部导出,并保证文件之间的相对路径不变
- 若脚本/UI 中引用了其他脚本,多次引用的脚本及路径信息一并导出,保证相对路径不变
导入预制体
- 点击工程内容-预制体分类下【导入预制体】按钮,在资源管理器中选择要导入的预制体后将预制体导入
导入时将解析预制体文件,并还原所有引用文件至工程中
导入时将显示导入详情面板,给开发者提供 prefab 的结构信息
若当前工程中的文件与导入的 prefab 有冲突,将给用户提供重命名或覆盖操作
覆盖:选择覆盖,导入时将导入的文件覆盖导入;并在文件右侧显示覆盖图标
- 当原工程中的文件与此文件发生冲突但路径不同时,显示提示如下图
重命名:选择重命名,导入时将导入的文件自动重命名导入
对于脚本类型而言,若重命名修改的脚本正在被其他脚本引用,则树状结构中显示引用此脚本的脚本文件,并在此脚本后显示文本:“该脚本引用了xxx.ts,导入后请手动修改”
若与当前工程中的文件无冲突,则分两种情况
新增:当前工程没有与该文件冲突的文件,显示绿色new标识
忽略:当前工程存在一个完全相同的文件,此时不显示任何标识与操作
解除预制体
- 在对象管理器中,右键预制体头结点,提供解除预制体操作
- 该操作能够将预制体引用对象变为普通对象(紫色——白色)
使用预制体功能的注意事项与建议
使用 spawn 动态生成预制体时,需要 使用AssetUtil类去下载加载 预制体 资源,或者将预制体拖入对象管理器中的优先加载区域
使用 asyncSpawn 异步生成预制体时,无需预加载资源