且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

更新时间:2022-09-20 15:40:54

本节书摘来异步社区《Unreal Engine 4蓝图可视化编程》一书中的第1章,第1.5节,作者: Brenden Sewell 译者: 陈东林 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.5 制作移动标靶

既然我们有目标来响应玩家的射击,则可以添加一些挑战性的东西来让项目像一个游戏,一个简单的方法是为目标制作移动的标靶。为了完成这个功能,首先我们需要将目标actor是设为可移动的,然后需要通过蓝图设置逻辑。这样便可以控制目标移动。我们的目标是使目标圆柱体在关卡中来回移动。

1.5.1 改变actor的移动性和碰撞

为了让目标移动,首先需要改变actor的移动性(Mobility)为可移动(Moveable)。这个操作将允许对象在玩游戏时可以被操纵。在UE4编辑器的世界大纲视图中,选中CylinderTarget_Blueprint,查看细节(Details)面板。在变换数值(Transform values)的下方,可以看到可移动的开关,单击将状态由静态(Static)转变到可移动,如图1.22所示。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

注意 批注 

默认情况下, 放置在世界中/场景中的actor为静态(Static)。“静态”表示这个对象在游戏运行时不能移动或被操作。静态对象着重对少量的关键资源进行渲染,应该将其作为非交互对象的默认选择,以便最大化帧率。

注意:关卡中目标圆柱体的版本仅仅是我们为目标圆柱体创建的蓝图模板的一个实例。这个实例是指一个已经被创建的真正的对象,而蓝图是各种特征的描述,一旦使用蓝图创建了实例,该实例也会拥有这些特征。

在关卡中我们做的改变仅仅是针对目标圆柱体的,为了对其他目标也做一些改变,就需要直接修改蓝图了。为此,打开CylinderTarget_Blueprint。

随着蓝图的打开,我们希望查找工具栏下方的视口标签。在左侧,可看到组件(Components)面板列出了组成这个蓝图的所有组件。由于我们想编辑物理对象、网格的属性,所以单击组件StaticMeshComponent(继承)。在蓝图编辑器的右边会看到细节面板与UE4关卡编辑界面中的细节面板有着相同的属性和分类。在这里,我们同样地将变换(Transform)下方的移动性开关设为可移动。这个操作将确保由这个蓝图创建的目标是设置为可移动的。

因为我们希望子弹能够将对象作为射击目标,所以需要确保目标能够发生碰撞,以至于子弹不会穿过目标。仍然是在细节面板中操作,找到Collision分类,然后在下拉菜单中找到碰撞预设值(Collision Presets)。在这个菜单中会有很多的选项。选择Custom时,用户可以将对象与不同对象之间的碰撞交互进行个性化设置。为了达到项目预期,我们仅需要选择BlockAllDynamic。这样网格会记录它与其他拥有碰撞器的对象之间发生的碰撞。如图1.23所示。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

1.5.2 目标分析

既然我们将目标设置为可移动的,接下来需要让蓝图控制目标圆柱体如何移动。为了移动一个对象,需要3个三方面的数据。

  • 圆柱体的当前位置。
  • 应该在什么方向移动。
  • 它应该达到的移动速度。

为了理解对象现在的位置,我们需要知道更多的信息,特别需要留意圆柱体在世界中的坐标。需要将速度和方向的值提供给蓝图,通过一些必要的计算将这些值算出来,为蓝图移动对象提供有用的信息。

1.5.3 使用变量存储数据

第一步就是创建两个变量:方向(direction)和速度(speed)。找到我的蓝图(My Blueprint)面板,你会看到一个叫作变量(Variables)的分类,这个分类里暂时没有其他数据,可单击这个分类右边的加号(+)来创建变量。

创建变量后,单击该变量,在蓝图编辑器右边的细节面板中,用户将看到一系列的区域可以用于编辑这个变量,我们需要编辑其中的4个:变量名称(Variable Name)、变量类型(Variable Type)、可编辑(Editable)和默认值(Default Value)。我们希望第一个变量用于控制移动速度,因此重命名该变量名为Speed。对于变量类型,我们希望这个变量能够用于存储期望的速度数值,因此在下拉列表中选择浮点型(Float)。

勾选可编辑使得能够在此蓝图之外编辑该变量。这样在测试游戏的时候能够很方便快速地调整变量的数值。默认值分类看起来没有可编辑区域,但是有一条提示信息请编译此蓝图(compile the Blueprint),编译蓝图之后,出现一个可以输入初始值的区域,将默认的值0.0改为200.0,如图1.24所示。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

通过同样的步骤,创建Direction变量,变量类型选择Vector。Vector包含X、Y、Z坐标轴的信息。在这个情况下,我们需要指明对象移动的方向。设置Direction变量为可编辑,并且将默认值设为(0.0,-10.0,0.0)。

1.5.4 准备计算方向

为了得到需要为移动所提供的信息,现在将继续探索。或许最初的时候看起来有些难,但是通过分解每个功能并将各个节点组合起来,就可以完成最终的目标。

