# Prefabs
Prefab是用于存储Entities、Components,以及实体和组件所有属性值的资源。Prefab资源可以看做一个用于创建场景中节点实例的模版。
如果想复用场景中的节点,比如游戏中的npc,可能会出现多次或者跨场景出现,此时就可以将npc节点序列化为一个Prefab资源。这样,每次只需要修改一个Prefab资源,修改就可以反映到所有用到此Prefab的场景中,远比简单的复制粘贴高效便捷。
上图中黄色的行星由prefab实例化产生
在小游戏中,支持Prefab嵌套的模式,即在一个prefab实例中可以引用其他prefab的嵌套情况。
也支持Prefab Variant(Prefab变体)的模式,Prefab Variant 允许用户在一个Prefab实例上进行修改,并序列化为一个新的Prefab资源。本质上,Prefab Variant的根结点是一个其他的Prefab资源,因此也只能在该Prefab的基础上进行修改。
同样支持游戏运行过程中对Prefab资源进行实例化,并将Prefab实例挂载到场景上。
# 创建Prefabs
在微信小游戏中,Prefab资源被看作是一个模版。你可以在编辑器中创建一个Prefab资源,并将其保存在Project窗口中。对于一个Prefab资源,可以实例化出若干个Prefab实例。Prefab实例既可以在编辑中创建保存到场景中,也可以在运行时再进行实例化。
# 创建Prefab资源
创建Prefab资源有两种方式:
- 如上图所示,可以在Project窗口右侧右键新建2dPrefab或者3dPrefab。
- 如下图所示,可以将Hierarchy的节点拖拽到Project文件夹中,即可生成以选中的节点为根结点的Prefab资源,该节点的所有子节点和组件的数据都会保存在生成的Prefab资源中。
# 创建Prefab实例
在编辑器中创建Prefab实例有两种方式:
- 如上图所示,右键Hierarchy窗口中的节点,点击“添加Prefab”,在弹框中选择Prefab资源,会将该Prefab资源的实例增加在所选的节点下。
- 如下图所示,可以将Project窗口中的Prefab资源拖拽到Hierarchy窗口的节点下,可以完成Prefab实例的创建。
所有Prefab实例的根结点,在Hierarchy中,都会有在节点最右边有一个箭头,点击此箭头会在一个新的场景标签中打开一个新的Prefab实例。
# 游戏运行时创建Prefab实例
Prefab可以很方便在创建复杂的节点树,在游戏运行时可以很方便的用代码来实现Prefab的实例化。
import engine from "engine";
@engine.decorators.serialize("InstantiatePrefab")
export default class InstantiatePrefab extends engine.Script {
public onAwake() {
// 注意:要在运行时加载Prefab资源,需要再编辑器里将该资源设置为入口资源
engine.loader.load('NewFolder/Planet.prefab').promise.then((prefabAsset) => {
// 将prefab资源实例化
const prefabInstance = prefabAsset.instantiate()
this.entity.transform.addChild(prefabInstance.transform)
})
}
}
# 创建Prefab Variant资源
创建方式如上图所示,把Hierarchy中的Prefab根节点拖拽到Project中,会有一个弹窗,让选择是要生成Variant Prefab还是Original Prefab。如果选择Original Prefab就会生成普通Prefab,如果选择Variant Prefab就会生成Prefab变体资源,即Prefab的根结点是另一个Prefab实例的根结点(如下图所示)。
# 编辑Prefab
# 通过打开Prefab资源编辑
在Project中,双击Planet.prefab资源,就可以打开该Prefab,如上图所示。可在Hierarchy中进行增删节点和组件,保存后就会更新该Prefab资源。
如果给该Prefab中“添加Prefab”,如下图所示,增加了一个根结点为explosionPartical的Prefab实例,就形成了Prefab嵌套的模式。
# 通过Prefab实例编辑
如上图所示,mygame场景中有一个Planet Prefab实例,给该实例中增加了一个NewEntity节点。在编辑器中,支持对Prefab实例节点和组件的编辑有:
- 增加节点
- 修改节点属性
- 增加组件
- 修改组件
- 删除组件
对Prefab实例的操作有以下三种:
- Prefab Unpack: 将Prefab实例退化为场景本身的节点。
- Prefab Revert: 回退Prefab实例上的所有修改。
- Prefab Apply: 将该Prefab实例上的所有修改保存到Prefab资源中。