文章

UE5 Blueprints

入门

下载起始项目并解压缩。要打开项目,请转到项目文件夹并打开BananaCollector.uproject

注意:如果收到一条消息说该项目是使用早期版本的 Unreal 编辑器创建的,那没关系(引擎经常更新)。可以选择打开副本的选项,也可以选择就地转换的选项。

你会看到下面的场景。玩家将在这里四处走动并收集物品。

img

我已将项目文件分类到文件夹中以便于导航,如下所示:

img

如果愿意,可以使用上面以红色突出显示的按钮来显示或隐藏源面板。

Creating the Player

在内容浏览器中,导航到 Blueprints 文件夹。单击 Add New 按钮并选择 Blueprint Class

由于希望演员能够接收来自玩家的输入,因此Pawn类很合适。从弹出窗口中选择Pawn并将其命名为BP_Player。

img

注意: Character类也可以它甚至默认包含一个运动组件。

但是,将实现自己的移动系统,因此Pawn类就足够了。

Attaching a Camera

相机是玩家观察世界的方式。将创建一个俯视玩家的相机。

在内容浏览器中,双击 BP_Player 以 在蓝图编辑器中将其打开。

要创建相机,请转到“组件”面板。单击添加组件并选择相机

img

为了使相机处于自上而下的视图中,需要将其放置在播放器上方。选择相机组件后,转到“视口”选项卡。

按W键激活移动操纵器,然后将其移动到(-1100, 0, 2000)或者,可以在位置字段中输入坐标。它位于“详细信息”面板中的“转换”部分下。

img

如果看不到相机,请按F键聚焦它。

接下来,按E键激活旋转操纵器。在Y 轴上将相机向下旋转至-60度。

img

Representing the Player

红色立方体将代表玩家,因此需要使用静态网格体组件来显示它。

首先,通过左键单击“组件”面板中的空白区域来取消选择“相机”组件。如果不这样做,下一个添加的组件将是 Camera 的子组件。

单击添加组件并选择静态网格体

要显示红色立方体,请选择Static Mesh组件,然后转到 Details 选项卡。单击静态网格体右侧的下拉菜单并选择SM_Cube

img

这是你应该看到的(如果你没有看到它,你可以在视口中点击F来关注它):

img

现在,是时候生成玩家 Pawn 了。单击编译并返回到主编辑器。

Spawning the Player

在玩家可以控制 Pawn 之前,需要指定两件事:

  1. 玩家将控制的 Pawn 类
  2. Pawn 生成的位置

通过创建一个新的 Game Mode 来完成第一个步骤。

Creating a Game Mode

游戏模式是控制玩家如何进入游戏的类。

例如,在多人游戏中,可以使用游戏模式来确定每个玩家的生成位置。

更重要的是,游戏模式决定了玩家将使用哪个 Pawn。

转到 Content Browser 并确保位于Blueprints文件夹中。单击添加新按钮并选择蓝图类

从弹出窗口中,选择Game Mode Base并将其命名为GM_Tutorial

img

现在,需要指定默认的 Pawn 类。双击 GM_Tutorial将其打开。

转到“Details ”面板并查看Classes”部分下的内容。单击 Default Pawn Class的下拉菜单并选择 BP_Player

img

在可以使用新的游戏模式之前,关卡需要知道要使用哪种游戏模式。可以在World Settings中指定它。单击编译并关闭蓝图编辑器。

每个级别都有自己的设置。可以通过选择Window\World Settings来访问设置。或者,可以转到工具栏并选择Settings\World Settings

img

一个新的世界设置选项卡将在详细信息选项卡旁边打开。从这里,单击GameMode Override下拉菜单并选择GM_Tutorial

img

img

最后,需要指定玩家生成的位置。可以通过在关卡中放置一个Player Start actor来完成此操作。

Placing the Player Start

在生成玩家的过程中,游戏模式会寻找 Player Start actor。如果游戏模式找到一个,它将尝试在那里生成玩家。

image-20230315160558037

要放置 Player Start,请转到 Modes 面板并搜索Player Start左键单击并将Player Start从“模式”面板拖动到视口中。释放左键单击将放置它。

