十九、火球術(shù)(GA_PlayerSkillFireball)


如果理解了近戰(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的引用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容