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

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

相关推荐
会思考的猴子7 小时前
UE5 03-物体碰撞检测
ue5
多方通行87 小时前
UE5材质之HLSL:深度
开发语言·算法·ue5·图形渲染·材质
会思考的猴子7 小时前
UE5 01-给子弹一个跟角色一致的向前的方向的冲量
ue5
一只脚走路的猫1 天前
【UE5.3】笔记6-第一个简单小游戏
笔记·ue5
大二初学生4 天前
UE5(c++)开发日志(2):向日志和屏幕输出信息/将C++类变为蓝图类
ue5
一只脚走路的猫4 天前
【UE5.3】笔记3-静态网格体,BSP
笔记·ue5
多方通行85 天前
UE5蓝图快速实现打开网页与加群
开发语言·ue5·编辑器·ue4·脚本
黑不溜秋的5 天前
UnrealEngine - 从源码编译UE5的步骤
ue5
暮志未晚Webgl5 天前
76. UE5 RPG 实现场景阻挡剔除功能
数码相机·ue5
人才程序员6 天前
UE5的安装与基本操作(一)
c++·游戏·ue5·游戏引擎·游戏程序·蓝图·游戏策划