本节书摘来异步社区《unreal engine 4蓝图可视化编程》一书中的第2章,第2.1节,作者: brenden sewell 译者: 陈东林 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。
现代fps的核心元素就是以瞄准镜的形式将fov(field of view,视野)呈献给玩家。这是一个很重要的因素,给游戏带来了精确感和控制感。现在将这一功能的简化版添加到项目中。
在事件图表中靠近mouse input节点组的空白区域单击鼠标右键,搜索输入动作zoom(inputaction zoom)触发器节点并添加。我们希望修改firstperson- camera组件中的fov值,于是到组件面板中找到firstpersoncamera并将它拖入事件图表中。
从firstpersoncamera节点的输出引脚拖出引线,搜索set field of view(变量)节点并选择。减小视野给我们一种效果:在屏幕的中央将一小块区域进行放大。由于我们默认的视野值是90,处理后的视野值在节点中设为45,如图2.8所示。
连接输入动作zoom的pressed输出执行引脚和设置节点的输入执行引脚。编译、保存,最小化蓝图后在ue4关卡编辑器中单击播放进行测试。你将注意到当你右键单击鼠标时,视野会缩小,看到的物体也感觉更近了。由于主摄像机中为角色剔除的对象会产生变形,所以接下来我们将优化这一行为。
为了让视野平滑转换,我们需要创建一个将变化逐渐地显示出来的动画。为了实现这个效果,先回到事件图表中的firstpersoncharacter蓝图。
按住[alt]键并单击输入动作zoom节点的pressed输出执行引脚的连接,从pressed引脚拖出引线,搜索并选择添加时间轴(add timeline)来添加一个时间轴(timeline)。时间轴允许我们在指定的时间内改变一个值(比如摄像机的视野)。
注意 批注 组件末尾的(继承)标签告诉我们这个组件的功能在c++ 脚本中定义,而不是在蓝图中定义的。组件的功能直接在c++ 脚本中定义,这在进行移动或网格定义的物理计算等复杂工作的组件中很常见的。如果你对继承组件的代码感兴趣,你可以右键单击该组件打开“.h”头文件。
为了改变时间轴的值,双击时间轴节点,打开时间轴编辑器。在编辑器左上角你将看到4个按钮,每个按钮都能添加一个不同类型的并且将在时间轴过程中改变的值。因为视野被一个数值所表示,所以我们单击[f]按钮(添加浮点型轨迹(add float track)),将添加一个时间轴,并且光标闪烁提示修改标签名,我们将它命名为field of view。现在我们需要在不同的时间间隔上编辑数值,如图2.9所示。
为了完成上图所示的时间轴,我们需要按住[shift]键并在(0,0)点附近单击(也可以在(0,0)点附近单击鼠标右键>>添加关键帧),你将看到在图表的左上角出现时间和数值区域。这允许我们根据数值精确地调整时间轴。确保时间设置为0.0,默认视野(fov)的值为90,即(时间,值)为(0.0,90)。
我们希望放大的动画尽量快速完成,所以在时间轴编辑器的顶端,找到长度(length)右边的输入框,将默认值修改为0.3。这个操作可以将动画限定在0.3秒内完成。现在按住[shift]键并单击图表白色区域的末端,仔细地将time区域设为0.3,值区域设为45(如果觉得手动调比较麻烦,可以在输入框内直接输入)。这时数值区域内所有的数值都自动地被转换为近似的浮点型数值,如图2.10所示。这些数值差并不能产生更多的视觉上的差异,所以我们并不需要太关心这个数值转换。
注意到时间线反映的值逐渐地从90减小到45,这意味着当这个动画被调用时,玩家的视野将会平滑地放大,而不是迅速地从90直接变为45。这样就利用时间轴来设置数值在一段时间内的改变。
现在转到事件图表,我们希望用时间轴来设置视野,如图2.11所示连接蓝图。
从时间轴_0节点的field of view输出引脚拖出引线至设置(set)节点的输入引脚。这样将重写之前写死的值45。然后,将时间轴节点的update输出执行引脚与设置节点的输入执行引脚相连。这个操作将使得视野值(fov value)通过传递新的值给执行函数来随时更新。由于在时间轴里已经设置过了,视野的值在这里就不需要设置了,时间轴使得视野值从90到45在0.3秒内逐渐变化。
ue4中有两种基本的方法实现动画。时间轴非常适合于简单的改变数值,比如门绕着轴旋转,对于更复杂的、基于角色的或者是电影般的动画,可以使用引擎内建的动画系统。matinee(关键帧)和复杂的动画超出了本书的范围,但是有很多专用的学习资源是使用matinee的。建议从unreal wiki相关的教程开始,参见wiki网站的相关介绍。
最后,我们希望当鼠标右键松开时,取消放大视野。为了实现这个效果,从输入动作zoom节点的released引脚出出引线连接至时间轴节点的reverse引脚。这个操作将使得松开鼠标右键时,原来拉近视野的动画倒着播放(即拉远视野),保证在还原到原来视野时有一个平滑的切换动画。同样地,选中完成该功能的所有节点,为节点组添加注释,可方便后续查阅时能够快速了解这个节点组完成的功能。
现在请编译、保存蓝图,最小化蓝图编辑器后,在ue4编辑器中按下播放按钮进行测试,当你按下和松开鼠标右键时,视野是否能相应地拉近和拉远。
我们已经给玩家角色增加了新的玩法,现在需要将关注点回到游戏的射击机制上。从刚才测试的情况来看,从枪口射出的子弹(小球)在空中的运动轨迹是一条速度相对较慢的弧线,我们希望适当加快子弹的速度让它看起来更像。
为了更改子弹的属性,我们需要打开同样位于blueprints文件夹中的蓝图firstpersonprojectile。打开蓝图后,找到组件面板里的并选择projectile。这是一个控制子弹移动组件,其已经被添加到球体网格和碰撞器,用于定义当子弹在游戏世界中被创建后怎样运动。
在细节面板中,projectile具有一系列的属性值。这些值与移动相关并可以被修改,我们将修改其中部分属性值,如图2.12所示。
首先,找到initial speed和max speed属性,默认值为3000。initial speed定义了当子弹被创建时的飞行速度。max speed定义了在子弹创建之后给子弹施加力,子弹能够达到的最大速度。如果我们有一个火箭,或许会期望在火箭发射后给它施加一个加速度来表示推进器工作。然而,由于我们正在表示从枪口射出的子弹,将初设速度设置的最快更有意义,因此将initial speed和max speed都设为之前速度的两倍,即6000。
此外,你或许注意到当子弹碰到墙和其他物体时会反弹,就像碰到了一堵橡皮墙一样。然而我们要模仿一个更硬、更强力的冲击弹丸。为了移除反弹属性,在细节面板中找到projectile bounces分类,将should bounce取消勾选。其他的选项只有在should bounce勾选时才起作用,所以不需要去调整它们。
现在请编译、保存蓝图,最小化蓝图编辑器后,在ue4编辑器中按下播放按钮进行测试,你将发现枪口射出的子弹打得更远、更有力度。