Skip to content

简介

预制体(Prefab)的实例化过程,即为将存储于 预制体资产(Prefab Asset)中的 游戏对象(Game Object)集合拷贝并显示于场景中。您可以在场景编辑时实例化预制体(即为静态实例化预制体)或在脚本运行时实例化预制体(即为动态实例化预制体)。预制体实例及其包含的游戏对象以浅黄色文本和立方体预制体图标显示在 层级窗口(Hierarchy)中。

【Prefab_Instantiation000.png】

层级窗口(Hierarchy)中的预制体实例。

场景编辑时实例化

在编辑场景时,以下方法可以快速将 预制体资产(Prefab Asset)进行实例化。

方法一:

将预制体资产从 项目窗口(Project)拖拽到 层级窗口(Hierarchy),即可在场景中生成 1 个该 预制体(Prefab)的实例,且此方法能快速定位预制体实例化的场景位置。

【Prefab_Instantiation001.gif】

方法二:

将预制体资产从 项目窗口(Project)拖拽到 场景预览窗口(Scene),即可在场景中生成 1 个该 预制体(Prefab)的实例。

【Prefab_Instantiation002.gif】

脚本运行时实例化

在脚本中,通过 Resources.Load(Type,ID) 代码可以根据 预制体资产(Prefab Asset)的 ID 动态获取 Prefab 类型的预制体资产。详情请参阅 API 文档 Resources.Load 的相关内容。随后通过 Prefab.Instance() 的方式,即可将预制体资产在脚本中动态实例化。

若需要获取预制体资产的 ID,可以在 项目窗口(Project)中用鼠标指向对应的预制体资产,点击鼠标右键打开该预制体资产的上下文菜单,点击 复制资源 ID(Copy Asset ID) ,即可复制选中的预制体资产的 ID 至剪贴板中。

【Prefab_Instantiation003.png】

假设需要实例化的预制体资产 ID 为 "Prefab001UUID" 。 将此预制体资产动态实例化的代码示例如下:

typescript
class PrefabInstantiation extends Component {
    //预制体资产的上下文菜单 复制资源 ID(Copy Asset ID)后得到资源 ID 为:Prefab001UUID

    //定义私有变量保存预制体资产;
    private _newPrefab:Prefab;

    OnStart(): void {
        //根据预制体资产的 ID 获取预制体资产并将其保存为 _newPrefab 私有变量;
        this._newPrefab = Resources.Load(Prefab,"Prefab001UUID");

        //将预制体资产实例化
        this._newPrefab.Instance();
    }

    OnUpdate(): void {
    }

}

预制体实例

场景中的 预制体(Prefab)实例,数据源来自 预制体资产(Prefab Asset)的反序列化,所以它的数据默认同步了同一预制体资产,如果对预制体实例中的各项属性进行修改,修改的属性值会被存储在预制体实例中,所以不会影响到预制体资产和它生成的其他预制体实例的属性值。

--------------
比如将带有逻辑脚本的白色钻石模型预制体在场景中实例化 5 次。
【Prefab_Instantiation004.png】

每个钻石可以更改不同的颜色属性。
【Prefab_Instantiation005.png】

且在 检视窗口(Inspector)中预览钻石模型的预制体资产时,看到该预制体资产的颜色属性依旧是实例化前的白色。
【Prefab_Instantiation006.png】
--------------

NOTE

目前功能中,在 场景预览窗口(Scene)中对预制体实例的编辑,会在项目保存时自动撤销,预制体实例的属性数据将还原成预制体资产中储存的预制体数据。

预制体实例上下文菜单

在 层级窗口(Hierarchy)中,鼠标指向预制体实例中的任一 游戏对象(Game Object),并点击鼠标右键,即会打开该游戏对象对应的上下文菜单,与普通游戏对象不同的是,点击 预制体(Prefab)选项,将可以对预制体实例进行以下内容的编辑。

【Prefab_Instantiation007.png】

名称描述
覆盖到预制体(Overlay To Prefab)将当前预制体实例的所有数据更新到所关联的 预制体资产(Prefab Asset)中,此功能通常用于将预制体实例的编辑应用于预制体,使用方法请参阅 通过预制体实例编辑预制体 章节。
还原为预制体(Revert To Prefab)将当前预制体实例的数据还原为预制体资产中的数据,其中名字、位置和旋转不会被还原为预制体资产中的数据。
选择预制体根节点(Select Prefab Root)在 层级窗口(Hierarchy)中自动跳转选中该游戏对象所在预制体实例的根节点,即保存为所关联的预制体资产的根游戏对象。
【Prefab_Instantiation009.gif】
打开(Unpack)将预制体实例的内容恢复到常规 游戏对象(Game Object)集合,详情请参阅 打开预制体 章节。

预制体实例丢失状态

如果预制体实例所关联的 预制体资产(Prefab Asset)被删除,或者损毁,或者 ID 出现了变更,在 层级窗口(Hierarchy)中预制体实例根游戏对象的名字旁会出现 “ (missing) ” 的标识。

【Prefab_Instantiation008.png】

编辑预制体实例的限制

当前版本的 SandMod 编辑器在场景中编辑预制体实例会有以下限制:

  • 不允许在预制体实例中删除从预制体资产中创建的 游戏对象(Game Object)。
  • 不允许在预制体实例中新增游戏对象。
  • 不允许在预制体实例中更改从预制体资产中创建的游戏对象的层级关系。
  • 不允许在预制体实例中为从预制体资产中创建的游戏对象上增删 组件(Component)。