UE4 蓝图教程(二) 蓝图

蓝图

蓝图是虚幻4中的可视化脚本系统,是一种快速开发游戏原型的方法。无需逐行编写代码,您可以直观的做所有事情:拖放节点,将它们的属性设置在UI中,并拖动连接线来连接。除了成为一个快速的原型开发工具之外,蓝图还使得非编程人员可以很快速地上手编写脚本。
博主水平有限,如有疑问,请参见 原英文教程

在本教程中,您将用蓝图:
1 设置一个从上向下看的摄像机
2 创建一个由玩家控制的具有基本动作actor
3 设置玩家输入
4 创建一个物品,当玩家碰到它时消失。

开始
下载 starter project并解压它。打开项目文件夹并打开BananaCollector.uproject。
注意:如果你收到提示,说这个项目是用旧版本的虚幻4创建的,没关系(引擎经常更新)。您可以选择打开副本,也可以选择在合适的位置进行版本转换。
如果一切正常,你会看到下面的场景。这是玩家移动并收集物品的地方。

我已经将项目文件夹分类了以便于查找文件,正如您所看到的:

如果你愿意,你可以使用红色区域的按钮来显示或隐藏Content面板。
创建玩家
在内容浏览器中,找到Blueprints 文件夹。单击Add New按钮并选择Blueprint class。
因为你想让actor 能够接收到玩家的输入,所以Pawn 类是合适的。从弹出窗口中选择Pawn ,并将其命名为BP_Player。

注意:Character 类也可以工作。它甚至在默认包含了一个移动组件。但是,你将会实现你自己的移动功能,所以用Pawn 类就足够了。

附加相机
相机是玩家观察世界的方法。你需要创建一个相机,指向玩家的视线方向。
在内容浏览器中,双击BP_Player,在蓝图编辑器中打开它。
要创建一个相机,请来到组件面板。点击Add Component并选择Camera。

想让相机从上往下看,你需要把它放在玩家上面。选择了相机组件后,转到Viewport选项卡。通过按W键激活移动操作器,然后移动到(-1100,0,2000)。或者,您可以直接在将坐标输入。它位于详细信息面板的Transform/Location字段下。

如果你看不到相机,按下F键。
接下来,通过按E键激活旋转。在y轴上旋转相机到-60度。
玩家代表
红色的方块代表玩家,所以你需要使用一个静态的网格组件来显示它。
首先,通过单击组件面板中的空白空间取消选中的相机组件。否则,下一个添加的组件将会是一个相机的子组件。
单击Add Component 并选择 Static Mesh。

要显示红色方块,选中StaticMesh组件,然后切换到细节选项卡。单击位于Static Mesh右侧的下拉框并选择SM_Cube.。

这就是您应该看到的场景(如果您没有看到它,您可以在Viewport中按F):

现在,该创建Pawn了。单击编译并返回到主编辑器。
产生玩家
在玩家控制Pawn之前,你需要指定两件事:
1 玩家将控制的Pawn类
2 Pawn如何生成
通过创建一个Game Mode类来完成上述任务。

创建游戏模式
游戏模式是一个控制玩家如何进入游戏的类。例如,在多人游戏中,你可以使用游戏模式来确定每个玩家的产生的位置。更重要的是,游戏模式决定了哪些Pawn玩家将使用。
进入内容浏览器,确保你已经进入了Blueprints文件夹。单击Add New按钮并选择Blueprint class。从弹出窗口中,选择Game Mode Base ,并将其命名为GM_Tutorial。

现在,您需要指定一个默认的Pawn 类。双击GM_Tutorial 打开它。
转到详细信息面板并查看类的部分。单击Default Pawn Class 的下拉框,并选择BP_Player。

在你使用你的新游戏模式之前,关卡需要知道使用了哪种游戏模式。你可以在World Settings中指定。单击Compile并关闭蓝图编辑器。每个关卡都有自己的设置。您可以通过选择Window\World Settings来访问这些设置。或者,您可以在工具栏选择Settings\World Settings来设置。

