Unity2018 2019 Prefab 说明(官方文档翻译)

Unity2018 2019 Prefab 说明(官方文档翻译)

名词解释:

预制体:Project窗口中是预制体,也是预制体资源

实例:将prefab从Project窗口中拖拽到Hierarchy中后就变成了实例(prefab的复制体)

覆写:做名词时表示在实例上做出的,但是还没应用到预制体上的修改。做动词时表示在实例上做出修改但是不应用到预制体上

应用:让Project窗口中的预制体资源变得跟Hierarchy窗口中的实例一样的操作

 

 

实例覆写(Instance Overrides)

实例覆写允许创建不同版本的实例,并且将这些实例链接到相同的预制体。

当更改预制体资源时,它的更改将映射到它所有的的实例中,但是你也可以直接对单个实例进行修改,当进行这个操作时将在该实例上创建一个实例覆写。

例如你有一个“Robot”预制体,你想将它放到了多个关卡中,每个实例具有不同的速度和不同的音效,这时可以使用实例覆写。

 

实例覆写有四种类型:

  • 覆写属性的值
  • 添加一个组件
  • 移除一个组件
  • 添加一个子物体

 

预制实例有一些限制:不能重新指定父级,不能移除预制体中的GameObject。但是可以禁用GameObject用来代替删除GameObject(这算作属性覆写)

在Inspector窗口中,加粗字体的标签左侧存在一条蓝线的地方表示存在实例覆写,当添加一个新的组件时,蓝线会覆盖整个组件,添加或移除组件时在Inspector窗口会有加减号在图标上。

Unity2018 2019 Prefab 说明(官方文档翻译)_第1张图片

Inspector窗口显示Dynamic Occluded 属性覆写和添加了一个Rigdbody组件

 

添加一个GameObject时在Hierarchy窗口会有加号标注在它的图标上。

Unity2018 2019 Prefab 说明(官方文档翻译)_第2张图片

Hierarchy窗口显示一个添加了“Fruit”Gameobject的预制体实例

 

  • 覆写优先级(Overrides take precedence)

属性的实例覆写的优先级高于在预制体上覆写的优先级,即改变预制体上的属性值,并不会影响在实例上被覆写的属性值。

如果你更改预制体上的属性值,但是它并没有应用到所有的实例上,你应该检查这个属性是不是在实例上被覆写了。如果你有大量的实例覆写,判断一个预制体的更改是否会应用到每一个实例上会非常困难,所以应该在非常严谨地需要实例覆写的特性的情况下再使用实例覆写。

 

  • 对齐对于实例覆写是个例外(Alignment is specific to Prefab instance)

实例的对齐是一种特殊情况,处理方法与其他属性不同。对齐值从不从预制体产传递到实例。这意味着它们总是可以与预制体的对齐方式不同,无需显式的实例覆盖。具体来说,对齐包括实例根节点上的Transform组件,对于一个RectTransform来说也包括Width, Height, Margins, Anchors 和 Pivot属性。

 

 

 

通过实例编辑预制体(Editing a Prefab via its instances)

预制体实例的根节点的Inspector窗口中比普通GameObject多三个按钮:Open、Select和Overrides(覆写)。

Unity2018 2019 Prefab 说明(官方文档翻译)_第3张图片

预制体实例根节点 Inspector 窗口中的三个按钮

 

Open按钮打开该实例的预制体的编辑模式,你可以在该模式下编辑预制体并且会应用到所有实例上。Select按钮选中预制体资源。Overrides按钮打开覆写下拉窗口。

 

  • 覆写下拉窗口(Overrides dropdown)

覆写下拉窗口会展示实例上所有的覆写,它也可以让你将实例上的覆写应用到预制体上,或者将实例上覆写的值还原为预制体的值。Overrides按钮只有在实例的根节点上会出现

覆写下拉窗口允许应用或还原单个预制体覆写,或一次性应用或还原所有预制体覆写。

  • 应用一个覆写会更新预制体,这会将你现有的实例上的值应用到预制体资源上,这意味着预制体资源现在有这个更新,而实例上则没有了覆写。
  • 还原一个覆写会更新实例,这实际上是丢弃了你的修改并将实例还原为预制体资源的状态。

 

覆写下拉窗口用更新、添加和移除组件、添加GameObject(包括其他预制体)的形式展示了一个修改列表。