我们需要完成的第一个计算工作就是取出direction变量的向量并进行归一化(normalize)。归一化是向量运算中的一个常见步骤,可将向量的长度转换为一个单位长度,可与其余部分的计算兼容。有一个专门的蓝图节点来完成此操作。

选中我的蓝图(My Blueprint)面板上的Direction变量,将它拖曳至事件图表(Event Graph)中的空白区域。这个操作将生成一个小的节点,提示用户选择获得(Get)或者设置(Set)。我们想取出direction的值,所以选择获得来创建这个节点来存储变量的值。单击Direction节点的输出引脚至事件图表的空白区域,在搜索框内键入“normalize”,在搜索结果中选择Vector分类下的Normalize节点,如图1.25所示(选中需要注释的两个节点后按[C]键添加注释)。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

如果发现搜索不到节点,请将Vector数组改为Vector,如图1.26所示。

注意 批注 

在蓝图上留下注释是一个很好的习惯,注释能够帮助描述这一组蓝图完成什么样的功能。在编辑完这个蓝图后,过一阵子回过头来看的时候能够快速地知道它的功能。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

1.5.5 使用delta time关联速度与时间

为了让速度值与方向相关,首先需要将速度变量与delta time相乘。delta time是以秒计算,完成最后一帧的时间。它与游戏的帧速率不同。速度变量的值与delta time相乘后,可以确保游戏中的对象的速度都是一致的,与游戏的帧速率无关。[4]

将Speed变量拖入事件图表,选择“获得”来创建这个速度节点。在事件图表空白区域单击鼠标右键进行搜索,找到Get World Delta Seconds选项。最后从Speed节点或Get World Delta Seconds节点的输出引脚拖出引线,调出搜索框,键入“”(星号)或“multi”,找到并选择floatfloat节点。最后,将另外一个节点(Speed节点或Get World Delta Seconds节点)输出引脚至float*float节点的另一个输入引脚,这样就做到了使两个数值相乘,如图1.27所示。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

1.5.6 转换现有位置坐标

既然已经有了归一化的方向向量和与时间相关的速度值,就需要将这两个数值相乘并将结果赋给对象目前的坐标。首先,在组件面板找到StaticMeshComponent,并将它拖曳到事件图表。这个操作将生成一个节点,从这个节点中我们可以提取包含在对象的网格组件(mesh component)中的任何数据。

下一步,我们希望获取网格的位置坐标。方法之一就是查看对象的变换属性并提取位置(location)信息,从蓝色的输出引脚拖出引线,在搜索框内键入“Get World”,选择Get World Transform选项创建节点。除了位置坐标,变换还包含对象的旋转和缩放信息。这一点很有用,因为我们希望目标移动的时候仍然具有旋转和缩放属性,并且从新的移动信息中获取信息来创建变换 的值。

现在我们希望将变换分解到组件部分。这样就可以在计算中仅使用变换的位置信息,同时保留旋转和缩放不变。从Get World Transform节点的输出引脚拖出引线,搜索Break Transform节点并添加到事件图表中。

现在我们需要添加必要的节点为刚提取出来的位置信息添加速度和方向。右键单击事件图表的空区域,搜索并选择Make Transform节点。这个将时我们运算的最后一个操作,所以将它放在蓝图靠右的位置。Make Transform节点有3个输入:Location、Rotation、Scale。将Rotation、Scale与之前创建的Break Transform节点的对应输出引脚相连。

下一步,我们需要将方向向量与浮点型的速度数值相乘。从Normalize节点的输出引脚拖出引线,搜索“”或“multi”,选择Vector Float,然后将绿色的输入引脚与速度乘以deltatime的节点的输出引脚相连。

最后一步是将速度与方向添加至运算得到的当前位置。单击最新创建的乘法节点的黄色向量输出引脚,拖出引线至事件图表空白区域,搜索“+”,选择Vector+Vector节点。确保向量相加的输入引脚与乘法节点的输出引脚相连后,将另外一个输入引脚与Break Transform节点的Location输出引脚连接。最后,将向量加法节点输出引脚与Make Transform节点的Location输入引脚相连接,如图1.28所示。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶

1.5.7 更新位置

既然我们计算了变换,就可以通过变换的值来调整目标actor的位置了。前面已经使用deltatime使得速度和方向的变化与帧率无关,因此可以简单地使用事件Tick节点来实现每帧都触发移动(move)动作。鼠标右键事件图表的空白区域,搜索“Event Tick”并选择事件Tick,将它放置在Make Transform节点的右边。

为了移动目标actor,我们需要使用Set Actor Transform节点。从事件Tick的执行引脚拖出引线至图表的空区域,查找Set Actor Transform并选择节点。然后连接Make Transform节点的Return Value输出引脚至Set Actor Transform节点的New Transform输入引脚,如图1.29所示。


《Unreal Engine 4蓝图可视化编程》一1.5 制作移动标靶