官方文档

定义

在希望预制件有一组预定义的变化时,会使用到预制件变体,例如:在游戏中有几种不同类型的Target,这些全都基于同一个基本Target预制件,如果需要一些Target在有相同的基本定义的前提下会有一些不同的定义,此时就可以创建预制件变体来实现不同的定义。

预制件变体继承另一个称为基础预制件的预制件的属性。对预制件变体进行的覆盖优先于基础预制件的值。预制件变体可以使用任何其他预制件作为其基础预制件(包括模型预制件或其他预制件变体)。

alt

创建预制件变体

  • 可在 Project 视图中的预制件上右键单击,然后选择 Create > Prefab Variant。这样将创建所选预制件的变体,该变体最初没有任何覆盖。可以在预制件模式下打开预制件变体,然后开始为其添加覆盖。

  • 还可以将预制件实例从 Hierarchy 窗口中拖动到 Project 窗口中。执行此操作时会出现一个对话框,询问是要创建新的原始预制件还是预制件变体。如果选择预制件变体,则会根据拖动的预制件实例创建新的预制件变体。先前位于该实例上的所有覆盖现在都位于新的预制件变体中。可以在预制件模式下打开该变体以添加更多覆盖或者是编辑或删除覆盖。

预制件变体将显示带有箭头的蓝色预制件图标。

Hierarchy 窗口中显示的一个基本 GermSlimeTarget 预制件,以及该预制件一个名为“GermSlimeTarget With GermOBlaster”的变体:

alt

编辑预制件变体

在预制件模式下打开预制件变体时,根将显示为带有蓝色预制件图标的预制件实例。此预制件实例表示产生预制件变体的基础预制件,而不表示预制件变体本身。

如果不点击 Overrides == > Apply All to Base 则对预制件变体的修改不会影响预制件变体的基础预制件,但基础预制件的修改会影响预制件变体,类似于类的继承 如果点击则会对基础预制件进行覆盖。

alt

在上面的截屏中,即使选择 GermSlimeTarget With GermOBlaster 根游戏对象并单击 Inspector 中的 Select 按钮,也将选择基础预制件 GermSlimeTarget 而不是变体 GermSlimeTarget With GermOBlaster,因为预制件变体实例是基础预制件 GermSlimeTarget 的一个实例,而 Select 按钮始终选择实例来自的预制件资源。

与任何预制件实例一样,可以在预制件变体中使用预制件覆盖,例如修改的属性值、添加的组件、删除的组件以及添加的子游戏对象。也存在相同的限制:无法更改预制件变体中来自基础预制件的游戏对象的父级。也无法从预制件变体中删除存在于基础预制件中的游戏对象。但是,可以停用游戏对象(作为属性覆盖)来达到与删除游戏对象相同的效果。

注意:在预制件模式下编辑预制件变体时,应该了解应用这些覆盖(通过 Overrides 下拉窗口或上下文菜单)会使变体的变化应用于基础预制件资源。预制件变体的要点是提供一种方便的方法来存储有意义且可重复使用的覆盖集合,这就是为什么这些覆盖通常应该保留为覆盖而不要应用于基本预制件的原因。为了说明这一点,如果将额外的 GermOBlaster 游戏对象应用于基础预制件资源(“GermSlimeTarget”),那么预制件资源也将具有该 GermOBlaster。GermSlimeTarget With GermOBlaster 变体的关键在于,只有此变体携带 GermOBlaster,所以添加的 GermOBlaster 游戏对象应该留在预制件变体内作为覆盖。

打开 Overrides 下拉窗口时,始终可以在其标题中看到覆盖所针对的对象,以及覆盖存在于哪个背景中。对于预制件变体,标题将显示覆盖是针对基础预制件并存在于预制件变体中。为了使这一点更加清晰, Apply All 按钮也会显示 Apply All to Base。

覆盖<==>修改