一个新的“World Settings”选项卡将在Details选项卡旁边打开。从这里,单击GameMode Override 的下拉列表,并选择GM_Tutorial。

现在您将看到这些类已经更改为在GM_Tutorial中所选中的类。

您需要指定玩家在何处生成。你可以通过将一个Player Start actor放入这个关卡中来实现这个目标。
设置游戏开始时玩家所在的位置
在生成一个玩家的过程中,游戏模式寻找一个玩家开始的角色。如果游戏模式找到了,它会尝试在那里生成玩家。
要想让玩家启动,可以模型面板中搜索Player Start。点击和Player Start 从模型面板开始进入Viewport。释放鼠标将它放置好。

你可以把它放在你喜欢的地方。完成后,到工具栏并单击Play。将会在你放置Player Start.的地方生成。

想要退出游戏,单击工具栏中的Stop按钮或按Esc键。如果你看不到光标,请按Shift+F1。
如果你不能四处移动,那就不是一个游戏了,对吧?您的下一个任务是设置输入参数。
配置输入
为操作分配一个键称为键绑定。
在虚幻引擎中,您可以设置键绑定,当您按下它们时,将触发一个事件。事件是当某些操作发生时执行的节点(在这种情况下,当你按下这个键)。当触发事件时,连接到事件的节点都将执行。

这种绑定键的方法十分方便。
例如,您将鼠标左键单击并将其命名为Shoot。任何可以射击的actor 都可以使用Shoot事件来判断玩家是否按下了左键。如果您想要更改键,您可以在输入设置中更改它。

Axis 和Action 映射
要查看输入设置,请点击Edit\Project Settings.。在左边,选中Engine中的input。

Bindings 部分是您将设置输入的地方。

虚幻提供了两种创建键绑定的方法:
1 Action Mapping:
它只存在两种状态:按下或没有按下。当您按下或释放键时,事件才会触发。用于那些没有中间状态的动作,比如射击。
2 Axis Mapping:
它输出的数值称为axis value (稍后会详细说明)。Axis事件每个帧都会触发。通常用于鼠标控制准星的动作。
对于本教程,您将使用Axis Mapping。

创建移动映射
首先,您将创建两个axis Mapping组。组允许您将多个键绑定到一个事件。
要创建一个新的axis映射组,需要单击Axis Mappings右侧的+号。现在创建两组,并将它们命名为MoveForward和MoveRight。

MoveForward将处理前后移动。MoveRight将处理左右移动。
你将把移动映射到四个键:W、A、S和D。当前,只有两个槽可以映射键。通过单击组(MoveForward)名称旁边的+号,向每个组添加另一个axis映射。

映射一个键,需要单击下拉列表来弹出一个键列表。将W和S键映射到MoveForward。将A和D的键映射到MoveRight。

接下来,您将设置输入Scale大小。
Axis 和Scale
在设置Scale字段之前,您需要了解它们是如何使用axis 值工作的。
axis值是一个数值,如何使用它由它输入的类型决定。按钮或键在按下时输出1。根据你的方向和你推进的距离,输出-1到1之间的值。

你可以使用axis 值来控制一个pawn的速度。例如,如果你把图钉推到边缘,axis 的值是1。如果你把它推到一半,它就会是0.5。
通过将axis值与速度变量相乘,你可以调整图钉的速度。

您还可以使用axis值指定沿着轴的方向。如果你将一个Pawn的速度乘以一个正轴值,你将得到一个正的偏移量。使用负axis值将导致负偏移。将这个偏移量添加到Pawn的位置将确定它移动的方向。

由于键盘键只能输出1或0的axis 值,因此可以使用scale值将其转换为负数。它的作用是取axis值然后乘以它的scale。
如果你把正(轴的值)和负的(比例)相乘,你会得到一个负数。
通过单击scale字段并输入-1来设置S和A的scale值。

