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