img

你可以把它放在任何你喜欢的地方。完成后,转到工具栏并单击“播放”。将在放置 Player Start 的位置生成。

img

要退出游戏,请单击工具栏中的停止按钮或按 Esc键。如果看不到光标,请按 *Shift+F1

Setting Up Inputs

将键分配给操作称为键绑定。

在 Unreal 中,可以设置键绑定,当按下它们时会触发一个事件

事件是在某些操作发生时执行的节点(在本例中,当按下绑定键时)。当事件被触发时,任何连接到事件的节点都将执行。

img

这种绑定键的方法很有用,因为它意味着不必对键进行硬编码。

例如,绑定左键单击并将其命名为 Shoot。任何可以射击的演员都可以使用 Shoot 事件来了解玩家何时按下了左键单击。

如果要更改对应的按键,请在输入设置中进行更改。

img

如果对其进行了硬编码,则必须遍历每个演员并单独更改密钥。

Axis and Action Mappings

要查看输入设置,请转到 Edit\Project Settings。在左侧,选择Engine”部分下的 Input

img

绑定部分是设置输入的地方

Unreal 提供了两种创建键绑定的方法:

  • Action Mapping 动作映射:这些只能处于两种状态:按下或未按下。动作事件只会在按下或释放按键时触发。用于没有中间状态的动作,例如开枪。
  • Axis Mapping 轴映射:这些输出一个称为 轴值的数值(稍后会详细介绍)。轴事件将在每一帧触发。通常用于需要摇杆或鼠标的操作。

对于本教程,将使用 映射。

Creating Movement Mappings

首先,将创建两个轴映射组。组允许将多个键绑定到一个事件。

要创建新的轴映射组,请单击Axis Mappings右侧的+号。创建两个组并将它们命名为MoveForwardMoveRight

img

MoveForward将处理向前和向后移动。MoveRight将处理左右移动。

将把移动映射到四个键:WASD。目前,只有两个插槽可以映射键。通过单击组名称字段旁边的+号向每个组添加另一个轴映射

img

要映射键,请单击下拉菜单以显示键列表。将WS键映射到MoveForward将AD键映射到MoveRight

img

接下来,将设置比例字段。

轴值和输入比例

在设置比例字段之前,需要了解它们如何使用轴值

轴值是一个数值,由输入类型及其使用方式决定。按钮和按键在按下时输出 1。Thumbsticks 输出一个介于 -1 和 1 之间的值,具体取决于方向和你推动它的距离。

img

可以使用轴值来控制 Pawn 的速度。例如,如果将摇杆推到边缘,轴值将为 1。如果将其推到一半,则轴值为 0.5。

通过将轴值与速度变量相乘,可以使用摇杆调整速度。

img

还可以使用轴值指定沿轴的方向。如果将 Pawn 的速度乘以正轴值,将得到正偏移量。使用负轴值将导致负偏移。将此偏移量添加到 Pawn 的位置将决定它移动的方向。

img

由于键盘按键只能输出1或0的轴值,可以使用scale将其转换为负值。它的工作原理是获取轴值并将其乘以比例。

如果将正数(轴值)乘以负数(刻度),将得到负数。

通过单击Scale字段并输入-1来设置 SA 键的比例。

img

接下来是有趣的部分:让 Pawn 移动!关闭项目设置,然后在蓝图编辑器中双击打开BP_Player 。

Moving the Player

首先,需要获取运动映射的事件。

  • 右键单击事件图表中的空白区域以获取节点列表。

  • 从菜单中搜索MoveForward

  • 添加Axis Events下列出的MoveForward节点。

    请注意,正在寻找 Axis Events 下的红色节点,而不是 Axis Values 下的绿色节点。

对MoveRight重复该过程。

img

现在,将为MoveForward设置节点。

使用变量

要移动,需要指定 Pawn 移动的速度。指定速度的一种简单方法是将其存储在变量中。

要创建一个,请转到“我的蓝图”选项卡并单击“变量”部分右侧的+号。

img

