如果理解了近战攻击技能,那么火球术也很容易理解。
主要区别在于,GameAbility中的task接收到montage发送的event之后,不再是直接调用
ApplyEffectContainer
,而是调用MakeEffectContainerSpec
。二者的区别在于,前者生成EffectSpec后,马上应用效果,而后者则只生成EffectSpec(会capture此时的角色属性)。GA_SpawnProjectileBase
调用MakeEffectContainerSpec
之后,生成一个火球飞向目标。
当火球碰撞到目标后:
这两个函数都在了
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的引用。
网友评论