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

85 篇文章 11 订阅

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

之前一直遇到发射物的体积过大会在发射时,和地面产生交互,我们可以调整小一些,然后为了防止它和自身产生交互事件。我们可以实现它在生成后,不会触发相关事件,而是在一定时间后。
对于这种通用的事件,我推荐创建一个蓝图父类进行设置
在这里插入图片描述
创建一个基础蓝图类,命名为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个敌人,然后一直丢石头,帧率一直维持在一百帧左右,证明没有内存泄露的问题
在这里插入图片描述
这种方式属于黑盒测试的方式,将一个效果多次运行来检查是否有一些不正常的点。但这也是很直观的方式用于检测。

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值