为静态网格体设置碰撞

如何设置碰撞

Choose your operating system:

Windows

macOS

Linux

在UE4中,你可让静态网格体做很多事情,比如在游戏进程中改变其纹理或材质,或者使用Matinee在整个关卡中移动。无论静态网格体在关卡中的行为方式为何,你可能都不希望玩家可以穿过网格体或射穿网格体。这种情况下就需要在静态网格体上设置碰撞。

设置

你自己可能已具有关卡和静态网格体,可配合本指南使用。这样的话,你可以跳过此步骤。如若不然,请启动UE4并创建新项目。然后命名项目并选择项目存储位置。在本示例中,我们将使用蓝图第一人称模板。虽然不一定要使用此模板,但是我们稍后会用到已在此模板中实现的射出发射物能力来说明一个要点,使用此模板将有助于你跟随所述步骤进行操作。

另外,请确保你启用了 含初学者内容包(With Starter Content) 。如果未启用,你将缺少稍后需要在本"指南"中用到的资产,进而导致你可能无法遵循本指南中的步骤进行操作。

NewProjectWithStarterContent.png

简单形状网格体上的碰撞

打开项目之后,如果已启用 含初学者内容包(With Starter Content) ,你应该可以在 内容浏览器 中找到名称为 Starter Content 的文件夹。在该文件夹中,应有一个名称为 Props 的文件夹。浏览至该文件夹并找到名称为 SM_Door 的静态网格体。

ContentBrowserWithStarterContent.png DoorInContentBrowser.png

找到 SM_Door 之后,通过 双击 该资产或 右键单击 该资产并从情境菜单中选择 编辑(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 双击 缩略图,在静态网格体编辑器中将其打开。正如你所见,此网格体上已具有碰撞,其外观类似于下图中所示:

ChairDefaultCollision.png

我们假设在此示例中,我们希望玩家能够直接坐到椅垫上。受到在默认情况下按原样设置的碰撞网格体的影响,存在阻碍玩家这样做的无形障碍。(请注意,在游戏过程中,玩家仅会看到静态网格体本身,他们看不到碰撞网格体,因此玩家将尝试坐到椅子上,但是不明白为何会存在阻碍他们这样做的东西。)

可以通过从编辑器顶部的 碰撞(Collision) 下拉菜单中选择 删除碰撞(Remove Collision) 来删除此网格体上的碰撞。我们可以尝试使用我们在本指南的前一部分中使用的基本形状碰撞网格体,但是如你在下列各图中所见,它们之中没有一个可以满足我们的需求。

ChairSphere.png

ChairCapsule.png

ChairBox.png

球体简单碰撞

胶囊体简单碰撞

盒体简单碰撞

似乎没有基本形状可以实现我们期望的效果。但是,借助 碰撞(Collision) 下拉菜单中的其他选项,我们距离实现预期效果更近一步。这些选项被称为 K-DOP 简单碰撞生成器。 K-DOP是一种包围体,K-DOP指的是 K离散定向多面体 (其中,K是轴对齐平面的数量)。从根本上说,它将K个轴对齐平面尽量推向网格体。产生的形状被用作碰撞外壳。在 静态网格体编辑器 中,K可以为:

  • 10 - 有4个边经过倒角处理的盒体 - 你可以选择与X、Y或Z轴对齐的边。

  • 18 - 所有边都经过倒角处理的盒体。

  • 26 - 所有边和角都经过倒角处理的盒体。

以下是分别具有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) ,它将生成数量尽可能少的Primitive来代表碰撞网格体。底部选项 最大外壳顶点数(Max Hull Verts) 将增加或减少碰撞网格体具有的顶点的数量。这些值越大,碰撞越精确,但是碰撞网格体也越复杂。单击 应用(Apply) 之后,这些设置将应用到网格体。

AutoConvexCollision1.png

AutoConvexCollision2.png

默认设置

最高精确性和最大外壳顶点数

设置复杂碰撞的另一个简单方法是使用多个简单形状碰撞网格体来为网格体创建碰撞。正如我们在本指南前面提到过的,创建另一个简单碰撞网格体并不会将原始的简单碰撞网格体替换掉,而是叠加在原始简单碰撞网格体上。我们还重申了每个碰撞网格体都有其专属的变形小部件,因此你可以单独对每个碰撞网格体进行平移、旋转和缩放。我们可以利用此机制来为静态网格体创建碰撞。

