虚幻4 游戏引擎(二):蓝图教学

蓝图


蓝图是虚幻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 开始收集香蕉!

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值