# 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 资源中。