2.3 添加音效和粒子效果
既然我们已经拥有了更好的玩家移动和射击属性,将我们关注的点转向敌方目标。现在的效果是射击目标圆柱体后圆柱体会变成红色。然而,目前没有任何可以被玩家完全摧毁的目标。
我们可以通过添加蓝图逻辑来添加更多的与目标之间的交互,比如在击中目标两次及以上时销毁物体,同时增加玩家的奖励,一旦目标被摧毁,就产生一个令人满意的声音和视觉效果。
2.3.1 为目标状态添加分支
我们需要保证CylinderTarget蓝图中有使目标圆柱体的状态变化逻辑。打开Blueprints文件夹中的CylinderTarget蓝图,找到事件Hit节点组。当我们的子弹击中目标圆柱体时,这些节点通知圆柱体改换红色材质。为了在圆柱体被击中两次后给圆柱体添加改变圆柱体行为的能力,我们需要为蓝图添加一个检查圆柱体被击中次数的计数器,然后根据状态显示不同的结果。如图2.13所示操作,可以帮助我们完成这个功能。
为了在蓝图中创建多结果的条件逻辑,我们要利用分支(Branch)节点。这里的分支节点使用一个布尔变量作为输入。由于布尔变量的值只有真或假两种情况,分支节点只能产生两种结果。这两种节点可以通过连接的其他节点的输出执行引脚执行,代表真通道和假通道。
创建分支的第一步时定义你的布尔变量代表什么,并且哪些情况会将条件值从假改变为真。我们要创建一个表示目标被击中的初始状态,然后当目标再次被击中时被摧毁。开始创建一个Primed布尔变量吧。
回忆之前在我的蓝图(My Blueprint)面板定义的变量,读者应该看到了之前为速度和方向定义的两个变量。单击加号(+)按钮添加变量,新的变量类型默认为布尔型,所以就不用去修改了,将它重命名为Primed并勾选可编辑使得在外部也能修改变量。最后,编译、保存蓝图。因为我们并不希望目标在一次都没被击中的情况下就处于primed状态,所以我们将变量的默认值设为假(false)(编译保存后默认值的勾选框不勾选)。
既然有了Primed布尔变量,将它从我的蓝图面板拖放到事件图表中,选择获取选项。这个将从变量中获取状态数据(真/假),同时也让我们能够在蓝图中使用它。从Primed节点的输出引脚拖出红色引线到事件图表,搜索并添加分支节点。
最后,我们可以将分支节点添加到事件Hit蓝图节点组。按住[Alt]键单击节点之间的连线,断开类型转换为FirstPersonProjectile节点和Set Material节点的连接。先将Set Material节点暂时拖放到一边,然后连接类型转换为FirstPersonProjectile节点的输出执行引脚和分支节点的输入执行引脚,现在将在目标圆柱体被击中时都调用分支来进行判断。
既然我们已经将分支节点激活,就需要给目标圆柱体一些指令来响应每个状态。我们希望创建的目标可以有这3种状态:默认(Default)、击中一次(Primed)和销毁(Destroyed)。由于销毁一个actor不能执行任何行为,所以在目标销毁后就不能有任何行为发生。因此,我们只需要关注默认、击中一次这两种状态。
首先来完成默认状态。由于这个分支监听当圆柱体在每一次被击中后圆柱体上发生的事件,所以我们希望执行之前添加的改变材质事件。如果目标现在还没有被击中,并且现在被第一次击中,那么我们需要将材质转换为红色。此外,我们也要将Primed布尔变量设为真(True)。通过上述设置,当目标圆柱体再一次被击中时,分支节点把行为传递到其他执行队列,节点的假(False)执行队列如图2.14所示。
将Set Material节点移到分支节点的右边,将分支节点的假(False)输出执行引脚与节点Set Material的输入执行引脚相连。从我的蓝图面板中拖出Primed变量至事件图表,选择设置选项,将Primed变量的输入执行引脚与Set Material节点的输出执行引脚相连,并勾选设置节点的Primed选项。这个操作将保证当目标被第二次被击中时,分支的判断结果为真。
2.3.2 触发声音效果、爆炸、销毁
下一步就是去定义从分支节点的真分支触发的动作序列。在之前早些时候,按照我们的定义,正在摧毁一个目标时希望能够完成3件事:听到爆炸声响、看到爆炸的效果、将目标对象从游戏世界中移除。我们先从经常忽视的,但是非常关键和影响游戏体验的声音元素开始。
我们可以设计的最基本的交互就是:在游戏世界中的某个位置立即播放一个“.wav”声音文件,并且这个功能可以完美地按照我们的意愿运行。从分支节点的真执行引脚拖出引线,搜索Play Sound at Location节点,如图2.15所示。
Play Sound at Location是一个简单的节点,其承载一个声音文件和一个位置输入,并在该位置上播放声音。这个项目中有几个默认的声音文件资源,单击Sound输入引脚旁的选择资源,用户可以从下拉菜单中看到声音文件的列表,找到并选择Explosion01作为爆炸音效。
既然我们已经选择了声音资源,就需要定义在哪里播放这个声音。还记得怎样通过设置目标圆柱体的网格组件设置视野吗?可以使用与之相类似的方法来进行设置,提取出位置信息,然后将位置向量与声音节点直接连起来。然而,事件Hit触发器把这个事情简化了。
事件Hit节点的输出引脚之一为Hit Location。这个引脚包含了被事件Hit节点检测到的游戏世界中两个对象发生碰撞的位置信息。这个位置是产生爆炸效果的绝好位置,从事件Hit节点的Hit Location引脚拖出引线与Play Sound at Location节点的Location引脚相连接。
编译、保存、最小化蓝图后,在UE4编辑器中单击播放按钮进行测试。射击某一个移动目标使它变红,然后接下来的每一次射击都将产生一个爆炸音效。
既然我们的爆炸声音效果已经起作用了,现在开始添加视觉效果并销毁圆柱体,参照图2.16进行设置。
从Play Sound at Location节点的执行引脚拖出引线至事件图表的空白区域,搜索并添加Spawn Emitter at Location节点。
Spawn Emitter at Location节点看起来与Play Sound at Location节点类似,不过它还多了旋转输入引脚和Auto Destroy开关。在Emitter Template下方的下拉菜单中,找到并选择P_Explosion效果。这是FPS模板中自带的另一个标准资源,它将在发射器被添加的地方产生一个令人满意的爆炸效果。
因为我们希望爆炸效果与爆炸音效在同一个位置生成,从事件Hit节点的Hit Location引脚拖出引线与Spawn Emitter at Location节点的Location引脚相连接。爆炸是一个从所有的角度看都一样的三维效果,所以我们可以暂时不管Rotation输入引脚。Auto Destroy开关决定粒子发射器是否能被多次触发,一旦这个粒子效果被创建,我们就将包含这个粒子发射器的actor销毁,所以我们勾选Auto Destroy。
最后,我们希望在爆炸的声音和视觉效果完成后,从游戏世界中移除目标圆柱体。从Spawn Emitter at Location节点的输出执行引脚拖出引线,搜索Destroy Actor节点(为了找到这个节点,你可能需要暂时地将情境关联取消勾选)并添加。这个节点只有一个目标输入,默认为self。由于这个蓝图包含了我们想摧毁的圆柱体对象,并且self就是我们想摧毁的,所以我们不需要对这个节点进行设置。
注意 提示
Emitter(发射器)是一个在特殊位置产生粒子效果的对象。粒子效果收集了很多小的对象,将它们结合起来创建液体、气体或其他不能触摸的效果,比如水的冲击、爆炸或光束。
扩展整个事件Hit节点序列的注释,并且更新上面的文本描述,写清楚这个节点组完成了哪些功能,如图2.17所示。
当你完成了注释的添加,请编译、保存,最小化蓝图后,在UE4编辑器中单击播放按钮进行测试。当你使用枪发射子弹击中目标圆柱体两次后,将看到爆炸效果并听到爆炸音效。