十九、火球术(GA_PlayerSkillFireball)


如果理解了近战攻击技能,那么火球术也很容易理解。
主要区别在于,GameAbility中的task接收到montage发送的event之后,不再是直接调用ApplyEffectContainer,而是调用MakeEffectContainerSpec。二者的区别在于,前者生成EffectSpec后,马上应用效果,而后者则只生成EffectSpec(会capture此时的角色属性)。
GA_SpawnProjectileBase

调用MakeEffectContainerSpec之后,生成一个火球飞向目标。

GA_SpawnProjectileBase

当火球碰撞到目标后:

BP_AbilityProjectileBase

这两个函数都在了RPGBlueprintLibrary.h/cpp中,这在code部分没有提到,这里稍微补充一下。


FRPGGameplayEffectContainerSpec URPGBlueprintLibrary::AddTargetsToEffectContainerSpec(const FRPGGameplayEffectContainerSpec& ContainerSpec, const TArray& HitResults, const TArray& TargetActors)
{
    FRPGGameplayEffectContainerSpec NewSpec = ContainerSpec;
    NewSpec.AddTargets(HitResults, TargetActors);
    return NewSpec;
}

TArray URPGBlueprintLibrary::ApplyExternalEffectContainerSpec(const FRPGGameplayEffectContainerSpec& ContainerSpec)
{
    TArray 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 Data : ContainerSpec.TargetData.Data)
            {
                AllEffects.Append(Data->ApplyGameplayEffectSpec(*SpecHandle.Data.Get()));
            }
        }
    }
    return AllEffects;
}

注意函数ApplyGameplayEffectSpec,gameplay effect是在此时才真正生效,改变角色的属性值。
和之前的ApplyEffectContainer一样,应用effect之后会返回 FActiveGameplayEffectHandle类,给予玩家对该激活effect的引用。

你可能感兴趣的:(十九、火球术(GA_PlayerSkillFireball))