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

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

相关推荐
电子云与长程纠缠19 小时前
UE5.3中通过编辑器工具创建大纲菜单文件夹
java·ue5·编辑器
DBBH1 天前
UE5 第三人称学习之动画 control rig
ue5
UTwelve1 天前
【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方
ue5·虚幻引擎·着色器·虚幻4
UTwelve1 天前
【UE5】可以实时绘制的体积渲染 【第三章 体积纹理绘制 - 3.绘制体积】
ue5
1204157137 肖哥2 天前
UE5.4 PCG基础节点
ue5
DBBH2 天前
UE5 材质篇 1 如何偏移顶点
ue5·材质
孤客网络科技工作室2 天前
虚幻引擎5(UE5)学习教程
java·学习·ue5
暮志未晚Webgl2 天前
105. UE5 GAS RPG 搭建主菜单
ue5
异次元的归来3 天前
UE5相机系统初探(一)
ue5·游戏引擎·camera
DBBH5 天前
UE5 材质篇 0 创建一个材质
ue5