73. UE5 RPG 优化投射物以及敌人生成

解决发射物会与地面产生交互的问题

之前一直遇到发射物的体积过大会在发射时,和地面产生交互,我们可以调整小一些,然后为了防止它和自身产生交互事件。我们可以实现它在生成后,不会触发相关事件,而是在一定时间后。
对于这种通用的事件,我推荐创建一个蓝图父类进行设置
在这里插入图片描述
创建一个基础蓝图类,命名为BP_Projectile
在这里插入图片描述

默认碰撞球体设置为无碰撞
在这里插入图片描述
球体因为是私有属性,我们需要在代码中将其设置为可以在蓝图获取,或者将其转移成保护性参数

	//碰撞球UPROPERTY(VisibleAnywhere, BlueprintReadOnly, meta=(AllowPrivateAccess = "true"))TObjectPtr<USphereComponent> Sphere;

然后在事件开始时,延迟一定时间,启用查询功能,并进行debug
在这里插入图片描述
接着在之前创建的投掷物里面,类设置,将其父类修改掉
在这里插入图片描述
接着运行,会发现,在开启后,它会在开启碰撞后,渲染了一个球体
在这里插入图片描述
如果需要设置不同的延迟时间,我们可以将延迟时间设置为变量
在这里插入图片描述
效果完成,我们可以将debug节点删除掉了,延迟节点获取最好转为判断是否有效Get
在这里插入图片描述

敌人生成效果

在召唤师召唤他的仆从时,现在是直接出现的,在感官上来说,有些粗糙,我们需要想办法看上去合理一些。
有些方式是在角色外面先播放粒子特效,或者给材质制作一些一些效果,在这里,我们使用一种新的方式,使用tween补间实现调整角色缩放来实现对应的效果。
我们打开敌人的基类,事件开始运行时,创建一个时间轴
在这里插入图片描述
双击进入时间轴,添加一个浮点数值
在这里插入图片描述
然后添加四个关键帧
在这里插入图片描述
将曲线修改一个合理的效果
在这里插入图片描述
然后将后面的三个值修改成1
在这里插入图片描述
退出时间轴,创建一个Vector
在这里插入图片描述
使用时间轴的数值去创建vector向量
在这里插入图片描述
然后使用SetRelativeScale3D来修改角色模型的缩放
在这里插入图片描述
然后在模型生成的时候,会发现喜庆的一幕
在这里插入图片描述

给投掷物增加角度修改

我们之前设置的石头攻击是带有重力效果的,就是在将石头投掷出去,它会模拟真实的重力效果,会在某些时候无法击中目标,在现实中,我们投掷石头时,会默认将投掷角度向上提升,实现这个效果,我们需要能够在生成投掷物的时候,可以选择设置它的投掷角度偏移。
我们在生成投掷物的技能基类里面,在函数上新增可以修改投掷角度的参数

	UFUNCTION(BlueprintCallable, Category="Projectile")void SpawnProjectile(const FVector& ProjectileTargetLocation, const FGameplayTag& SocketTag, const FName SocketName, const bool bOverridePitch = false, const float PitchOverride = 0.f);

在cpp里面去实现使用此参数

