本文意在整合预制件相关重要信息,将较多的信息量浓缩出精华,并记录个人理解心得
一.预制件的概念和用途
Unity 的预制件系统允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。预制件资源充当模板,在此模板的基础之上可以在场景中创建新的预制件实例。
精简结论:预制件是gameObject的模板
二.预制件应用场合
- 要在场景中的多个位置或项目中的多个场景之间重用以特定方式配置的游戏对象,比如道具,子弹,怪物,应将这类游戏对象转换为预制件
- 如果游戏对象在一开始不存在于场景中,而希望在运行时实例化游戏对象(比如UI界面,子弹等),即使只有一个也应使用预制件。
精简结论:在场景中存在多个或运行时生成的游戏对象应转换为预制件
预制件的掌握应该达成双向理解的程度:满足应用条件时能反应过来创建预制件,看到已存在的预制件时能判断出于什么需要而创建的
三.创建预制件资源和实例
3.1 创建预制件资源
将一个gameObject从 Hierarchy 窗口拖入 Project 窗口。该游戏对象和子游戏对象在 Project 窗口中成为新的资源。Project中的蓝色立方体图标代表预制件资源。
创建预制件资源的这一过程也会将原始游戏对象转换为预制件实例。该对象现在将成为新创建的预制件资源的实例。预制件实例以蓝色文本显示在 Hierarchy 窗口中,预制件的根游戏对象显示为蓝色立方体预制件图标。
3.2 创建预制件实例
可通过将预制件资源从 Project 视图拖动到 Hierarchy 或 Scene 视图,在 Editor 中创建预制件资源的实例。
3.3 选择预制件资源
有时想在有大量预制件的项目中快速找到某个预制件资源,有3种做法:
A.在预制件模式下点击标题
B.右键gameObject,在菜单中点击Select PrefabAsset
C.在Inspector中点击Open
3.4 替换预制件资源(不常用了解即可)
若要替换预制件资源,可采用的方法是从 Hierarchy 窗口中拖动新的游戏对象并将其放到 Project 窗口中现有的预制件资源上方。
四.在预制件模式下编辑预制件
要编辑预制件资源,请在预制件模式下将其打开。预制件模式允许您单独查看和编辑预制件资源的内容(独立于场景中的所有其他对象)。在预制件模式下所做的更改会影响该预制件的所有实例。
4.1 进入预制件模式
可通过多种方法在预制件模式下开始编辑预制件,包括:
1.Hierarchy 中预制件旁边的箭头按钮(推荐)
2.Hierarchy 中选中预制件实例,Inspector中点击Open按钮
3.在 Project 窗口中双击预制件(推荐)
4.单击预制件资源的 Inspector 窗口中的“Open Prefab”按钮
4.2 退出预制件模式
进入预制件模式会使 Scene 视图和 Hierarchy 窗口仅显示该预制件的内容。在此处,预制件的根是常规游戏对象:没有蓝色的预制件实例图标。
Hierarchy 窗口在顶部显示一个预制件标题栏,其中显示当前打开的预制件。可以使用标题栏中的后退箭头向后导航一步
在预制件模式下,Scene 视图会在顶部显示一个示踪导航栏。最右边的条目是当前打开的预制件。使用示踪导航栏可导航回主要场景或可能已打开的其他预制件资源。
4.3 Auto Save
预制件模式在 Scene 视图的右上角有一个 Auto Save 设置。启用此设置后,对预制件所做的任何更改都会自动保存到预制件资源。默认情况下会启用 Auto Save。如果希望在进行更改时不自动将这些更改保存到预设资源,请关闭 Auto Save。在这种情况下,当退出当前预制件的预制件模式时,系统会询问是否要保存未保存的更改。
实践经验:推荐关闭Auto Save
好处1:如果对预制件进行了较多编辑,可节省时间,提升开发效率。
好处2:打开prefab后,只想进行一些尝试性的更改,比如隐藏一些gameObject,无需用版控软件对prefab还原。
4.4 撤消
在预制件模式下对预制件资源进行更改时,只能在仍处于预制件模式下时才能撤消这些更改。
五.实例覆盖
5.1 实例覆盖概述
实例覆盖允许在预制件实例之间创建变化。修改预制件资源时,更改将反映在其所有实例中。但是,也可以直接对单个实例进行修改。这样的做法叫做在特定实例上创建实例覆盖。
有四种不同的实例覆盖类型:
-
覆盖属性的值
-
添加组件
-
删除组件
-
添加子游戏对象
实例覆盖存在一些限制:
- 无法更改属于预制件的游戏对象的父级,
- 且无法删除属于预制件的游戏对象(可以停用游戏对象,算作属性覆盖)
5.2 实例覆盖在Editor中的一些表现
在 Inspector 窗口中,实例覆盖的名称标签以粗体显示,左边距使用蓝线显示。
添加和删除的组件在 Inspector 中的相应图标上也有加减符号标示,而添加的游戏对象在 Hierarchy 窗口中的相应图标上有一个加号标示
5.3 覆盖优先
预制件实例上覆盖的属性值始终优先于预制件资源的值。这意味着,如果更改预制件资源的属性,对覆盖该属性的实例没有任何影响。
如果对预制件资源进行更改,但未按预期更新所有实例,则应检查实例上是否覆盖了该属性。最好仅在确实必要时才使用实例覆盖,因为如果整个项目中有大量实例覆盖,则很难判断对预制件资源的更改是否对所有实例都有影响。
实践经验:如果只有一个实例,在实例覆盖后点击Apply All,将变化同步预制体资源。
5.4 实例覆盖不包括Transform和RectTransform中的部分属性
对于在实例中改变Transform的Position和Rotation,以及RectTransform中的Width、Height、Margins、Anchors 和 Pivot 属性,一种特殊情况,不是作为显式实例覆盖
这是因为要求预制件的多个实例采用相同的位置和旋转是极其罕见的情况。更常见的情况是希望预制件实例具有不同的位置和旋转,因此 Unity 不会将它们视为预制件覆盖。
5.5 Overrides 下拉菜单
Overrides 下拉窗口显示预制件实例上的所有覆盖。允许将实例的覆盖应用于预制件资源,或将实例上的覆盖恢复为预制件资源上的值。只有根预制件实例会显示 Overrides 下拉选单按钮,其他预制件内的预制件不会显示此按钮。Overide菜单以树形结构显示:根节点下/gameobject/组件/属性,预制件中的值和覆盖值的对比,如下图所示。
-
Apply 会修改预制件资源。此操作会将覆盖(当前仅在您的预制件实例上)置于资源之上。这意味着预制件资源现在具有该修改,而预制件实例不再具有该修改作为覆盖。
-
Revert会修改预制件实例。此操作实质上会丢弃您的覆盖并将其恢复为预制件资源的状态。
Revert All 和 Apply All 按钮,用于一次性还原或应用所有更改。
5.6 上下文菜单
除了 Overrides 下拉窗口,还可以使用 Inspector 中的上下文菜单来还原和应用各个覆盖。
六.嵌套预制件
可以在其他预制件内包含预制件实例。这称为嵌套预制件。
- 在预制件模式下,可将其他预制件(需排除自身和包含自身的预制件,unity不支持)托到Hierarchy中,即形成嵌套
也可将非预制件类型的子节点托到Project中将其转化为预制件,形成嵌套
七.预制件变体
如果存在预制体A,希望基于A存在预制体A1,A2,A3,则应使用预制件变体。
7.1 创建预制件变体
可在 Project 视图中的预制件上右键单击,然后选择 Create > Prefab Variant。这样将创建所选预制件的变体,该变体最初没有任何覆盖。
还可以将预制件实例从 Hierarchy 窗口中拖动到 Project 窗口中。执行此操作时会出现一个对话框,询问是要创建新的原始预制件还是预制件变体。如果选择预制件变体,则会根据拖动的预制件实例创建新的预制件变体。
预制件变体将显示带有箭头的蓝色预制件图标。
7.2 编辑预制件变体
编辑预制件变体的操作大部分和编制预制件一样,有以下几处不同
- 标题变为变体类型的icon
- 根节点为实心立方体
- 覆盖按钮标题多了to Base
八.解压预制件实例
要将预制件实例的内容恢复到常规游戏对象,请解压缩预制件实例。此操作正是创建(打包)预制件的相反操作,不同之处在于此操作不会破坏预制件资源,而是仅影响预制件实例。
可通过在 Hierarchy 窗口中右键单击预制件实例并选择 Unpack Prefab 来解压缩预制件实例。场景中生成的游戏对象不再与其以前的预制件资源有任何关联。预制件资源本身不受此操作的影响,
如果在解压缩之前在预制件实例上有任何覆盖,这些覆盖将被“烘焙”到生成的游戏对象上。也就是说,值将保持不变,但不再具有覆盖状态,因为没有需要覆盖的预制件。
如果解压缩内含嵌套预制件的预制件,则嵌套的预制件仍然是预制件实例,并且仍然关联到它们各自的预制件资源。同样,如果解压缩预制件变体,根部将会有一个新的预制件实例,即基础预制件的实例。
通常,解压缩预制件实例后生成的对象与您进入该预制件的预制件模式时看到的对象相同。这是因为预制件模式会显示预制件内部的内容,而解压缩预制件实例会解压缩预制件的内容。
如果希望将预制件实例替换为普通游戏对象并完全消除与所有预制件资源的所有关联性,则可以在 Hierarchy 窗口中右键单击该预制件实例,然后选择 Unpack Prefab Completely。此做法相当于解压缩预制件,并继续解压缩原先作为嵌套预制件或基础预制件出现的所有预制件实例。
官方手册参考:
预制件