我们现在已经有了四个敌人角色,接下来,处理一下在战斗中遇到的问题。
处理角色死亡后还会攻击的问题
因为我们有角色溶解的效果,角色在死亡以后的5秒钟才会被销毁掉。所以在这五秒钟之内,角色其实还是会攻击。主要时因为AI行为树不知道角色已经死亡,所以,我们需要在行为树里增加对角色死亡的判断。
我们在黑板增加一个黑板键,命名为Dead
接下来,我们打开代码编辑器,在角色死亡时,将黑板键设置为true
void ARPGEnemy::Die()
{
SetLifeSpan(LifeSpan);
if(RPGAIController) RPGAIController->GetBlackboardComponent()->SetValueAsBool(FName("Dead"), true); //设置死亡,停止AI行为树
Super::Die();
}
有了黑板键,我们在AI行为树中增加一个装饰器,用于判断后续逻辑是否需要执行
在设置这里,判断Dead黑板键,如果已被设置,将终止后续的所有逻辑操作
碰撞问题
关于碰撞,这里在设置一下,因为移动碰撞我们使用的角色基类内置的胶囊体组件。鼠标选中需要使用角色身上的碰撞进行查询,所以,我们将其设置了开,但是,因为身体时包裹在胶囊体组件里面,所以,我们不需要它触发和技能的检测,这个交给胶囊体组件即可。
所以,我们最终的设置为
胶囊体组件:需要开启重叠事件,用于接受投掷物的碰撞检测,检测响应关闭,用于防止被鼠标拾取到和阻挡相机将相机拉进,还有和火球的重叠需要设置为重叠
网格体碰撞:主要是为了能够被鼠标选中,让玩家攻击,所以,我们需要将碰撞设置为可以查询,并且将通道Visibility设置为阻挡
武器不需要碰撞,只用作展示,所以我们将其设置了没有碰撞
优化敌人的音效
现在我们敌人还没有移动声效,我们接下来增加敌人的脚步声,这个脚步声,我们直接在动画里面添加,这样混合空间进行混合移动时,就能够触发对应的音效。
我们打开移动文件,在动画脚落地的帧增加一个播放音效的通知
然后设置音效即可
接下来,我们设置一下战士攻击时的音效,由于攻击通常会从多个攻击音效中随机一个使用,这里设置里通用模版,从设置的数组中随机一个音频播放,并随机音高,输出的还是立体声。
设置立体声这里需要选择MetaSound设置
在细节这里设置输出格式
我们选择输入的变量
在细节这里添加音频
选择内容浏览器,打开一个新的资源管理器
打开目录
选中拖拽到数组中
打开攻击的蒙太奇,将音效添加进去
添加粒子特效
我们将实现角色冒血的特效,需要在每个角色身上设置,那么在角色基类上增加一个设置Niargra粒子特效的配置项。
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UNiagaraSystem* BloodEffect; //受伤特效
然后我们在战斗接口增加一个获取受伤特效的函数,用于技能攻击时,集中目标角色后,可以通过目标角色的受伤特效显示。
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
UNiagaraSystem* GetBloodEffect(); //获取角色的受伤特效
然后,我们在角色基础类里面覆写它
virtual UNiagaraSystem* GetBloodEffect_Implementation() override;
并在实现里返回配置项
UNiagaraSystem* ARPGCharacter::GetBloodEffect_Implementation()
{
return BloodEffect;
}
设置和获取受伤特效的代码就完成了。后续我们可以在技能蓝图里面获取和设置。
然后,我们想给敌人技能增加集中声效,在技能设置的结构体里面增加一个音效设置
//蒙太奇动画和标签以及骨骼位置的映射,用于攻击技能获取和设置攻击范围
USTRUCT(BlueprintType)
struct FTaggedMontage
{
GENERATED_BODY()
//使用的蒙太奇
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
UAnimMontage* Montage = nullptr;
//对应的标签
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FGameplayTag MontageTag;
//攻击时的触发伤害的骨骼插槽
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FName CombatTipSocketName; //设置技能释放的位置
//攻击时的触发音效
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
USoundBase* ImpactSound = nullptr;
};
编辑代码,打开UE,在敌人蓝图基类里面设置通用的受伤特效
接下来设置技能击中的音效,我们先创建一个混合音效
然后设置给技能
接下来在敌人的近战攻击中实现逻辑,我们首先增加一个局部变量,用于获取释放击中了敌人。
在触发技能时,设置为false,因为它对一个角色只存在一个,并且不会销毁,所以,我们要保证没有击中敌人时,这个值为false
然后在最后,应用伤害后面设置为true,代表已经击中了敌人
接下来,就是在角色身上播放一个击中特效
在数组角色循环完成后,如果布尔值变为了true,代表击中了敌人,那么,我们将播放一个音效,也就是技能击中的音效
然后运行查看是否实现了对应的效果