
如果理解了近戰(zhàn)攻擊技能,那么火球術(shù)也很容易理解。
主要區(qū)別在于,GameAbility中的task接收到montage發(fā)送的event之后,不再是直接調(diào)用
ApplyEffectContainer,而是調(diào)用MakeEffectContainerSpec。二者的區(qū)別在于,前者生成EffectSpec后,馬上應(yīng)用效果,而后者則只生成EffectSpec(會capture此時的角色屬性)。
GA_SpawnProjectileBase
調(diào)用MakeEffectContainerSpec之后,生成一個火球飛向目標。

GA_SpawnProjectileBase
當火球碰撞到目標后:

BP_AbilityProjectileBase
這兩個函數(shù)都在了
RPGBlueprintLibrary.h/cpp中,這在code部分沒有提到,這里稍微補充一下。
FRPGGameplayEffectContainerSpec URPGBlueprintLibrary::AddTargetsToEffectContainerSpec(const FRPGGameplayEffectContainerSpec& ContainerSpec, const TArray<FHitResult>& HitResults, const TArray<AActor*>& TargetActors)
{
FRPGGameplayEffectContainerSpec NewSpec = ContainerSpec;
NewSpec.AddTargets(HitResults, TargetActors);
return NewSpec;
}
TArray<FActiveGameplayEffectHandle> URPGBlueprintLibrary::ApplyExternalEffectContainerSpec(const FRPGGameplayEffectContainerSpec& ContainerSpec)
{
TArray<FActiveGameplayEffectHandle> AllEffects;
// Iterate list of gameplay effects
for (const FGameplayEffectSpecHandle& SpecHandle : ContainerSpec.TargetGameplayEffectSpecs)
{
if (SpecHandle.IsValid())
{
// If effect is valid, iterate list of targets and apply to all
for (TSharedPtr<FGameplayAbilityTargetData> Data : ContainerSpec.TargetData.Data)
{
AllEffects.Append(Data->ApplyGameplayEffectSpec(*SpecHandle.Data.Get()));
}
}
}
return AllEffects;
}
注意函數(shù)ApplyGameplayEffectSpec,gameplay effect是在此時才真正生效,改變角色的屬性值。
和之前的ApplyEffectContainer一樣,應(yīng)用effect之后會返回 FActiveGameplayEffectHandle類,給予玩家對該激活effect的引用。