我的项目的代码结构类似于Aura项目的结构,不过Aura项目是俯视角的项目,而我的是一个第三人称3D视角的项目。
我想要做的是一个挥砍武器击中多人并使他们都受伤的近战攻击效果,其实基本上已经全部实现了,包括挥砍动作、击中肉体播放音效、敌人受击反馈动作和受伤声音、伤害结算。但实际的播放顺序有问题,就是击中肉体的音效到了最后才播放,而敌人受击反馈和伤害结算到了前面去了。我的实现是这样的:
首先是GameplayAbility蓝图:

首先进行挥砍动作没问题吧,然后就是设置武器是否启用碰撞:

`
void AThreeDMobaCharacter::SetIsAttacking_Implementation(bool IsAttacking)
{
if (IsValid(Weapon))
{
IsAttacking ? Weapon->SetCollisionEnabled(ECollisionEnabled::QueryOnly) : Weapon->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}
}
武器碰撞之后拿到击中的Actor以及伤害结算:
UFUNCTION(Server, Reliable)
void OnOverlap(
UPrimitiveComponent* OverlappedComponent,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex,
bool bFromSweep,
const FHitResult& SweepResult
);
UPROPERTY(BlueprintReadOnly)
FHitResult WeaponHitResult;
void UWeaponMeshComponent::OnOverlap_Implementation(
UPrimitiveComponent* OverlappedComponent,
AActor* OtherActor,
UPrimitiveComponent* OtherComp,
int32 OtherBodyIndex,
bool bFromSweep,
const FHitResult& SweepResult
) {
if (IsValidOverlap(OtherActor))
{
WeaponHitResult = SweepResult;
if (UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OtherActor))
{
DamageEffectParams.TargetAbilitySystemComponent = TargetASC;
UTDMAbilitySystemLibrary::ApplyDamageEffect(DamageEffectParams); // 伤害结算
}
}
}`
然后是调用GameplayCue来播放击中肉体的音效:

到这里GameplayAbility蓝图就结束了
GameplayCue的具体实现是:

而伤害结算和受击反馈是在C++中进行的:
`bool UTDMAttributeSet::HandleIncomingDamage(const FEffectProperties& Props)
{
const float LocalIncomingDamage = GetIncomingDamage();
SetIncomingDamage(0.f);
if (LocalIncomingDamage > 0.f)
{
const float NewHealth = GetHealth() - LocalIncomingDamage; // 伤害结算
// UE_LOG(LogTemp, Warning, TEXT("生命值:%f, 最大生命值:%f,受到%f伤害"), GetHealth(), GetMaxHealth(), LocalIncomingDamage);
SetHealth(FMath::Clamp(NewHealth, 0.f, GetMaxHealth()));
const bool bFatal = NewHealth <= 0.f;
if (!bFatal)
{
// 受击反馈
if (Props.TargetCharacter->Implements<UCombatInterface>())
{
FGameplayTagContainer TagContainer;
TagContainer.AddTag(FTDMGameplayTags::Get().Effects_HitReact);
Props.TargetASC->TryActivateAbilitiesByTag(TagContainer);
}
}
return bFatal;
}
return false;
}`
最后是角色蓝图的部分设置截图:

我是个初学者,请教一下大家调整一下顺序……