选择新变量后,转到“详细信息”选项卡。将变量重命名为MaxSpeed。然后,将变量类型更改为Float。通过单击“变量类型”旁边的下拉菜单并选择“浮点”来执行此操作。

img

接下来,需要设置默认值。不过,在设置它之前,需要单击工具栏中的编译。

在的变量仍处于选中状态的情况下,返回到“详细信息”选项卡。转到Default Value部分并将**MaxSpeed的默认值更改为10

img

接下来,将MaxSpeed变量从 My Blueprint 选项卡**拖动到 Event Graph 中。从菜单中选择获取。

img

现在将MaxSpeed轴值相乘以确定最终速度和方向。添加一个float * float节点并将Axis ValueMaxSpeed连接到它。

img

获取玩家方向

要前进,需要知道 Pawn 面向的位置。幸运的是,Unreal 有一个用于此目的的节点。添加一个Get Actor Forward Vector节点。

img

接下来,添加一个Add Movement Input节点。该节点将接受方向和值并将其转换为存储的偏移量。像这样连接节点:

img

白线代表一个执行链。换句话说,当玩家移动输入轴时,将生成一个事件来执行InputAxis MoveForward节点。白线表示一旦发生这种情况,将执行Add Movement Input节点。

添加运动输入节点采用以下输入:

  • Target:设置为自己,在本例中是玩家(红色框)。
  • World Direction:移动目标的方向,在本例中是玩家面对的方向。
  • Scale Value:移动玩家多少,在这种情况下是最大速度 * 轴值(记住是 -1 到 1 范围内的值)。

对MoveRight重复该过程,但将Get Actor Forward Vector替换为Get Actor Right Vector。看看可以在不查看上述说明的情况下自己做多少!

img

Adding the Offset - 动起来

要实际移动 Pawn,需要获取通过 Add Movement Input 计算的偏移量并将其添加到 Pawn 的位置。

基本上,的策略是让玩家在游戏的每一帧移动少量,因此需要将移动添加到每帧生成的Event Tick事件中。

导航到事件图表中的Event Tick节点。它应该在左侧变灰,但如果没有,请创建一个。

img

要获取偏移量,请创建一个Consume Movement Input Vector节点。要添加偏移量,请创建一个AddActorLocalOffset节点。之后,像这样链接它们:

img

基本上,这意味着游戏的每一帧,都会获得任何存储的移动输入,并将其添加到演员的当前位置。

单击Compile,然后返回到主编辑器并单击Play。现在可以四处走动了!

img

不过有一个小问题。高端机器能够以更快的速度渲染帧。由于每帧都会调用 Event Tick,因此运动节点将更频繁地执行。这导致 Pawn 在高端机器上以更快的速度移动,反之亦然。

要解决此问题,的移动需要与帧速率无关

注意:我已经设置了一些键绑定,可以向展示帧速率依赖性的影响。按0将帧速率上限设为 60,然后按1重置上限。在两个帧速率中四处移动以查看速度差异。

帧率独立性

帧率独立性意味着无论帧率如何,一切都会有相同的结果。值得庆幸的是,在 Unreal 中实现帧速率独立性很容易。

退出游戏,然后打开BP_Player。接下来,导航到的Event Tick节点并查看Delta Seconds

img

Delta Seconds 是自上次 Event Tick 以来经过的时间量。通过将的偏移量乘以 Delta Seconds,的运动将与帧速率无关。

例如,的 Pawn 的最大速度为 100。如果自上次 Event Tick 后经过一秒,的 Pawn 将移动整整 100 个单位。如果半秒过去了,它将移动 50 个单位。

img

如果移动取决于帧速率,则 Pawn 将每帧移动 100 个单位,而不管帧之间的时间间隔。

要将偏移量乘以 Delta Seconds,请添加一个vector * float节点。之后,像这样连接你的节点:

img

由于帧之间的时间(Delta Seconds)非常小,的 Pawn 移动速度会慢很多。通过将MaxSpeed的默认值更改为600来解决此问题。

img

可能已经注意到立方体正好穿过所有东西。要解决这个问题,需要了解collisions

