UDN
Search public documentation:

UsingPrefabsCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 关卡动态载入 >使用预制
UE3主页 > 关卡设计师 > 使用预制

使用预制


概述


预制是一组Actors和相关脚本的集合,可以将它保存到包中并且可以将其实例化到关卡中。

一般情况下,当您构建关卡时您想创建一组Actors和相关脚本,然后在同一个关卡或其它关卡中重新使用这个组Actors。一个示例就是燃烧的火炬,它由一个静态网格物体、一个光源、一个粒子系统和一些可以将火炬吹灭的Kismet构成。预制允许您一次性创建这种集合,然后把它在包中保存为 Prefab(预制) 。以后您可以在内容浏览器中选择该预制,并可以多次地把它添加到关卡中。

可以在关卡中对预制进行修改,并且稍后这些修改将传递给该预制的所有现有实例。由于这是用了虚幻引擎的属性系统,所以当预制改变时仅更新那些仍然是原始预制默认值的属性。比如,假设您有一个包含一个黄色光源的预制,然后您把其中一个预制实例的光源颜色该为蓝色。然后您把预制本身改为绿色光。那么您会发现仅那些光源仍然为黄色的实例的光源颜色变为绿色。这是非常有用的,因为它允许您修改甚至删除Prefab(预制)实例的某些部分来满足特定需要,但是仍然接受来自于Prefab(预制)的更新。

推荐的工作流程


尽管从技术上讲本文列出的功能是精确的,但是Epic的关卡设计师及美工人员使用以下内部工作流程来避免在使用预制时可能出现的任何问题:

  • 仅用预制作为关卡布置工具
  • 这意味着一旦将预制放置到关卡中,应该立即将它转换为直观简单的actors,可以通过右击该预制并选择 Convert PrefabInstance To Normal Actors(转换预制实例为正常Actors) 来完成。
  • 避免某些高级功能,包括将actor属性变化传递给已经放置到关卡中的预制实例,及在预制资源中存储Kismet逻辑。

尽管这些功能从技术角度来说是可行的,但是这种应用可能会导致各种问题。因此,Epic的内部员工现在仅按照上述方式使用预制,且强烈推荐您使用这个工作流程。

创建预制


要想创建预制,首先要在关卡中收集您想放置到预制中的Actors。

Prefab_00_ArrangingActors.jpg

然后选中它们,右击并从关联菜单中选择 Create Prefab(创建预制)

Prefab_01_CreatePrefab.jpg

将会提示您为新的预制输入包名、可选的组名以及新的与新的预制名称。

Prefab_02_PackageGroupingNameDialogBox.jpg

然后它将询问您是否想使用新预制的实例来替换选中的Actors。新的预制的原点是您选中的最大的Actor的原点。

Prefab_03_ReplaceActorsWithNewPrefab.jpg

现在您应该可以在内容浏览器中看到那个新的预制了。预制显示了一个缩略图,展示当您创建它时预制在关卡中显示效果。这个缩略图是在创建预制时从您的透视编辑器视口中相机的位置拍摄的,所以在您创建预制之前使您的物体具有较的视角是值得的。

Prefab_04_PrefabInContentBrowser.jpg

放置预制实例


要想放置预制实例,只需简单地在内容浏览器中选择它,然后右击关卡并选择 Add Prefab: (添加预制:<预制名称>) 。这样它便可以出现在关卡中了。您会注意到所有的预制实例都有一个PrefabInstance Actor和它们相关联。这看上去像一个红色的 P 图标,同时这也代表着那个预制的原点。

Prefab_05_Prefab.jpg

这用于告诉人们这个实例所使用的预制,以及哪些Actors是它的组成部分。

当创建一个预制时,在预制中的Actors间的引用将会被正确地保存。所以,如果您把预制中的一个Actor附加到另一个Actor上,当您每次放置预制时,可以正确地处理那个关系。但是,到对于到那个预制 之外 的Actor的引用将会被清除。

编辑预制


默认情况下,当您点击预制实例中的任何Actor时,它将会选择整个实例。这使得预制在操作时变得更加简单,因为您可以把它们作为一个单元来移动。

