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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原创首发】开源基于AT32 SIP/VOIP电话

前言 本次为了反馈各位粉丝的关注,特此分享 AT32_VOIP 工程,此功能其实跟我之前发过的《STM32F429的VOIP功能》是一样的,只是用了AT32F437。 其实那个工程是一个比较Demo中的Demo,很多功能和硬件依赖性太大了。后面项目中发现AT…

通俗易懂搞懂@RequestParam 和 @RequestBody

📌 博主简介: 💻 努力学习的 23 级科班生一枚 🚀🏠 博主主页 : 📎 灰阳阳📚 往期回顾 :Session和Cookie我不允许你不懂💬 每日一言: 「流水不争先&#xff0c…

dubbo版本与分组

Dubbo服务中,接口并不能唯一确定一个服务,只有 接口分组版本号 的三元组才能唯一确定一个服务。 当同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景,可使用服务分组来区分不同的实现方式。同时,这些不同实…

RAG现有技术方案

RAG现有技术方案 一、现有技术方案的核心问题 检索质量不足 挑战:传统RAG系统依赖单轮检索,难以应对智能电网的海量异构数据(如传感器读数、控制参数),导致检索结果相关性低、覆盖不全。案例:BM25稀疏检索在处理长文本或专业术语时,易遗漏语义关联;BGE等稠密检索模型对…

redis MISCONF Redis is configured to save RDB snapshots报错解决

直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis

个人学习编程(3-22) leetcode刷题

连续子数组:(难) 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…

希尔排序

希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为 d(增量)。随着算法的进行,d 逐渐减小,最终减为 1,此时整个序列就被排序好了。…

JavaScript基础-DOM事件流

在Web开发过程中,理解和掌握DOM事件流是实现高效交互的关键。DOM事件流描述了当一个事件发生时,它在文档树中的传播路径。了解事件流的概念有助于我们更精确地控制事件处理逻辑,避免不必要的行为,并提升用户体验。本文将深入探讨D…

C语言基础知识07---预编译模块化

目录 预编译指令 1.1 编译流程 1.2 文件包含 1.3 条件编译 1.4 宏定义 1.5 无参宏 1.6 typedef和无参宏的区别 1.7 有参宏 1.8 函数与有参宏的区别 1.9 取消宏定义 #undef 1.10 符合使用 模块化操作 1.1 H文件:固定模版 1.2 C文件:源文件-…

自由学习记录(46)

CG语法的数据类型 // uint : 无符号整数(32位) // int : 有符号整数(32位) // float : 单精度浮点数(32位),通常带后缀 f(如 1.0f) // half : 半精度浮…

Agent:大模型中的智能“函数”

在传统的编程范式中,函数是执行特定任务的基本单元。它们接收输入参数,执行预定义的操作,并返回结果。这种模式在确定性和结构化任务中非常有效,但在处理复杂、开放性和非结构化的任务时,函数的局限性就显现出来了。随…

【数据结构】kmp算法介绍+模板代码

目录 1.kmp算法介绍 2.应用场景 3.KMP与暴力算法比较 4.模板代码 KMP算法是一种高效的字符串匹配算法,用于在文本串中快速查找模式串的所有出现位置。其核心思想是通过预处理模式串,避免在匹配失败时进行不必要的回溯,从而将时间复杂度优…

(自用)yolo算法学习

1.难受中,看了教程过后无从下手啊 2.pycharm专业版成功就好 3.安装包时出先问题 (base) PS G:\pycharm\projects\yolo\yolov5> pip install opencv-python>4.1.1 Requirement already satisfied: opencv-python>4.1.1 in g:\anaconda\app\lib\site-packa…

实用工具-Another Redis Desktop Manager介绍

GitHub:https://github.com/qishibo/AnotherRedisDesktopManager/releases Gitee:AnotherRedisDesktopManager 发行版 - Gitee.com Another Redis Desktop Manager 是一款免费的 Redis 可视化管理工具,具有以下特点和功能: 特…

【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Networking】系列。 前言 最近公司的安全部门在审计云环境安全性时经常提到service endpoint(SE)和priavate endpoint(PE)的术语,为此做了一些研究储备。 云…

【汽车开发工具选型指南】Jama Connect® for Automotive解决方案解析

本文来源jamasoftware.com,由Jama Software授权合作伙伴-龙智翻译整理。 Jama Connect for Automotive是什么? Jama Connect for Automotive 旨在为开发团队提供一个统一平台,用于构建安全关键型和网络安全关键型产品。提供满足行业标准和法…

同旺科技USB to SPI 适配器 ---- 指令循环发送功能

所需设备: 内附链接 1、同旺科技USB to SPI 适配器 1、周期性的指令一次输入,即可以使用 “单次发送” 功能,也可以使用 “循环发送” 功能,大大减轻发送指令的编辑效率; 2、 “单次发送” 功能,“发送数据…

分布式中间件:基于 Redis 实现分布式锁

分布式中间件:基于 Redis 实现分布式锁 一、背景引入 在当今的互联网应用中,分布式系统变得越来越常见。在分布式环境下,多个服务实例可能会同时对共享资源进行读写操作,这就很容易引发数据不一致等问题。比如电商系统中的库存扣…

尝试使用Tauri2+Django+React项目(2)

前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做,搞了半天 笔者看到官网,原来可以使用二进制文件,好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…

【006安卓开发方案调研】之大厂APP混合开发方案

基于国内大厂在安卓混合开发领域的实践,以下是主流解决方案及其核心技术实现路径的深度解析: 一、主流混合开发解决方案分类 1. Flutter混合开发体系 架构设计 采用组件化分层架构,原生工程作为宿主,通过MethodChannel与Flutter…