1、预制件概述

        预制件是可重用资源,可以利用现有预制件创建新的预制件。对预制件的修改会同步到所有副本,不必重复编辑。如果不希望同步修改,可以重写预制件实例。主要用于重复出现的同一游戏对象、在运行时实例化的游戏对象。

        Unity 的预制件系统允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。预制件资源充当模板,在此模板的基础之上可以在场景中创建新的预制件实例。 

        如果要在场景中的多个位置或项目中的多个场景之间重用以特定方式配置的游戏对象,比如NPC、道具或景物,则应将此游戏对象转换为预制件。这种方式比简单复制和粘贴游戏对象更好,因为预制件系统可以自动保持所有副本同步。对预制件资源所做的任何编辑都会自动反映在该预制件的实例中,因此可以轻松地对整个项目进行广泛的更改,而无需对资源的每个副本重复进行相同的编辑

        可将预制件嵌套在另一个预制件中,从而创建在多个级别易于编辑的复杂对象层级视图。如果希望预制件的某些实例与其他实例不同,则可以重写各个预制件实例。还可以创建预制件的变体,从而将一系列重写组合在一起成为有意义的预制件变化。

        如果游戏对象在一开始不存在于场景中,而希望在运行时实例化游戏对象(例如,使能量块、特效、飞弹或 NPC 在游戏过程中的正确时间点出现),那么也应该使用预制件。预制件某些实例:① 环境资源(同一场景多次使用某一种树);② NPC(同一场景多次使用某中NPC,但具体的属性可能不同);③ 子弹(每次射击时实例化子弹);④ 角色(玩家预制件被放置在每个关卡的起点)。

2、创建预制件

        创建预制件资源:将一个或多个游戏对象从Hierarchy窗口拖到Project窗口,Unity将会为每一个非预制件的游戏对象直接创建原始的预制件资源,若已经存在预制件变体,将会询问是否从该游戏对象创建新的预制件资源。预制件资源在Project中以立体图标或蓝色立方体显示。

        创建预制件的过程会将原始的游戏对象转化为预制件实例,在Hierarchy中以蓝色文本、蓝色立方体图标显示。 

        创建预制件实例:将预制件资源从Project拖到Hierarchy或Scene中,创建预制件实例。

        在运行时创建预制件实例:Unity - Manual: Instantiating Prefabs at run time

        替换现有预制件:从Hierarchy中把新的游戏对象拖到Project中现有的预制件资源上。替换时,Unity会通过名称匹配来保留原预制件的引用、组件。(因为是名称匹配,要保证原预制件中的各个部分名称不同。)(若一个游戏对象附加了多个相同类型的组件时,保留原预制件的引用时,可能会发生无法识别某个游戏对象的问题。)

3、在预制件模式下编辑预制件

        在预制件模式下打开预制件以编辑,此时所作的修改影响该预制件的所有实例

        预制件模式:单独编辑(只显示预制件相关的游戏对象)、上下文中(可见其他内容但无法编辑)。

        单独编辑:在Project中双击预制件,或在Project中选择该预制件并在Inspector中点击“Open Prefab”,或者Alt键并在Inspector中点击“Open”/在Hierarchy中点击名称旁的箭头。在 Scene和 Hierarchy 中仅显示该预制件的内容,是普通的游戏对象,没有蓝色立方标记。单独编辑模式下,Scene会出现一个预制件跟踪栏,Inspector中会出现预制件标题

        上下文中:在Hierarchy中选择并在Inspector中点击“Open”,或在在Hierarchy中选择并按“P”键,或在Hierarchy中点击预制件名称旁的箭头。在上下文模式下,Scene会出现一个预制件跟踪栏、一个Context状态栏。在Context状态栏中,可以选择normal(上下文正常显示)、grey(上下文灰度显示)、hidden(完全隐藏)。不能选择属于context的游戏对象,但可以使用贴靠功能(非hidden模式)。Show Overrides开关打开可以预览预制件实例重写的属性,关闭该开关后可以修改这些属性。Auto Save开关打开时会对预制件的所有变更自动保存,默认打开。

        撤销变更:只能在预制件模式下撤销对预制件的变更,退出预制件模式后历史记录将被消除。

        预制件编辑环境:可以为预制件模式分配一个单独的编辑环境,可以在选择的背景里编辑预制件,而不是一个空的环境。在Edit -> Project Setting -> Editor中选择预制件编辑环境。对于UI组件(根部件是矩形变换组件),需要选择UI环境;常规组件选择常规环境。

