当前位置: 首页 > news >正文

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
在这里插入图片描述

相关文章:

  • 使用外部事件检测接入 CDH 大数据管理平台告警
  • 能不能解释一下 ,什么是React 的错误边界?
  • K8S学习之基础四十三:k8s中部署elasticsearch
  • hexo+butterfly搭建博客网站总结篇
  • 【大模型基础_毛玉仁】3.5 Prompt相关应用
  • 常考计算机操作系统面试习题(三下)
  • Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
  • OSASIS(One-Shot Structure-Aware Stylized Image Synthesis)
  • C++进阶——封装红黑树实现map和set
  • 头部姿态估计(Head Pose Estimation)领域,有许多开源工具和库可供选择,一些常用的工具及其特点
  • ROS melodic 安装 python3 cv_bridge
  • 线程和协程的区别了解
  • C++ Reference:解锁编程新姿势
  • Flutter TextField 从入门到精通:掌握输入框的完整指南
  • 3月22日星期六今日早报简报微语报早读
  • 四层板入门-stm32C8T6最小系统板
  • 2024 浅浅总结
  • Java学习总结-泛型
  • SpringMVC初始化原理剖析和源码跟踪
  • RTD2525BE《HDMI转EDP,DP转EDP》显示器芯片
  • 四川落马厅官周海琦受审,1000多人接受警示教育
  • 上海市委常委会传达学习总书记重要讲话精神,研究张江科学城建设等事项
  • 【社论】用生态环境法典守护生态文明
  • 谁将主导“视觉大脑”?中国AI的下一个超级赛道
  • 第二十届华表奖提名名单公布,张译、王一博、马丽、郭帆等入围
  • 当代视角全新演绎,《风雪夜归人》重归首都剧场