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

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

之前一直遇到发射物的体积过大会在发射时,和地面产生交互,我们可以调整小一些,然后为了防止它和自身产生交互事件。我们可以实现它在生成后,不会触发相关事件,而是在一定时间后。

对于这种通用的事件,我推荐创建一个蓝图父类进行设置

创建一个基础蓝图类,命名为BP_Projectile

默认碰撞球体设置为无碰撞

球体因为是私有属性,我们需要在代码中将其设置为可以在蓝图获取,或者将其转移成保护性参数

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

然后在事件开始时,延迟一定时间,启用查询功能,并进行debug

接着在之前创建的投掷物里面,类设置,将其父类修改掉

接着运行,会发现,在开启后,它会在开启碰撞后,渲染了一个球体

如果需要设置不同的延迟时间,我们可以将延迟时间设置为变量

效果完成,我们可以将debug节点删除掉了,延迟节点获取最好转为判断是否有效Get

敌人生成效果

在召唤师召唤他的仆从时,现在是直接出现的,在感官上来说,有些粗糙,我们需要想办法看上去合理一些。

有些方式是在角色外面先播放粒子特效,或者给材质制作一些一些效果,在这里,我们使用一种新的方式,使用tween补间实现调整角色缩放来实现对应的效果。

我们打开敌人的基类,事件开始运行时,创建一个时间轴

双击进入时间轴,添加一个浮点数值

然后添加四个关键帧

将曲线修改一个合理的效果

然后将后面的三个值修改成1

退出时间轴,创建一个Vector

使用时间轴的数值去创建vector向量

然后使用SetRelativeScale3D来修改角色模型的缩放

然后在模型生成的时候,会发现喜庆的一幕

给投掷物增加角度修改

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

我们在生成投掷物的技能基类里面,在函数上新增可以修改投掷角度的参数

cpp 复制代码
	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里面去实现使用此参数

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个敌人,然后一直丢石头,帧率一直维持在一百帧左右,证明没有内存泄露的问题

这种方式属于黑盒测试的方式,将一个效果多次运行来检查是否有一些不正常的点。但这也是很直观的方式用于检测。

相关推荐
AA陈超2 天前
虚幻引擎UE5专用服务器游戏开发-20 添加基础能力类与连招能力
c++·游戏·ue5·游戏引擎·虚幻
平行云2 天前
如何实现UE程序大并发多集群的像素流部署
unity·ue5·图形渲染
我的巨剑能轻松搅动潮汐2 天前
UE5 C++ 下载视频到本地。//BindLambda用法解析
ue5
不爱说话的采儿4 天前
UE5详细保姆教程(第四章)
笔记·ue5·游戏引擎·课程设计
二DUAN帝4 天前
UE实现路径回放、自动驾驶功能简记
人工智能·websocket·机器学习·ue5·自动驾驶·ue4·cesiumforue
温玉琳琅4 天前
【UE5】虚幻引擎小百科
ue5·游戏引擎·虚幻
远离UE45 天前
UE 材质 变体 概念
ue5·材质
吴梓穆7 天前
UE5 重新编译插件版本
ue5
HECUgauss7 天前
UE5 使用过程遇到的问题
ue5
小白学过的代码7 天前
ue5.4和webul通信
开发语言·javascript·ue5