设置与静态网格模型的碰撞

在 UE4 中,您可让静态网格模型做很多事情,比如在游戏过程中改变其贴图或材质,或者使用 Matinee 在整个场景中移动。有可能您不介意静态网格模型在场景中的行为方式如何,但是就是不希望玩家能够穿过网格模型或射穿网格模型。这时候,对静态网格模型进行碰撞设置就非常有用了。

设置

您可能已经有了一个自己创建的场景和静态网格模型。如果您已经有了上述条件,可以忽略此步骤。如果您还没有创建上述条件,则要启动 UE4 新建一个项目。对项目进行命名并选择项目的存储位置。在本示例中,我们将使用蓝图的第一人称模板。 您不一定要使用该模板,但是该模板中已有的射击抛射物功能将用于在下文中的某处进行演示,因此使用该模板可以帮助您跟着说明顺利操作下去。

另外还要确保启用了 Starter Content。如果未启用该选项,您将无法使用本“操作指南”的后续步骤中要用到的资源,那就很难跟着继续操作下去了。

NewProjectWithStarterContent.png

简单形状网格模型上的碰撞

打开项目后,如果您已启用了 Starter Content,则在 Content Browser 中,您将看到一个名为 Starter Content 的文件夹。在该文件夹中,您应该能看到另一个名为 Props 的文件夹。浏览至该文件夹,然后找到其中名为 SM_Door 的静态网格模型。

ContentBrowserWithStarterContent.png DoorInContentBrowser.png

找到 SM_Door 后,打开静态网格模型编辑器,打开方式为 double-clicking 该资源或 right-clicking 该资源并从出现的关联菜单中选择 Edit。编辑器打开后,您将可以看到类似以下画面:

DefaultDoor.png

默认状态下,该网格模型上没有设置任何碰撞。在没有设置碰撞的情况下,玩家走路时可能会穿过网格模型,如果网格模型模拟了物理属性,则一旦开始游戏,网格模型很容易就会出现穿出到游戏世界之外的错误。您可以先做个测试,在设置碰撞并开始游戏之前,将该网格模型放置到场景中。请注意,玩家可以穿过实体的网格模型。此外,如果您想要在对着门射击时,门会被弹开,或者飞到空中,然后掉在地上。则如果静态网格模型未设置碰撞,您需要将 Details 面板中的 Simulate Physics 设为 true

PhysicsDetailsPanel.png

在大多数情况下,这些效果并不令人满意,因此我们需要为该网格模型设置碰撞。在编辑器的顶部,有一个 Collision 下拉菜单。如果您单击它,您将看到用于在网格模型中添加碰撞的选项。

CollisionMenu.png

在本示例中,我们采用的网格模型形状相当简单。在对网格模型设置碰撞时,简单形状的网格模型设置起来也比较容易。Collision 菜单中最上面的三个选项将用简单形状围绕网格模型,这些形状将用作能否被网格模型阻挡或重叠的限制。以下是带有这些简单形状碰撞的网格模型的示例。

Sphere1.png Capsule1.png Box1.png
Sphere2.png Capsule2.png Box2.png
球体简单碰撞 胶囊简单碰撞 盒状简单碰撞

在设置碰撞后,如果您仍然看不到网格模型周围的轮廓,请确认工具栏中的碰撞按钮 (CollisionButton.png) 已高亮显示。另外还请注意,如果您已经在网格模型上设置了简单碰撞,然后在该网格模型上添加了另一个简单碰撞,则新的碰撞不会取代另一个碰撞,而是会添加在其上。如果您添加了上述所有三个简单碰撞,而没有删除任何碰撞,则可能会看到下图所示的效果。

AllCollision.png

要解决这个问题,您可选择其中一个碰撞,然后按 delete 键,或从 Collision 下拉菜单中选择 Delete Selected Collision 逐一删除碰撞,或者也可在 Collision 菜单中选择 Remove Collision 以删除网格模型上的所有碰撞。这时将出现一个弹出窗口,询问您是否确定想要删除所有碰撞网格模型。单击 Yes 将删除静态网格模型上的碰撞。

RemoveCollision.png RemoveCollisionPopUp.png

在网格模型上应用碰撞之后,请注意,碰撞带有转换小工具。在设置了碰撞之后,您可对碰撞网格模型进行转换、旋转和缩放,就像对 UE4 内的任何其他对象进行的操作一样。

较复杂网格模型上的碰撞

如果您的网格模型很容易就可以放入胶囊或盒子里,或您的网格模型不需要精确碰撞,则使用上一部分中设置的简单碰撞就足够了。但是,您的网格模型可能带有比较复杂的形状,而且需要精确碰撞。在本部分中,我们将介绍如何进行设置。

回到 Starter Content 内的 Props 文件夹,浏览至静态网格模型 SM_Chair。然后 Double-click 缩略图,在静态网格模型编辑器中打开它。就像您看到的那样,该网格模型上已经有了碰撞,其外观类似下图所示:

ChairDefaultCollision.png

我们假设在此示例中,我们想让玩家能够坐在椅子的座垫上。在碰撞网格模型的默认设置下,会有看不见的障碍物阻止玩家坐到座垫上。(请注意,当玩家在玩游戏时,他们只会看到静态网格模型本身,而不是碰撞网格模型,因此玩家会尝试坐到椅子上,却不知道为什么有东西阻止他们。)

