UE4学习笔记 FPS游戏制作12 添加第二把枪,制作枪的父类,动态生成物体,切换武器
我们添加一个发射器类型的枪
我们目前有了一个Rifle的枪械蓝图,我们在添加Launcher时,需要为他们添加一个父类,将公共方法放到父类里,方法体由子类实现
添加父类
方法1
新建一个Gun的蓝图,Gun继承Actor,然后让Rifle和Launcher继承Gun,这适合一开始就这样做,但是现在我们已经有了Rifle,并且有了实现,会比较麻烦
进入Rifle的蓝图,选择 “文件/重设蓝图父项” 可以为蓝图重新指定父类
方法2
将现有的Rifle蓝图重命名为Gun,然后再创建两个子类,比较快速,且需要修改蓝图的中其他实现(例如Fppshooter中Gun字段的类型)
右键蓝图,可以直接选择创建子类
推荐用方法2创建两个子蓝图,Rifle和Launcher,并为发射器重新指定模型,此时两个枪的逻辑行为仍然是一致的
动态生成枪
打开FPPShooter蓝图,删除ChildAcotr,此时角色网格体上应该为空
打开事件图表,将原来从ChildActor强转Gun改为动态生成一个新的枪
如下修改蓝图
第一个函数节点是“从类生成actor spawn Actor from class”
第二个函数节点是“将Actor附加到组件 attach Actor to Component”
SpawnTranformLocation需要右键选择“分割结构体引脚”
生成第二把枪
生成第二把枪前,先创建一个枪的数组,用来存放所有生成的枪
修改生成后的部分,暂时先不对MyGun赋值,而是将枪加入数组
新建一个CreateGun方法,将生成的逻辑放到这个方法里,注意这个方法需要一个输入参数,参数类型为Gun的Class,而不是实例引用
然后在玩家的事件图表里,调用两次CreateGun,分别选择两种不同的GunClass
**
**
此时运行,游戏将创建两把枪,但是两把枪是重叠在一起的,且不能射击
在createGun的最后追加,隐藏新生成的物体
然后在玩家的事件图表里,追加显示第一把枪
使用索引切换两把枪
首要要制作展示枪的函数
删除Mygun参数,新增CurrentIndex参数表示当前正在使用的枪的索引,新增一个方法GetCurrentGun,返回值为Gun的对象引用,由于不修改数据,可以是一个纯函数
因为删除了MyGunStartFire和EndFire会报错,如下修改,将枪的引用传入
然后修改蓝图
回到FppShooter的事件图表,通过设置CurrentIndex的值(加ingCurrentIndex拖入,选择设置),可以动态的修改要默认展示的枪
换枪动画
制作换枪动画的蒙太奇,注意动画的插槽要和动画混合空间中的插槽一致,否则无法播放蒙太奇
按键切换武器
编写SwitchWeapon脚本,切换不同的枪
新增一个输入按键Q,在角色事件图表里,新增节点,按下Q,执行换枪
解决BUG
现在虽然可以换枪,但是如果玩家按住左键不松,同时按Q换枪,当切回到这把枪时,会发现依然在开火,这是因为没有调用EndFire方法
改进
首先在FppShooter中,切换武器时显式的调用一次EndFire
但这还没玩,由于EndFire中要求销毁枪口火焰,如果玩家从未开火,则会导致空引用错误,所以需要进一步修改Gun的蓝图
在变量中添加一个IsInFire的bool
在StartFire中将IsInFire设为true
在EndFire中根据条件判断是否可以进入销毁,如果可以进入,将isInFire设为false