# 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资源有两种方式:

  1. 如上图所示,可以在Project窗口右侧右键新建2dPrefab或者3dPrefab。
  2. 如下图所示,可以将Hierarchy的节点拖拽到Project文件夹中,即可生成以选中的节点为根结点的Prefab资源,该节点的所有子节点和组件的数据都会保存在生成的Prefab资源中。

# 创建Prefab实例

在编辑器中创建Prefab实例有两种方式:

  1. 如上图所示,右键Hierarchy窗口中的节点,点击“添加Prefab”,在弹框中选择Prefab资源,会将该Prefab资源的实例增加在所选的节点下。
  2. 如下图所示,可以将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资源中。