void UProjectileSpell::SpawnProjectile(const FVector& ProjectileTargetLocation, const FGameplayTag& SocketTag, const FName SocketName, const bool bOverridePitch, const float PitchOverride)
{const bool bIsServer = GetAvatarActorFromActorInfo()->HasAuthority(); //判断此函数是否在服务器运行if (!bIsServer) return;if (ICombatInterface* CombatInterface = Cast<ICombatInterface>(GetAvatarActorFromActorInfo())){const FVector SocketLocation = ICombatInterface::Execute_GetCombatSocketLocationByTag(GetAvatarActorFromActorInfo(), SocketTag, SocketName);FRotator Rotation = (ProjectileTargetLocation - SocketLocation).Rotation(); //将方向转为旋转if(bOverridePitch){Rotation.Pitch = PitchOverride; //覆写发射角度}FTransform SpawnTransform;SpawnTransform.SetLocation(SocketLocation);SpawnTransform.SetRotation(Rotation.Quaternion());

接着编译打开UE,我们选中OverridePitch,将其设置为true,函数内运行时将会使用PitchOverride覆写发射角度的Pitch
在这里插入图片描述
然后运行查看,不但石头角度变了,连火球也提升了,这是因为敌人的火球生成蓝图也是继承的石头的蓝图的。
在这里插入图片描述
为了解决火球网上飞的问题,我们将这两个参数设置为变量
在这里插入图片描述
在敌人的火球生成技能蓝图里面,修改配置项,将需要覆写Pitch关闭
在这里插入图片描述
然后敌人的火球术就正常了
在这里插入图片描述

检查内存泄露的问题

接下来,我们检查一下内存泄露的问题,主要是将怀疑的资产在场景内放置多个,然后运行查看。
我们将投掷石块的小恶魔在场景内多放置几个。
在这里插入图片描述
然后点击左上角按钮,显示帧率
在这里插入图片描述
运行游戏,让游戏跑一会,你会发现帧率在渐渐的降低,从一百多降低到几十,如果继续运行下去,相信能够降低到个位数
在这里插入图片描述
首先排除是不是由于投掷的石块过多的问题,我们在播放蒙太奇之前打印一下
在这里插入图片描述
然后在生成石块后面打印一个数据,查看是否能够实现一对一
在这里插入图片描述
在场景里面就留一个敌人,运行测试,发现没有问题,每次都是只投掷一颗。
在这里插入图片描述
如果出现这种问题,我们可以将激活次数修改成,只触发一次,保证每次只能触发一次
在这里插入图片描述
这里没问题,我们再查看一下粒子,发现粒子的状态这里有一些问题,在粒子播放结束后,生成的粒子没有被销毁
在这里插入图片描述
如果不是一直持续的粒子,我们需要将Kill Particles When Lifetime Has Elapsed(在生命周期结束时销毁粒子)勾选
在这里插入图片描述
接着再继续测试,我们在场景内添加了将近30个敌人,然后一直丢石头,帧率一直维持在一百帧左右,证明没有内存泄露的问题
在这里插入图片描述
这种方式属于黑盒测试的方式,将一个效果多次运行来检查是否有一些不正常的点。但这也是很直观的方式用于检测。

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

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

相关文章

【STM32--Cortex-M3】

STM32-Cortex-M3 ■ Cortex-M3 处理器内核到基于Cortex-M3的MCU■ ARM的各种架构版本■ 指令集■ Cortex-M3简介■ Cortex-M3寄存器组■ Cortex-M3■ Cortex-M3■ Cortex-M3 ■ Cortex-M3 处理器内核到基于Cortex-M3的MCU Cortex-M3处理器内核是单片机的中央处理单元&#xff…

WordPress简单好看的线报主题模板源码

安装说明 到WordPress管理后台中的「外观」-「主题」中点击「添加」&#xff0c;选择baolog的主题包进行上传安装并启用即可。 提示&#xff1a;为了防止主题不兼容&#xff0c;请在安装主题前进行数据备份&#xff0c;防止数据字段重复覆盖等情况发生。 源码截图 源码下载 …

python实训day1

1、 dd2 dict(id101, name小明, age23, score[90, 67, 98]) print(dd2) print() print(dd2.id ->, dd2.get(id)) # 101 print(dd2.age ->, dd2.get(age)) # 23 print() """字典数据由三部分组成&#xff1a;1、键集2、值集&#xff1b;3、元素集&…

三种方式实现人车流统计(yolov5+opencv+deepsort+bytetrack+iou)

一、运行环境 1、项目运行环境如下 2、CPU配置 3、GPU配置 如果没有GPU yolov5目标检测时间会比较久 二、编程语言与使用库版本 项目编程语言使用c++,使用的第三方库,onnxruntime-linux-x64-1.12.1,opencv-4.6.0 opencv 官方地址Releases - OpenCV opencv github地址ht…

使用Redis优化Java应用的性能

使用Redis优化Java应用的性能 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨如何使用Redis优化Java应用的性能。Redis是一种开源的内存数据结构…

【面试】http

一、定义 HTTP&#xff08;超文本传输协议&#xff09;&#xff0c;是一种用于分布式、协作式、超媒体信息系统的应用层协议&#xff0c;它是万维网数据通信的基础。主要特点是无状态&#xff08;服务器不会保存之前请求的状态&#xff09;、无连接&#xff08;服务器处理完请…

探索 C# 中的 LINQ:语法和类型

LINQ&#xff08;语言集成查询&#xff09;是 C# 中引入的一项功能&#xff0c;它提供了一种统一的方式来查询来自不同类型数据源&#xff08;如集合、数组、XML、数据库等&#xff09;的数据。LINQ 允许开发人员直接在 C# 代码中编写查询&#xff0c;从而更轻松地操作和转换数…

http发展史(http0.9、http1.0、http1.1、http/2、http/3)详解

文章目录 HTTP/0.9HTTP/1.0HTTP/1.1队头阻塞&#xff08;Head-of-Line Blocking&#xff09;1. TCP 层的队头阻塞2. HTTP/1.1 的队头阻塞 HTTP/2HTTP/3 HTTP/0.9 发布时间&#xff1a;1991年 特点&#xff1a; 只支持 GET 方法没有 HTTP 头部响应中只有 HTML 内容&#xff0…

七、yolov8图像标注和模型训练(目标检测)

环境配置方法&#xff1a;点这里 环境配置完毕后&#xff0c;需要进行标注工作和训练任务&#xff0c;以下分两个部分进行。 图片标注 1、按照以下的格式&#xff0c;将图片放入images中。&#xff08;不限制文件夹路径&#xff09; 2、然后下载labelme标注工具&#xff0…

循环赛日程表

描述 n 2 ^ k个选手 每个选手必须与其他n-1个选手各赛一次每个选手一天赛一次比赛打n-1天 思路 k 3时的解 我们先进行假设&#xff1a;每个选手第一天和自己比&#xff0c;然后分解成4个子问题&#xff1a; (1)14号的第14天&#xff0c;对手1~4号; (2)14号的第58天&a…

VS编译器字体颜色设置

默认颜色不好看&#xff0c;颜色之间代码各个关系之间没有很强关联性所以要设置字体颜色 颜色一步到位版本&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a;One dark Pro 第四步&#xff1a; 等待安装完后重启VS 点击Modify&#xff0c;一段时间结束后选…

IDEA 学习之 打开一个 MAVEN 工程

目录 1. 单体工程2. 多 module 工程3. 多个多 module 工程3.1. 重复 1 步骤3.2. 添加其他多 module 工程 1. 单体工程 2. 多 module 工程 3. 多个多 module 工程 3.1. 重复 1 步骤 3.2. 添加其他多 module 工程

django学习入门系列之第三点《CSS基础样式介绍2》

文章目录 文字对齐方式外边距内边距往期回顾 文字对齐方式 水平对齐方式 text-align: center;垂直对齐方式 /* 注意&#xff0c;这个只能是一行来居中 */ line-height:/*长度*/ ;样例 <!DOCTYPE html> <html lang"en"> <head><meta charset…

docker 环境部署

1.Redis部署 用docker拉取redis镜像 docker pull redis 用docker查看拉取的镜像版本号&#xff0c;这里查到的是 6.2.6 版本 docker inspect redis 通过wget指令下载对应版本的tar包&#xff0c;下载完成后解压 wget https://download.redis.io/releases/redis-6.2.6.tar.gz …

【2023年全国青少年信息素养大赛智能算法挑战赛复赛真题卷】

目录 2023全国青少年信息素养大赛智能算法挑战赛初中组复赛真题 2023全国⻘少年信息素养⼤赛智能算法挑战复赛⼩学组真题 2023全国青少年信息素养大赛智能算法挑战赛初中组复赛真题 1. 修复机器人的对话词库错误 【题目描述】 基于人工智能技术的智能陪伴机器人的语言词库被…

集合注意事项

目录 我们为什么要用到集合中的迭代器 List实现类的循环遍历 Set集合 HashSet TreeSet Map Hashmap Treemap Hashtable map的遍历方式 Collections的一些静态方法 我们为什么要用到集合中的迭代器 List实现类的循环遍历 如图我们对arraylist中加入了三个相同的“a”…

多路h265监控录放开发-(8)通过XCameraWIget类拖拽实现指定播放rtsp和窗口

首先修改xviewer的构造函数&#xff0c;把创建QWiget对象改为XCameraWiget对象&#xff0c;执行XCameraWiget类的构造函数 xcamera_widget.h #pragma once #include <QWidget> class XCameraWidget :public QWidget {Q_OBJECTpublic:XCameraWidget(QWidget* p nullptr)…

第一百一十八节 Java面向对象设计 - Java接口

Java面向对象设计 - Java接口 什么是接口&#xff1f; Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前&#xff0c;一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。 接口通过抽象概念定义不相关类之间…

网络安全:Web 安全 面试题.(SQL注入)

网络安全&#xff1a;Web 安全 面试题.&#xff08;SQL注入&#xff09; 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面&#xff1a; &#xff08;1&#xff09;基础知识:包括网络基础知识、操作系…

BGP路由反射器实验

实验内容: 通过本实验验证bgp路由反射器的规则 1. 从client收到的路由更新,反射到non-client和client,同时发送给EBGP邻居 2. 从non-client收到的路由更新,只反射到client,同时