Unity2018 2019 Prefab 说明(官方文档翻译)_第4张图片

预制体实例的覆写下拉窗口

 

要检查条目,单击它将显示一个浮动视图,该视图显示修改并允许还原或应用该修改。

Unity2018 2019 Prefab 说明(官方文档翻译)_第5张图片

一个显示选中添加组件的下拉窗口

 

对于更新了值的组件,这个视图显示了在预制体中的组件与在实例中的组件的值的对比,这让你能去比较原始的值与现在覆写的值,以便于你决定应用还是还原这个值。

Unity2018 2019 Prefab 说明(官方文档翻译)_第6张图片

具有对比视图的下拉窗口

覆写下拉窗口中也有“Revert All”和“Apply All”按钮可以一次性还原或者应用所有的修改。需要注意的是,如果你内嵌了一个预制体在另一个预制体中,“Apply All”按钮总是将修改应用到最外层的预制体,也就是有覆写下拉窗口(Overrides)按钮的根节点的预制体。

  • 右键菜单(Context menus)

你也可以使用Inspector窗口中的右键菜单来还原或者应用单独的覆写。

被覆写的属性表现为字体为粗体,他们可以通过右键菜单还原或者应用。

Unity2018 2019 Prefab 说明(官方文档翻译)_第7张图片

一个属性的右键菜单

 

更新的组件可以通过右击组件标题或者点击右上角的齿轮按钮来还原或者应用。

Unity2018 2019 Prefab 说明(官方文档翻译)_第8张图片

更新的组件的右键菜单

 

添加一个组件会在它的图标上有加号。

Unity2018 2019 Prefab 说明(官方文档翻译)_第9张图片

添加的组件的右键菜单

 

移除一个组件会在它的图标上有减号。

移除的组件的右键菜单

 

将一个GameObject(包括其他预制体)作为一个子物体添加到预制体中,在Hierarchy窗口中它的图标上会有一个加号,他们可以通过Hierarchy窗口中这个物体的右键菜单还原或者应用。

Unity2018 2019 Prefab 说明(官方文档翻译)_第10张图片

被添加的物体的右键菜单

 

 

内嵌预制体(Nested Prefabs)

你可以将一个预制体放到另一个预制体中,被包含的预制体叫做内嵌预制体。内嵌预制体仍保留它们和预制体资源的链接,同时也是构成另一个预制体的一部分。

 

  • 在预制体编辑模式下添加一个内嵌预制体(Adding a nested Prefab in Prefab Mode)

在预制体编辑模式,你可以像在场景中一样添加和处理预制体实例,你可以从Project窗口拖拽一个预制体到Hierarchy窗口或者场景视图去在已经被打开的预制体中创建一个预制体实例。

Note:被在预制体编辑模式下打开的预制体的根节点不会显示为蓝色方块图标,但是其他的预制体实例的根节点会显示为蓝色方块图标。你也可以像在场景中编辑预制体实例一样,在这些预制体实例中进行覆写。

Unity2018 2019 Prefab 说明(官方文档翻译)_第11张图片

左边:在“Robot”的编辑器模式下将“Oil Can”预制体内嵌。右边:包含“OilCan”的“Robot”实例在场景视图中

 

  • 通过实例内嵌预制体(Nesting Prefabs via their instances)

你也可以像添加子物体一样在场景视图直接将一个预制体作为子物体内嵌到另一个预制体实例中,这样被添加的预制体会在图标上有一个加号,表示对于外层的预制体实例来说这是一个覆写。

被添加的预制体可以像其他GameObject一样被还原或者应用(具体见“通过实例编辑预制体”)。只有在最外层预制体有覆写下拉窗口。一旦被应用,预制体图标上不会再再显示加号,因为它已经被内嵌到了预制体实例中,但是它的图标还会是一个蓝色方块,因为它本身是一个预制体实例,并且它仍保留了与预制体资源的链接。

Unity2018 2019 Prefab 说明(官方文档翻译)_第12张图片

左边:“Robot”的实例上添加了一个“Oil Can”预制体作为一个覆写。右边:“Oil Can”预制体被应用到了“Robot”预制体上,现在是“Robot”预制体资源的一个内嵌预制体

 

预制体变体(Prefab Variants)