接下来,有趣的部分是:让Pawn移动!关闭Project Settings,然后双击BP_Player,在蓝图编辑器中打开
移动玩家
首先,您需要为您的移动映射获取事件。在事件节点图中右击一个空白区域,以获得一个节点列表。从菜单中搜索MoveForward。添加在Axis Events中列出的MoveForward节点。注意,您正在寻找在Axis Events下的红色节点,而不是在Axis值下的绿色节点。
重复这个过程。

现在,您将为MoveForward设置节点。
使用变量
要移动,你需要指定兵的移动速度。指定速度的一种简单方法是将其存储在一个变量中。
要创建一个,请转到My Blueprint选项卡,并单击“Variables 部分右侧的+号。

选中新变量后,请转到Details选项卡。将变量重命名为MaxSpeed。然后,将变量类型改为Float类型。通过单击Variable Type 旁边的下拉框并选择Float。

接下来,需要设置默认值。在您设置它之前,您需要在工具栏中单击Compile。
选中变量,返回到详细信息面板。转到默认值部分,将MaxSpeed的默认值修改为10。

接下来,从My Blueprint中拖动MaxSpeed变量到节点图视图中。在菜单中点击Get。

现在,你将把MaxSpeed和axis 值相乘,以确定最终的速度和方向。添加一个float * float节点,并把Axis 值和MaxSpeed都和它相连。

得到玩家方向
为了前进,你需要知道Pawn的位置。幸运的是,虚幻有一个节点用于这个目的。添加一个Get Actor Forward Vector 节点。

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

白线代表一个执行链。换句话说,当玩家输入axis移动时,将产生一个事件,该事件将执行InputAxis MoveForward 节点。白线表示,一旦发生这种情况,将执行 Add Movement Input 节点。
Add Movement Input节点接受以下输入:
1 Target:目标,设置为self,在本例中为玩家自己(红色框)。
2 World Direction:世界方向,移动目标的方向,在本例中是玩家所面对的方向。
3 Scale Value:比例值:在这个例子中是最大速度axis值(记住是在-1到1之间的值)。
重复这个过程,但是用Get Actor Right Vector.取代Get Actor Forward Vector,不要查看上面的说明, 看看你能做多少!

添加偏移量
要实际移动Pawn,你需要通过添加移动输入计算出偏移量,并将其设置到Pawn的位置。
基本上,你要做的就是让玩家在游戏的每一帧中移动一小部分,因此你需要将动作添加到一个Event Tick事件中,这是每一个帧都会触发的的。
转到节点图中的Event Tick节点。它的左边应该是灰色的,如果没有,就创建一个。

要获得偏移量,创建一个Consume Movement Input Vector节点。要添加偏移量,创建一个 AddActorLocalOffset 节点。然后,把它们连起来:

基本上,这意味着在游戏的每一帧中,你将获得任何已有的动作输入,并将它添加到actor的当前位置。
单击Compile,然后返回主编辑器并单击Play。你现在可以四处走动了!

不过,这儿还有一个小问题。该事件是帧事件,每帧都会触发,配置高的机器能够以更快的速度渲染帧。移动节点将会执行得更频繁。这就导致了在置高的机器上会以更快的速度移动,反之亦然。
要解决这个问题,你的运动需要保持独立的帧速率。
注意:我已经设置了一些键绑定,这些绑定将显示帧速率依赖的影响。按0将帧速率设为60,并按1重新设置默认。在不同的帧速率中移动,以观察速度的差异。
帧速率独立
帧速率的独立性意味着无论帧速率如何,所有的结果都会有相同的结果。幸运的是,在虚幻引擎中实现帧率的独立是很容易的。
退出游戏,然后打开BP_Player。接下来,转到到您的Event Tick节点,并查看Delta Seconds秒。

Delta秒是上次事件发生后的时间。通过将你的偏移量与时间相乘,你的运动就会独立于帧速率。
例如,你的Pawb的最大速度是100。如果一秒钟过去了,你的兵将会移动全部100个单位。如果半秒过去了,它将移动50个单位。

如果移动依赖于帧速率,那么无论帧与帧之间的时间间隔为多少,每一帧Pawn都会移动100个单位。
要将您的偏移量与Delta Seconds相乘,添加一个vector * float节点。然后,连接起来:

