美文网首页
十九、火球术(GA_PlayerSkillFireball)

十九、火球术(GA_PlayerSkillFireball)

作者: 珏_Gray | 来源:发表于2019-06-27 11:45 被阅读0次

    如果理解了近战攻击技能,那么火球术也很容易理解。
    主要区别在于,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<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;
    }
    

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

    相关文章

      网友评论

          本文标题:十九、火球术(GA_PlayerSkillFireball)

          本文链接:https://www.haomeiwen.com/subject/mfmlcctx.html