当你想要一组各种版本的预制体时,预制体变体非常有用。

例如:你想要几个不同类型的机器人,但他们有相同的基础的机器人预制体,你可能想要一些机器人携带一些物品,一些用不同的速度移动,或者一些有不同的音效。

为了实现这个目的,你可以去在所有机器人都会分享的基础的机器人预制体上设置好基础的动作,然后创建几个预制体变体去:

  • 用一个脚本上更改速度的属性覆写让一个机器人移动速度更快。
  • 通过在机器人的手上添加GameObject去让机器人携带物品。
  • 通过添加一个AudioSource组件播放生锈的声音实现给机器人一个生锈的关节。

 

每一个预制体变体都会继承自一个被称作做base的预制体。预制体变体中的覆写的优先级高于base预制体。一个预制体变体可以将任何prefab作为它的base,包括模型预制体和其他的预制体变体。

 

  • 创建预制体变体(Creating a Prefab Variant)

有不止一种方法在一个预制体的基础上创建一个预制体变体。

你可以在Project视图的预制体上右击并且选择Create>Prefab Variant,这样就能创建一个被选中的预制体的初始状态没有任何覆写的变体,你可以打开预制体编辑模式开始给它添加一些覆写。

你也可以从Hierarchy窗口拖拽一个预制体实例到Project窗口,当你这么做的时候,一个对话框会问你是否像创建一个新的Original预制体还是一个预制体变体,如果你选择了预制体变体,那你就得到了一个基于你拖拽的预制体实例的预制体变体,你在预制体实例上做的所有覆写都在新的预制体变体里面了,你可以打开预制体编辑模式去添加或着编辑或者移除覆写。

 

预制体变体的图标是蓝色方块上面有两个箭头。

Unity2018 2019 Prefab 说明(官方文档翻译)_第13张图片

Hierarchy中的基础预制体"Robot"和预制体变体“Robot With Oil Can”

 

  • 编辑预制体变体(Editing a Prefab Variant)

当一个预制体变体在预制体编辑模式下打开时,它的根节点的图标和预制实例的蓝色方块图标一样。这个预制体实例表示的是它继承的base预制体,并不表示预制体变体本身。你对预制体变体做的任何编辑都将变成存在在变体中的base预制体的覆写

Unity2018 2019 Prefab 说明(官方文档翻译)_第14张图片

编辑器模式写的预制体变体“Robot With Oil Can”,"Oil Can"预制体被添加到base预制体上成为一个覆写

 

在上面的截图中,如果你选中Robot With Oil Can的根节点,并且点击Inspector窗口中的Select按钮,将会选中base预制体“Robot”而不是预制体变体“Robot With Oil Can”,因为这个实例是一个base预制体“Robot”的实例,而Select按钮总是选中实例来自的那一个预制体资源。

 

就像所有的预制体实例,你可以在预制体变体中使用覆写,例如更新属性值,添加移除组件和添加子物体,并且它们也有相同的限制:不能重新指定预制体变体中来自于base预制体的GameObject的父物体,也不能移除预制体变体中存在于base预制体中的GameObject。

 

Note当在预制体编辑模式下编辑一个预制体变体的时候,你应该理解应用这些覆写(通过覆写下拉窗口或者右键菜单)会导致你的预制体变体的版本被应用到base预制体资源,这通常来说都不是你想要的,预制体变体的目的是提供一种方便的方法来储存有意义的可复用的覆写集合,这也是为什么他们通常应该保留为覆写,而不应该应用到base预制体资源上。例如:如果你见被添加的“Oil Can”应用到base预制体资源(“Basic Robot”),那么这个预制体资源也会有“Oil Can”,“Robot With Oil Can”变体的意义就在于只有这个变体携带“Oil Can”,所以添加“Oil Can”GameObject应该作为一个覆写储存在预制体变体中。

 

当打开覆写下拉菜单时,总是可以在它的标题中看到覆写的对象时什么,已经在什么地方存在覆写。对于一个预制体变体,标题总是会写覆写对象为base预制体并且存在与预制体变体中。为了使它更清楚,Apply All 按钮也会变成 Apply All to Base按钮。

 

Unity2018 2019 Prefab 说明(官方文档翻译)_第15张图片

预制体变体在预制体编辑模式下的覆写下拉窗口

 

 

 