4、实例重写override

        实例重写允许关联同一预制件的不同实例间存在不同属性。直接对单个实例进行的修改就是实例重写,分为重写属性值、添加组件、删除组件、添加子游戏对象。实例重写的属性或组件在Inspector中的名称是以粗体显示,左边框为蓝色线段,并且添加/删除的组件的图标上有+/-号显示,在Hierarchy中的图标上也有+/-号

        无法修改预制件实例的父游戏对象,也不能删除属于预制件的游戏对象,但可以停用游戏对象,类似于删除。

        重写优先重写属性的值优先于预制件资源的值,即修改预制件资源时,重写属性的值没有影响。因此,只有在必要时才进行实例重写。

        对齐值:表现类似于实例重写,但只是预制件资源的不同值。例如根变换的PositonRotation属性、矩形变换的 WidthHeightMarginsAnchors 和 Pivot 属性,这些值与预制件资源的值不同,但不是实例重写。(因为这些属性通常在不同游戏对象间表现出差异,从而反映游戏的多样性,例如NPC的位置、外表等等。)

5、通过预制件实例编辑预制件

        预制件实例的根,有额外的三个按钮:Open、Select、Overrides。

        Open:在预制件模式下打开该实例的预制件资源。

        Select:在Project中选择该实例的预制件资源。

        Overrides:下拉窗显示该实例上的所有重写(只有根预制件实例有override按钮),可以将重写应用于预制件资源,也可以将重写回退为预制件资源的值。应用重写于预制件资源后,该属性就不再是重写。回退重写会将预制件实例回退为预制件资源的状态。

        点击Overrides下拉窗中的被重写的属性,将显示组件的详细信息,且可以应用Apply或回退Revert修改。

        对于修改了值的组件,Overrides视图上会显示预制件资源上组件与预制件实例上已修改组件并排比较。

        上下文菜单:在Inspector中右击重写属性,将出现上下文菜单,可以应用或回退重写;或者,点击重写组件的下拉框,选择Added/Modified Component进行应用或回退重写;或者,在Hierarchy中右击,选择Added GameObject,进行应用或回退重写。

6、嵌套预制件

        嵌套预制件:在其他预制件内包含预制件实例。嵌套预制件、被嵌套的预制件,既保留了与原预制件资源的连接,也具有与新预制件资源的连接。

        在预制件模式下嵌套预制件:在预制件模式下,将预制件资源从Project中拖动到Hierarchy或Scene中。

        通过预制件的实例创建嵌套预制件:像添加普通的游戏对象一样,将将预制件实例作为子项添加到场景中的另一个预制件实例,无需进入预制件模式。这样添加的预制件会在Hierarchy中显示一个+号,表示该子对象为重写。添加的预制件可以通过与普通重写相同的方式进行应用/回退。但是,不能使用Overrides按钮(因为已经嵌套在其他预制件实例中)。

7、预制件变体

        通过创建预制件变体,可以定义一系列有预定义变换的预制件,例如不同的属性、不同的组件等。预制件变体的属性继承自基础预制件(可以是任意预制件),对预制件变体的重写优先于基础预制件。

        创建预制件变体:法①:在Project中右击预制件资源,选择Create -> Prefab Variant,此法创建的预制件变体没有任何重写,可以在预制件模式下进行重写;法② 将预制件的实例从Hierarchy拖到Project中,选择创建预制件变体,此时该实例上的重写将会用于预制件变体。预制件变体在Hierarchy中是具有蓝色箭头的蓝色立方。

        编辑预制件变体:在预制件模式下打开预制件变体时,预制件变体会显示为基础预制件,而不是变体本身。对预制件变体的任何修改,都将成为存在于预制件变体上的对基础预制件的重写。修改预制件变体的限制与修改预制件实例一样,不能修改父游戏对象、不能删除游戏对象但可以停用。在预制件变体中的Overrides将会应用于基础预制件,一般不建议使用,应用按钮也会提示为Apply All To Base。

8、重写多个层级

        如果一个预制件实例内部嵌套了预制件或预制件变体时,对于嵌套预制件的重写,可以选择应用于该嵌套预制件或是被嵌套的预制件。例如,一个Weapon预制件下嵌套有Ammo预制件,Ammo预制件的重写可以应用于Ammo或Weapon。

        Overrides下拉窗口中的 Apply All 按钮仅允许将重写应用于外层预制件,例如Weapon;通过上下文菜单或通过 Overrides 下拉窗口中各个组件的比较视图应用重写时,可以选择应用目标,例如Weapon(apply as overrides in Prefab 'Weapon')或Ammo(apply to Prefab 'Ammo')。重写为父预制件时,原预制件本身不受影响。重写为原预制件时,被嵌套的父预制件也不受影响。

        *如果父预制件、原预制件有相同的重写,原预制件中该重写回退时,父预制件将同时回退

9、解包预制件实例

        解压预制件实例,即将该预制件实例还原为游戏对象。在Hierarchy中右键选择Unpack Prefab,该预制件实例将成为普通的游戏对象,不再与原预制件资源有联系。

        解压时,重写将被应用,相当于普通的属性值修改。

        解压后,嵌套的预制件仍然是预制件。解压预制件变体时,根部将会有一个新的预制件实例,即基础预制件的实例。

        完全解包:将预制件实例替换为普通游戏对象并完全消除与所有预制件资源的所有关联性。在Hierarchy中右键选择Unpack Prefab Completely,将同时解压嵌套预制件或基础预制件。

1111111