戴上你的安全头盔,因为你即将与一些理论发生正面碰撞!

Actor Collisions

为了能够碰撞,actor 需要其可碰撞空间的表示(通常称为碰撞)。可以使用以下其中一项:

  • Collision mesh 碰撞网格:这些是在导入网格时自动生成的(如果启用它)。用户还可以使用 3D 软件创建自定义碰撞网格。红色框已经有一个自动生成的碰撞网格。
  • Collision component 碰撞组件:它们有三种形状:盒子、胶囊和球体。可以通过“组件”面板添加它们。一般用于简单的碰撞。

下面是角色及其碰撞的示例。

img

当一个 actor 的碰撞触及另一个 actor 的碰撞时,就会发生碰撞。

img

现在,是时候启用碰撞了。

启用碰撞

可能想知道为什么盒子没有碰撞,即使它有碰撞网格。当移动一个 actor 时,Unreal 只考虑碰撞的组件。由于的 Pawn 的根组件没有任何碰撞,因此它会穿过所有东西。

注意:没有碰撞作为根的 actor 仍然可以阻挡其他 actor。但是,如果移动actor,它不会与任何东西发生碰撞。

因此,要使用碰撞网格,StaticMesh需要成为root。为此,请转到“组件”面板。接下来,左键单击并将StaticMesh**拖动DefaultSceneRoot。释放左键单击以使StaticMesh成为新的根。

img

在碰撞起作用之前还有一件事要做。切换到 Event Graph 并转到AddActorLocalOffset节点。找到 Sweep 并通过左键单击复选框将其设置为

img

基本上,AddActorLocalOffset将演员传送到新位置。Sweep确保 actor 与新旧位置之间的任何东西发生碰撞。

返回主编辑器并单击Play。立方体现在将与关卡发生碰撞!

img

要做的最后一件事是创建一个在玩家触摸时消失的物品。

禁用碰撞 & 自定义碰撞层

Creating an Item

通常,物品是玩家可以收集的任何东西。将使用BP_Banana作为项目。

要检测立方体何时接触到物品,需要一个在发生碰撞时触发的事件节点。可以使用碰撞响应来生成此类事件。

碰撞响应还决定了一个 actor 在与另一个 actor 发生碰撞时的反应。

共有三种类型的碰撞响应:Ignore、Overlap、Block。

以下是它们如何相互作用:

img

尽管可以使用 Overlap 或 Block,但本教程只会向展示如何使用 Overlap。

设置碰撞响应

退出游戏,然后打开BP_Banana。选择StaticMesh组件,然后转到 Details 面板。碰撞部分是设置碰撞响应的地方

img

正如所看到的,大多数设置都是灰色的。要使它们可编辑,请左键单击**Collision Presets旁边的下拉菜单。从列表中选择自定义。

img

现在,需要指定项目和立方体之间的碰撞响应。

组件有一个称为对象类型的属性。对象类型只是将相似的参与者组合在一起的一种便捷方式。

可以在此处阅读有关对象类型的更多信息。

由于立方体的类型是WorldDynamic,希望将碰撞响应更改为该类型。

Collision Responses部分下,将WorldDynamic的碰撞响应更改为Overlap通过左键单击WorldDynamic右侧的中间复选框来执行此操作。

img

处理碰撞

要处理碰撞,需要使用重叠事件。转到 Components 面板并右键单击StaticMesh

从上下文菜单中,选择添加事件\添加 OnComponentBeginOverlap

img

这会将OnComponentBeginOverlap (StaticMesh)节点添加到的事件图表中。

img

最后,创建一个DestroyActor节点并将其链接到OnComponentBeginOverlap (StaticMesh)节点。

顾名思义,它将目标演员从游戏中移除。但是,由于没有目标,它会销毁调用它的演员。

img

放置项目

关闭蓝图编辑器,然后确保位于蓝图文件夹中。

通过左键单击并将BP_Banana拖到 视口中,开始将香蕉放入关卡中。

img

点击Play开始收集香蕉!

img

蓝图Debug

image-20230316112419725

本文由作者按照 CC BY 4.0 进行授权