多个级别上的覆写(Overrides at multiple levels)

当你在其他预制体中使用预制体,或者使用预制体变体时,可以存在几个不同级别的覆写,一个相同的覆写可以应用到几个不同的预制体上。

 

  • 应用目标的选择(Choice of apply target)

当你的预制体实例里存在内嵌预制体,或者你的预制体是一个预制体变体时,你可能可以选择覆写应该应用到哪一个预制体上。

 

例如一个预制体“Vase”被内嵌到了预制体“Table”中,并且scene中存在一个“Table”预制体的实例。

Unity2018 2019 Prefab 说明(官方文档翻译)_第16张图片

“Vase”预制体被内嵌在了“Table”预制体中

 

如果在这个实例上,一个“Vase”上的属性被覆写了,这个覆写可以应用到两个预制体上:“Vase”或者“Table”

在覆写下拉窗口中的“Apply All”按钮只允许将覆写应用到外层的预制体中——在这个例子中是“Table”,但是当你通过右键菜单或者通过覆写下拉窗口中单个组件的比较视图应用覆写时是可以选择覆写目标的。

Unity2018 2019 Prefab 说明(官方文档翻译)_第17张图片

在这个例子中,如果你选择“Apply to Prefab 'Vase'”,那么值就会被应用到“Vase”预制体资源上并且被“Vase”预制体的实例使用。

但是如果你选择“Apply as Override in Prefab 'Table'”,那么这个值就 会变成在“Table”预制体中的“Vase”的实例的一个覆写,这个属性将不会在场景中的实例上被标记为一个覆写,但是如果你在预制体编辑模式下打开一个“Table”预制体,这个属性在“Vase”的实例上会被标记为一个覆写。

 

当覆写被覆写到“Table”预制体上时,“Vase”预制体资源本身不会被影响,这意味着现在所有“Table”预制体的实例上的“Vase”实例都有了新的值,但是其他不是“Table”预制体的一部分的“Vase”并不会被影响

如果“Vase”预制体上的这个属性之后被更改了,它会影响到除了这个属性被覆写过的实例以外的所有的实例。因为在“Table”预制体中的“Vase”实例被覆写了,所以这个修改不会影响到它。

 

  • 应用到内层预制体也可能影响到外层预制体(Applying to inner Prefabs may affect outer Prefabs too)

将一个或多个属性应用到内层预制体资源有时也会更新外层的预制体资源,

在我们的例子中,如果“Table”预制体中的这个值有一个覆写并且选择了“Apply to Prefab ‘Vase’”,则会同时还原“Table”预制体中的这个覆写,以便实例上的属性保留刚才应用的值。如果不是这样,则实例上的值将在应用后立即更改。

 

拆包预制体实例(Unpacking Prefab instances)

想要将一个预制体实例转换为常规的GameObject,你可以拆包这个预制体实例。除了不删除预制体资源而只在预制体实例上作用以外,这个是一个与创建预制体完全相反的操作。

 

你可以通过在Hierarchy视图右击一个预制体实例并选择“Unpack Prefab”来拆包,在场景中拆包完成的GameObject与它之前的预制体不再有链接,预制体资源并不会被这个操作影响,它的其他预制体实例也可以在工程中继续存在。

 

如果预制体实例在你拆包之前存在覆写,这些覆写会被“baked”到它拆包成的GameObject中。

 

如果你拆包了一个内嵌预制体,那么这个内嵌预制体仍然是一个预制体实例,并且仍然有到各自预制体资源的链接。相似的,如果你拆包了一个预制体变体,它的根节点将变成一个新的预制体实例即“base”预制体。

 

一般来说,拆包一个预制体实例会得到一个与预制体编辑模式下能看到的一样的物体,这是因为预制体编辑模式显示了预制体内部的内容,而拆包预制体实例则是拆包预制体的内容。

 

如果你想将一个预制体替换为普通的GameObject,并且完全删除所有与预制体资源的链接,你可以在“Hierarchy”中右键单击它并选择“Unpack Prefab Completely”。这相当于拆包预制体以及其中所有的内嵌预制体和“base”预制体实例。

 

你可以拆包在Scenes中的预制体或者在其他预制体中的预制体。

 

你可能感兴趣的:(Unity,unity,2018prefab,2019prefab)