选择编辑器顶部 Collision 下拉菜单中的 Remove Collision,删除网格模型上的碰撞。我们尝试使用本“操作指南”前一部分中使用的基础形状,但是如下所示,他们的外观都不是我们想要的。

ChairSphere.png ChairCapsule.png ChairBox.png
球体简单碰撞 胶囊简单碰撞 盒状简单碰撞

基础形状的效果都不是我们想要的。但是,我们可以通过 Collision 下拉菜单中的其他选项来做一些调整,使其符合我们的要求。这些选项称为 K-DOP 简单碰撞生成器。 K-DOP 是一种包围体,代表 K 离散型多面体(其中,K 代表轴对齐平面数量)。通常,它将 K 个轴对齐平面尽量推向网格模型。产生的形状被用作碰撞的外壳。在 Static Mesh Editor 中,K 可以是:

以下分别展示了 10-DOP、18-DOP 和 26-DOP 设置下的椅子网格模型。

10DOP.png 18DOP.png 26DOP.png
10DOP 18DOP 26DOP

这些碰撞网格模型已经越来越接近我们想要的效果,但是,座垫周围还有一些间隙,可能会阻碍玩家坐在椅子上。再次选择 Remove Collision,完成后,选择 Collision 下拉菜单中的 Auto Convex Collision。完成上述操作后,将出现 Convex Decomposition 面板,如下所示。

ConvexDecomposition.png

该窗口的顶部选项是 Accuracy,该选项在构建碰撞网格模型时,将尽量少生成基础形状。底部选项 Max Hull Verts 将增加或减少碰撞网格模型的顶点数。这些值越高,您的碰撞精度就会越高,但是碰撞网格模型也会越复杂。单击 Apply 将对网格模型应用这些设置。

AutoConvexCollision1.png AutoConvexCollision2.png
默认设置 最高精度与最多外壳顶点数

另一种设置复杂碰撞的简单方法是:使用多个简单形状碰撞网格模型来创建网格模型的碰撞。如果您还记得本“操作指南”前文中提到的内容,那您一定知道创建另一个简单碰撞网格模型不会取代原有的网格模型,只会添加到原有网格模型上。前文中还提到过:每个碰撞网格模型都有各自的转换小工具,您可借助它对各碰撞网格模型进行转换、旋转和缩放。我们可以使用这种方式来为静态网格模型创建碰撞。

选择 Collision 下拉菜单中的 Add Box Simplified CollisionLeft-click 碰撞网格模型,调出转换小组件。对碰撞网格模型进行转换、旋转和缩放,使其贴合椅子扶手一直到地面的轮廓。在碰撞网格模型仍被选中的情况下,复制碰撞网格模型,方法是选择 Collision 下拉菜单中的 Duplicate Selected Collision,或者按 Ctrl + W。移动该碰撞网格模型,使其贴合椅子的另一条扶手的轮廓。再次复制网格模型。选中这个新的网格模型,对其进行移动、缩放和旋转,使其贴合椅子的底部。复制该碰撞网格模型,将其向上移动,以贴合椅子的座位。再次复制网格模型,对其进行旋转,以贴合椅子的靠背。上述操作全部完成后,您将可以看到类似以下画面的效果:

CompositeBoxCollision.png

您也可以回过头来再对网格模型进行调整,使其更贴合椅子的形状。在本示例中,我们仅用了这 5 个盒体就为整个椅子设置了碰撞,而之后玩家就可以坐在座垫上了。

模拟物理属性与碰撞预设设置

在静态网格模型上设置了碰撞之后,现在就可以模拟物理属性了。单击静态网格模型编辑器工具栏最左侧的 Save 按钮,保存椅子网格模型,然后在 Content Browser 内找到 SM_Chair。将网格模型的副本拖动到场景中,并在选中该副本的情况下,看一下 Details 面板。在 Details 面板的 Physics 部分中,第一个选项为 Simulate Physics,该选项的默认设置为 false。如果您在 “Simulate Physics” 选项设为 false 的情况下进行场景的游戏,则人物将无法穿过网格模型,且射击抛射物也根本不会影响网格模型。

PhysicsDetailsPanel.png

停止在场景中游戏,然后将 Simulate Physics 设为 true。此时如果进行游戏,您将看到当人物走入椅子时,网格模型会移动。在场景中,对椅子射击时,椅子也会飞到空中。这不仅是因为网格模型在模拟物理属性,也因为网格模型的默认 Collision Preset 设为 “block all”。

返回到椅子的 Details 面板,在 Collision 部分中将出现一个名为 Collision Presets 的下拉菜单。网格模型的实例对游戏世界中其他对象做出反应的方式取决于它的 Collision Presets 设置。请看一下下图所示的选项。

CollisionPresets.png

默认设置为 “Block All”。如果您将其设为 “Overlap All”,则在游戏开始时,您将看到网格模型出现穿出到场景之外的错误。还有一个自定义预设设置,使用该设置可手动设置网格模型对场景中其他对象的反应方式。您可能想要它阻挡 Pawn,但是重叠抛射物,并忽略所有其他对象。在自定义预设设置中,您可设置网格模型执行上述行为。既然您已经对网格模型设置了碰撞,您现在就可以将其放置在场景中,并使用其碰撞来设置网格模型影响场景中其他对象的方式,以及受场景中其他对象影响的方式。