首先从 碰撞(Collision) 下拉菜单中选择 添加盒体简单碰撞(Add Box Simplified Collision) 左键单击 该碰撞网格体以调出其变形小部件。对该碰撞网格体进行平移、旋转和缩放,以使它沿着椅子扶手贴合椅子,直至地面。在仍然选中该碰撞网格体的情况下,通过从 碰撞(Collision) 下拉菜单中选择 复制所选碰撞(Duplicate Selected Collision) 或通过按下 Ctrl + W 组合键来复制该碰撞网格体。移动此碰撞网格体,以便它贴合椅子另一边的扶手。再次复制网格体。在选中新网格体的情况下,移动,缩放并旋转此网格体,以便它贴合椅子底部。复制该碰撞网格体并将它向上移动以让它贴合椅子的坐部。再次复制该网格体并旋转它,以让它贴合椅子的靠背。完成后,你应该看到类似下图的效果。

CompositeBoxCollision.png

你可以回过头来再对这些碰撞网格体进行调整,使其更贴合椅子的形状,但就本示例而言,我们仅仅使用这五个盒体就为整个椅子设置了碰撞,而且这样设置碰撞之后,玩家可以坐到椅垫上。

模拟物理和碰撞预设值

静态网格体具有碰撞之后,现在就可以模拟物理了。单击静态网格体编辑器工具栏最左侧的 保存(Save) 按钮保存椅子网格体,然后在 内容浏览器 中找到 SM_Chair 。将该网格体的一个副本拖到关卡中并选中它,然后转到 细节(Details) 面板。在 细节(Details) 面板的 物理(Physics) 部分中,第一个选项是 模拟物理(Simulate Physics) ,在默认情况下,它应为 false 。如果在"模拟物理(Simulate Physics)"设置为 false 的情况下运行关卡,角色将无法穿越网格体,而且射出发射物也完全不会影响网格体。

PhysicsDetailsPanel.png

停止运行关卡并将 模拟物理(Simulate Physics) 设置为 true 。现在运行关卡时,你会看到当角色碰到椅子时,椅子网格体会移动。对着椅子射击时,该网格体也可以被射中,而且会在关卡中飞到空中。这不仅是因为网格体在模拟物理,还因为网格体被设置为阻挡其所有的默认 碰撞预设值(Collision Preset)

返回到椅子的 细节(Details) 面板,在 碰撞(Collision) 部分中,具有名称为 碰撞预设值(Collision Preset) 的下拉菜单。该网格体的此实例对场景中的其他对象做出反应的方式取决于其 碰撞预设值(Collision Preset) 设置。该下拉菜单中包括的选项如下图中所示。

CollisionPresets.png

在默认情况下,它设置为"阻挡全部(Block All)"。如果将它切换为"重叠全部(Overlap All)",只要一开始运行关卡,你就会看到该网格体掉落到关卡之外。其中还包括自定义预设值,借助它你可以手动设置网格体对关卡中的其他对象做出反应的方式。你可以将它设置为阻挡Pawn,但是可以与发射物重叠,并且忽略除这些以外的其他所有对象。在自定义预设值中,你可以指示网格体要执行哪些行为。你已经在网格体上设置了碰撞,现在可以将网格体放到关卡中并使用它的碰撞来设置它影响关卡中其他对象的方式以及关卡中其他对象影响它的方式。

在关卡编辑器中选中 静态网格体Actor 或任意 静态网格体组件 (例如,蓝图编辑器中的静态网格体组件)时, "细节(Details)"面板 -> "碰撞(Collision)"类别 -> 碰撞预设值(Collision Preset) 将显示 默认(Default) 。这是为了表明,在初始设置之后,未对"碰撞预设值(Collision Preset)"进行过任何更改。如果此处列出了 BlockAll 等其他选项,则说明所选静态网格体Actor/组件的"碰撞预设值(Collision Preset)"已被覆盖。

defaultCollision.png

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消