Prefab_06_PrefabTranslation.jpg

然而,您有时候却想编辑预制中的特定Actor。要想完成这个处理,您将首先需要从选项中解锁预制。这可以通过打开View(视图)菜单并取消选中 "Lock Prefabs from Selection(从选项中锁定预制)"项来完成。这时,您就可以选择属于那个预置的单独的actors了。

Prefab_07_LockPrefabsFromSelection.jpg

更新预制


如果您想更新存储在包中的预制,那么右击一个已经修改的预制实例并从关联菜单中选择 Update Prefab From This Instance(从这个实例更新预制<预制名称>) 来完成。这个操作将会把选中的预制实例的属性复制到它的预制中。然后预制将会把任何改变传递到关卡中当前存在的那个预制的所有实例。如果您已经从那个实例中删除了一个Actor,那么那个Actor将会被从预制本身删除并且会从那个预制的所有实例中删除。如果您想添加一个新的Actor到预制中,请选择预制实例和任何您想添加的Actors,并且执行更新步骤。那么这些Actors将会被添加到预制及其所有的实例中。当您更新预制时,预制的预览图片也会重新进行捕获。

正如上面所提到的,如果您改变预制实例的属性,当基类预制更新时,那个值将不会改变。同样,当您从一个预制实例中删除一个Actor时,当您更新预制时那个Actor将不能重新出现。但是BSP画刷和体积不按照这种方式进行工作,当预制更新时,它们将总是从预制中进行复制。

当您打开一个包含预制实例的地图并且自地图上次保存后预制已经发生改变时,它将会自动地更新地图中那个预制的任何实例并显示以下对话框:

Prefab_08_PrefabsContextMenu.jpg

重置预制


如果您已经对您不喜欢的预制进行了修改,那么您总是可以回退到存储在包中的预制。首先,确保您已经选中了Locked Prefabs from Selection(从选项中锁定预制)菜单项,然后右击并选择 Reset Instance From Prefab (根据预制<预制名称>重置预制实例)。

添加Kismet序列到预制中


预制可以包含Kismet脚本和一组Actors。当您创建或更新预制时,它搜索关卡序列来查看这些序列是否引用了预制中的任何Actors。如果找到一些引用,它将会查找包含它们的最高层次的序列,然后询问您那是否是这个预制所使用的正确序列。

Prefab_09_PrefabKismet.jpg

如果您回答 ,那么它将执行一次额外的检查,来查看这个序列中是否有到不在这个预制中的Actors的引用。如果是这种情况,那么它将显示一个警告并不把那个序列包含在预制中。

当您把一个包含Kismet序列的预制放置到关卡中时,它将把Kismet序列实例化为一个高层次的称为 Prefabs(预制) 的子序列。关卡中的每个预制实例都具有它自己的相关Kismet序列。当更新预制时,每个实例的Kismet序列将被预制中的那个序列完全地替换,所以不能基于每个实例来自定义Kismet序列。然而,可以基于每个实例来添加输入端、输出端以及变量连接器来自定义预制的Kismet序列。通过这种方式,您可以把功能暴露给设计人员。这个应用的一个实例是门预制,它的序列暴露出输入端来锁上和打开门;并且暴露一个输出端,当每次门被打开时,它将被触发。

将预制转换为正常的Actors


选中预制,然后右击从关联菜单中选择 'Convert PrefabInstance To Normal Actors(转换预制为正常的Actors)'项。这将会删除预制实例,并预制中的所有Actors转换为正常的Actors。

Prefab_08_PrefabsContextMenu.jpg

预制技巧


  • 如果您选择一个属于预制实例一部分的Actor,您可以按下 Shift-P 来选择那个实例中的所有Actors。您也可以通过从关联菜单中选择 Select All Actors In Prefab(s)[选择预制中的所有Actors] 来完成这个目的。
  • 如果您选择一个PrefabInstance(预制实例),您可以选择 Open Sequence For PrefabInstance In Kismet(在Kismet中打开PrefabInstance的序列) ,来打开Kismet并直接跳转到那个实例的子序列。