因为在帧之间的时间(Delta Seconds)非常小,你的Pawn会移动的非常慢。通过将MaxSpeed的默认值更改为600,来解决这个问题

祝贺您,您已经成功地实现了帧率独立!

你可能已经注意到,立方体能穿过所有的东西。要解决这个问题,你需要了解碰撞。
带上安全帽,因为你要与一些碰撞理论正面交锋!
Actor碰撞
当你想到碰撞的时候,你可能会想到汽车撞在一起了。幸运的是,虚幻引擎的碰撞更安全。
为了能够碰撞,一个actor 需要一个碰撞空间(通常称为碰撞)。你可以使用以下的任意一个:
1 Collision mesh:当一个网格被导入时,这些是自动生成的(如果启用的话)。用户还可以使用3D软件创建一个自定义的碰撞网格。这个红色的盒子已经有了一个自动生成的碰撞网格。
2 Collision component:它们有三种形状:盒子、胶囊和球体。您可以通过组件面板添加它们。一般用于简单的碰撞。
下面是一个人物及其碰撞的例子。

当一个actor的碰撞空间遇到另一个actor的碰撞空间时发生碰撞。

现在是时候开启碰撞了
启用碰撞
你可能想知道为什么这个盒子没有碰撞,即使它有一个碰撞网。当您移动一个actor时,虚幻引擎只考虑到根组件的碰撞。因为你的Pawn的根组件没有任何碰撞检测,所以它会穿过所有的东西。
注意:一个没有发生碰撞的actor仍然可以阻止其他物体。但是,如果你移动actor,它不会与任何东西相撞。

所以,StaticMesh要碰撞,需要根组件。要做到这一点,去组件面板。然后,左击StaticMesh 拖动到DefaultSceneRoot。释放左击使StaticMesh成为新根组件。

碰撞前还有一件事要做。切换到事件节点图并找到到AddActorLocalOffset节点。找到Sweep 并将其设置为true,勾选复选框。

基本上,AddActorLocalOffset将碰撞对象的位置。Sweep确保actor 与新旧位置之间的任何东西发生碰撞。回到主编辑器,点击Play。立方体现在会与地面碰撞!

你要做的最后一件事是创建一个当玩家碰到它时消失的物品。
创建一个item
一般来说,item是玩家可以收集到的物品。您将使用BP_Banana作为收集的item
要检测玩家何时该触碰到到item,您需要一个事件节点,该节点在发生冲突时触发。您可以使用冲突响应来生成这样的事件。
碰撞响应也决定了一个Actor与另一个Actor碰撞时的反应。碰撞响应有三种类型:忽略、重叠和阻塞。下面是它们如何相互作用:

尽管您可以使用Overlap 或Block,本教程只会向您展示如何使用Overlap 。
设置碰撞反应
退出游戏,然后打开BP_Banana。选择StaticMesh组件,然后进入Details面板。Collision 部分是你设置碰撞响应的地方。

如您所见,大多数设置都是灰色的。为了使它们可编辑,左键单击Collision Presets的下拉菜单。从列表中选择Custom。

现在,您需要指定立方体的碰撞响应项
组件有一个称为object type的属性。对象类型可以方便的把相似的actors组合在一起。您可以在这里阅读更多关于对象类型的内容。
由于立方体的类型是WorldDynamic,所以您要在Collision Responses部分更改该类型的碰撞响应。,改变了worldddynamic的碰撞响应。通过左击勾选“WorldDynamic”右边中间的复选框来完成这个操作。

处理碰撞
要处理碰撞,需要使用overlap 事件。进入组件面板,右键单击StaticMesh。从上菜单中,选择Add Event\Add OnComponentBeginOverlap。

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

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

放置物体
关闭蓝图编辑器,然后确保您在蓝图文件夹中。
开始将香蕉放置到水平,通过左击和拖动BP_Banana进关卡视口。

点击 Play 开始收集香蕉!

猜你喜欢

转载自blog.csdn.net/niu2212035673/article/details/79417568