UrealEngine-5.2.1源码-AbilitySystemComponent.h
解决方案路径:
Plugins/Runtime/GameplayAbilities/Source/GameplayAbilities/Public/AbilitySystemComponent.h:
// Copyright Epic Games, Inc. All Rights Reserved.#pragma once#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Templates/SubclassOf.h"
#include "Engine/NetSerialization.h"
#include "Engine/EngineTypes.h"
#include "Engine/TimerHandle.h"
#include "GameplayTagContainer.h"
#include "AttributeSet.h"
#include "EngineDefines.h"
#include "GameplayPrediction.h"
#include "GameplayCueInterface.h"
#include "GameplayTagAssetInterface.h"
#include "GameplayAbilitySpec.h"
#include "GameplayEffect.h"
#include "GameplayTasksComponent.h"
#include "Abilities/GameplayAbilityRepAnimMontage.h"
#include "Abilities/GameplayAbilityTargetTypes.h"
#include "Abilities/GameplayAbility.h"
#include "AbilitySystemReplicationProxyInterface.h"
#include "Net/Core/PushModel/PushModel.h"#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_2
#include "Abilities/GameplayAbilityTypes.h"
#include "GameplayEffectTypes.h"
#endif#include "AbilitySystemComponent.generated.h"class AGameplayAbilityTargetActor;
class AHUD;
class FDebugDisplayInfo;
class UAnimMontage;
class UCanvas;
class UInputComponent;/** * UAbilitySystemComponent ** 一个用于轻松与AbilitySystem的3个方面进行交互的组件:* * GameplayAbilities(游戏玩法能力):* -提供一种授予/分配可用能力的方式(例如供玩家或AI使用)* -提供实例化能力的管理(必须有东西持有它们)* -提供复制功能* -能力状态必须始终在UGameplayAbility本身上复制,但UAbilitySystemComponent为能力的实际激活提供RPC复制* * GameplayEffects(游戏玩法效果):* -提供一个FActiveGameplayEffectsContainer用于持有活跃的GameplayEffects* -提供将GameplayEffects应用于目标或自身的方法* -提供用于查询FActiveGameplayEffectsContainers中信息的包装器(持续时间、强度等)* -提供清除/移除GameplayEffects的方法* * GameplayAttributes(游戏玩法属性)* -提供分配和初始化属性集的方法* -提供获取AttributeSets的方法* *//** 当目标选择Actor拒绝目标确认时调用 */
DECLARE_MULTICAST_DELEGATE_OneParam(FTargetingRejectedConfirmation, int32);/** 当能力激活失败时调用,传递失败的能力和一个说明原因的标签 */
DECLARE_MULTICAST_DELEGATE_TwoParams(FAbilityFailedDelegate, const UGameplayAbility*, const FGameplayTagContainer&);/** 当能力结束时调用 */
DECLARE_MULTICAST_DELEGATE_OneParam(FAbilityEnded, UGameplayAbility*);/** 通知相关方能力规格已被修改 */
DECLARE_MULTICAST_DELEGATE_OneParam(FAbilitySpecDirtied, const FGameplayAbilitySpec&);/** 当GameplayEffectSpec因免疫而被ActiveGameplayEffect阻止时通知 */
DECLARE_MULTICAST_DELEGATE_TwoParams(FImmunityBlockGE, const FGameplayEffectSpec& /*BlockedSpec*/, const FActiveGameplayEffect* /*ImmunityGameplayEffect*/);/** 游戏效果将如何复制到客户端 */
UENUM()
enum class EGameplayEffectReplicationMode : uint8
{/** 仅复制最少的游戏效果信息。注意:这不适用于拥有的AbilitySystemComponents(请改用Mixed)。 */Minimal,/** 仅向模拟代理复制最少的游戏效果信息,但向所有者和自主代理复制完整信息 */Mixed,/** 向所有客户端复制完整的游戏效果信息 */Full,
};/** 用于与GameplayAbilities系统交互的核心ActorComponent */
UCLASS(ClassGroup=AbilitySystem, hidecategories=(Object,LOD,Lighting,Transform,Sockets,TextureStreaming), editinlinenew, meta=(BlueprintSpawnableComponent))
class GAMEPLAYABILITIES_API UAbilitySystemComponent : public UGameplayTasksComponent, public IGameplayTagAssetInterface, public IAbilitySystemReplicationProxyInterface
{GENERATED_UCLASS_BODY()/** 用于注册能力按键输入的回调 */DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAbilityAbilityKey, /*UGameplayAbility*, Ability, */int32, InputID);/** 用于注册确认/取消输入的回调 */DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAbilityConfirmOrCancel);/** 效果被应用时的委托 */DECLARE_MULTICAST_DELEGATE_ThreeParams(FOnGameplayEffectAppliedDelegate, UAbilitySystemComponent*, const FGameplayEffectSpec&, FActiveGameplayEffectHandle);// ----------------------------------------------------------------------------------------------------------------// 属性// ----------------------------------------------------------------------------------------------------------------/** 查找现有的属性集 */template <class T >const T* GetSet() const{return (T*)GetAttributeSubobject(T::StaticClass());}/** 查找现有的属性集。如果不存在则断言。 */template <class T >const T* GetSetChecked() const{return (T*)GetAttributeSubobjectChecked(T::StaticClass());}/** 添加一个新的属性集(初始化为默认值) */template <class T >const T* AddSet(){return (T*)GetOrCreateAttributeSubobject(T::StaticClass());}/** * 手动添加一个新的属性集,作为此能力系统组件的子对象。* 此组件的所有子对象在初始化期间会自动添加。*/template <class T>const T* AddAttributeSetSubobject(T* Subobject){AddSpawnedAttribute(Subobject);return Subobject;}/*** 此能力系统组件是否具有此属性?* * @param Attribute 要从中检索目标标签的游戏效果句柄* * @return 如果Attribute有效且此能力系统组件包含一个包含Attribute的属性集,则返回true。否则返回false。*/bool HasAttributeSetForAttribute(FGameplayAttribute Attribute) const;/** 从数据表初始化起始属性。支持不佳,使用带有曲线表引用的游戏效果可能是更好的解决方案 */const UAttributeSet* InitStats(TSubclassOf<class UAttributeSet> Attributes, const UDataTable* DataTable);UFUNCTION(BlueprintCallable, Category="Skills", meta=(DisplayName="InitStats", ScriptName="InitStats"))void K2_InitStats(TSubclassOf<class UAttributeSet> Attributes, const UDataTable* DataTable);/** 返回此能力系统组件的所有属性列表 */UFUNCTION(BlueprintPure, Category="Gameplay Attributes")void GetAllAttributes(TArray<FGameplayAttribute>& OutAttributes);/*** 返回属性集实例的引用(如果此组件中存在)** @param AttributeSetClass 要查找的属性集类型* @param bFound 如果属性集实例存在则设置为true*/UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Gameplay Attributes")const UAttributeSet* GetAttributeSet(TSubclassOf<UAttributeSet> AttributeSetClass) const;/*** 返回给定游戏属性的当前值,如果未找到该属性则返回零。* 注意:这不会考虑预测的游戏效果修饰符,因此客户端的值可能并不总是准确的。** @param Attribute 要查询的游戏属性* @param bFound 如果属性在此组件中存在则设置为true*/UFUNCTION(BlueprintPure, Category = "Gameplay Attributes")float GetGameplayAttributeValue(FGameplayAttribute Attribute, bool& bFound) const;UPROPERTY(EditAnywhere, Category="AttributeTest")TArray<FAttributeDefaults> DefaultStartingData;/** 移除所有当前属性集并注册传入数组中的属性集。注意,在可能的情况下,最好直接调用Add/Remove。 */void SetSpawnedAttributes(const TArray<UAttributeSet*>& NewAttributeSet);UE_DEPRECATED(5.1, "此函数将变为私有。请改用 Add/Remove SpawnedAttributes")TArray<UAttributeSet*>& GetSpawnedAttributes_Mutable();/** 在不打算修改列表时访问生成的属性列表。 */const TArray<UAttributeSet*>& GetSpawnedAttributes() const;/** 添加一个新的属性集 */void AddSpawnedAttribute(UAttributeSet* Attribute);/** 移除一个现有的属性集 */void RemoveSpawnedAttribute(UAttributeSet* Attribute);/** 移除所有属性集 */void RemoveAllSpawnedAttributes();/** 此组件将在其中播放蒙太奇的链接动画实例。对主动画实例使用 NAME_None。 */UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Skills")FName AffectedAnimInstanceTag; /** 设置属性的基础值。不清除现有的活动修饰符,它们将对新的基础值起作用。 */void SetNumericAttributeBase(const FGameplayAttribute &Attribute, float NewBaseValue);/** 获取属性的基础值。即,没有状态修饰符的属性值 */float GetNumericAttributeBase(const FGameplayAttribute &Attribute) const;/*** 对给定属性应用就地修改。这会正确更新属性的聚合器,更新属性集属性,* 并调用OnDirty回调。* 这不会在属性集上调用Pre/PostGameplayEffectExecute。这不进行标签检查、应用要求、免疫等。* 不会创建或应用GameplayEffectSpec!* 这应仅在应用真实的GameplayEffectSpec太慢或不可能的情况下使用。*/void ApplyModToAttribute(const FGameplayAttribute &Attribute, TEnumAsByte<EGameplayModOp::Type> ModifierOp, float ModifierMagnitude);/*** 对给定属性应用就地修改。与ApplyModToAttribute不同,此函数将在客户端或服务器上运行。* 这可能会导致与预测相关的问题,并且无法正确回滚。*/void ApplyModToAttributeUnsafe(const FGameplayAttribute &Attribute, TEnumAsByte<EGameplayModOp::Type> ModifierOp, float ModifierMagnitude);/** 返回属性的当前(最终)值 */float GetNumericAttribute(const FGameplayAttribute &Attribute) const;float GetNumericAttributeChecked(const FGameplayAttribute &Attribute) const;/** 返回应用标签过滤器后的属性值 */float GetFilteredAttributeValue(const FGameplayAttribute& Attribute, const FGameplayTagRequirements& SourceTags, const FGameplayTagContainer& TargetTags, const TArray<FActiveGameplayEffectHandle>& HandlesToIgnore = TArray<FActiveGameplayEffectHandle>());// ----------------------------------------------------------------------------------------------------------------// 复制// ----------------------------------------------------------------------------------------------------------------/** 强制Avatar Actor更新其复制。对于需要为移动/位置原因进行复制的情况很有用。 */virtual void ForceAvatarReplication();/** 当为true时,我们将不会复制此能力系统组件的活动游戏效果,因此属性和标签 */virtual void SetReplicationMode(EGameplayEffectReplicationMode NewReplicationMode);/** 游戏效果如何被复制 */EGameplayEffectReplicationMode ReplicationMode;/** 如果启用了ReplicationProxyEnabled,复制将通过谁路由(如果返回null,当ReplicationProxyEnabled时,我们将不会复制) */virtual IAbilitySystemReplicationProxyInterface* GetReplicationInterface();/** 当前预测键,使用 FScopedPredictionWindow 设置 */FPredictionKey ScopedPredictionKey;/** 返回应用于任何操作的预测键 */FPredictionKey GetPredictionKeyForNewAction() const{return ScopedPredictionKey.IsValidForMorePrediction() ? ScopedPredictionKey : FPredictionKey();}/** 我们是否有有效的预测键来进行更多的预测操作 */bool CanPredict() const{return ScopedPredictionKey.IsValidForMorePrediction();}/** 如果此操作在服务器上运行或具有有效的预测键,则返回true */bool HasAuthorityOrPredictionKey(const FGameplayAbilityActivationInfo* ActivationInfo) const;/** 如果此组件的Actor具有权限,则返回true */virtual bool IsOwnerActorAuthoritative() const;/** 如果此组件应记录蒙太奇复制信息,则返回true */virtual bool ShouldRecordMontageReplication() const;/** 将能力已结束/取消的信息复制到客户端或服务器(视情况而定) */virtual void ReplicateEndOrCancelAbility(FGameplayAbilitySpecHandle Handle, FGameplayAbilityActivationInfo ActivationInfo, UGameplayAbility* Ability, bool bWasCanceled);/** 强制取消能力且不将此复制到另一端。当能力被另一端取消时应调用此函数 */virtual void ForceCancelAbilityDueToReplication(UGameplayAbility* Instance);/** 一个暂时无法激活的待定激活,将在稍后时间点重新检查 */struct FPendingAbilityInfo{bool operator==(const FPendingAbilityInfo& Other) const{// 不要比较事件数据,不允许具有相同键和句柄但不同事件数据的多个激活同时进行return PredictionKey == Other.PredictionKey && Handle == Other.Handle;}/** 需要激活的能力的属性 */FGameplayAbilitySpecHandle Handle;FPredictionKey PredictionKey;FGameplayEventData TriggerEventData;/** 如果此能力已远程激活且需要跟进则为true,如果能力尚未激活则为false */bool bPartiallyActivated;FPendingAbilityInfo(): bPartiallyActivated(false){}};/** 这是在服务器上激活但尚不能在客户端上执行的GameplayAbilities列表。它将在稍后时间点尝试执行这些操作 */TArray<FPendingAbilityInfo> PendingServerActivatedAbilities;// ----------------------------------------------------------------------------------------------------------------// GameplayEffects: 面向其他系统的主要外部API// ----------------------------------------------------------------------------------------------------------------/** 将先前创建的游戏效果规范应用于目标 */UFUNCTION(BlueprintCallable, Category = GameplayEffects, meta = (DisplayName = "ApplyGameplayEffectSpecToTarget", ScriptName = "ApplyGameplayEffectSpecToTarget"))FActiveGameplayEffectHandle BP_ApplyGameplayEffectSpecToTarget(const FGameplayEffectSpecHandle& SpecHandle, UAbilitySystemComponent* Target);virtual FActiveGameplayEffectHandle ApplyGameplayEffectSpecToTarget(const FGameplayEffectSpec& GameplayEffect, UAbilitySystemComponent *Target, FPredictionKey PredictionKey=FPredictionKey());/** 将先前创建的游戏效果规范应用于此组件 */UFUNCTION(BlueprintCallable, Category = GameplayEffects, meta = (DisplayName = "ApplyGameplayEffectSpecToSelf", ScriptName = "ApplyGameplayEffectSpecToSelf"))FActiveGameplayEffectHandle BP_ApplyGameplayEffectSpecToSelf(const FGameplayEffectSpecHandle& SpecHandle);virtual FActiveGameplayEffectHandle ApplyGameplayEffectSpecToSelf(const FGameplayEffectSpec& GameplayEffect, FPredictionKey PredictionKey = FPredictionKey());/** 根据传入的句柄获取FActiveGameplayEffect */const UGameplayEffect* GetGameplayEffectDefForHandle(FActiveGameplayEffectHandle Handle);/** 按句柄移除GameplayEffect。StacksToRemove=-1 将移除所有堆栈。 */UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = GameplayEffects)virtual bool RemoveActiveGameplayEffect(FActiveGameplayEffectHandle Handle, int32 StacksToRemove=-1);/** * 移除其后端定义是指定游戏效果类的活动游戏效果* * @param GameplayEffect 要移除的游戏效果类;如果留空则不执行任何操作* @param InstigatorAbilitySystemComponent 如果指定,则仅移除由此发起者能力系统组件应用的游戏效果* @param StacksToRemove 要移除的堆栈数,-1表示移除所有*/UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = GameplayEffects)virtual void RemoveActiveGameplayEffectBySourceEffect(TSubclassOf<UGameplayEffect> GameplayEffect, UAbilitySystemComponent* InstigatorAbilitySystemComponent, int32 StacksToRemove = -1);/** 获取一个准备应用于其他事物的传出GameplayEffectSpec。 */UFUNCTION(BlueprintCallable, Category = GameplayEffects)virtual FGameplayEffectSpecHandle MakeOutgoingSpec(TSubclassOf<UGameplayEffect> GameplayEffectClass, float Level, FGameplayEffectContextHandle Context) const;/** 为此AbilitySystemComponent的所有者创建一个EffectContext */UFUNCTION(BlueprintCallable, Category = GameplayEffects)virtual FGameplayEffectContextHandle MakeEffectContext() const;/*** 获取能力系统组件上指定源效果的数量。对于非堆叠效果,这是所有活动实例的总和。* 对于堆叠效果,这是所有有效堆栈数的总和。如果指定了发起者,则仅计算来自该发起者的效果。* * @param SourceGameplayEffect 要获取数量的效果* @param OptionalInstigatorFilterComponent 如果指定,仅计算由此能力系统组件应用的效果* * @return 指定源效果的数量*/UFUNCTION(BlueprintCallable, BlueprintPure, Category=GameplayEffects)int32 GetGameplayEffectCount(TSubclassOf<UGameplayEffect> SourceGameplayEffect, UAbilitySystemComponent* OptionalInstigatorFilterComponent, bool bEnforceOnGoingCheck = true) const;/*** 获取能力系统组件上指定源效果的数量。对于非堆叠效果,这是所有活动实例的总和。* 对于堆叠效果,这是所有有效堆栈数的总和。如果指定了发起者,则仅计算来自该发起者的效果。* * @param SoftSourceGameplayEffect 要获取数量的效果。如果当前未加载,则数量为0* @param OptionalInstigatorFilterComponent 如果指定,仅计算由此能力系统组件应用的效果* * @return 指定源效果的数量*/UFUNCTION(BlueprintCallable, BlueprintPure, Category = GameplayEffects)int32 GetGameplayEffectCount_IfLoaded(TSoftClassPtr<UGameplayEffect> SoftSourceGameplayEffect, UAbilitySystemComponent* OptionalInstigatorFilterComponent, bool bEnforceOnGoingCheck = true) const;/** 返回通过查询的所有游戏效果的StackCount之和 */int32 GetAggregatedStackCount(const FGameplayEffectQuery& Query) const;/** 这仅存在以便可以连接到多播委托 */void RemoveActiveGameplayEffect_NoReturn(FActiveGameplayEffectHandle Handle, int32 StacksToRemove=-1){RemoveActiveGameplayEffect(Handle, StacksToRemove);}/** 为预测添加的游戏提示调用。需要移除标签计数,并在预测错误时可能调用OnRemove事件 */virtual void OnPredictiveGameplayCueCatchup(FGameplayTag Tag);/** 返回游戏效果的总持续时间 */float GetGameplayEffectDuration(FActiveGameplayEffectHandle Handle) const;/** 当服务器时间通过游戏状态复制时调用,以使我们的冷却计时器与服务器保持同步 */virtual void RecomputeGameplayEffectStartTimes(const float WorldTime, const float ServerWorldTime);/** 返回游戏效果的开始时间和总持续时间 */void GetGameplayEffectStartTimeAndDuration(FActiveGameplayEffectHandle Handle, float& StartEffectTime, float& Duration) const;/** 动态更新活动游戏效果的set-by-caller强度 */UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = GameplayEffects)virtual void UpdateActiveGameplayEffectSetByCallerMagnitude(FActiveGameplayEffectHandle ActiveHandle, UPARAM(meta=(Categories = "SetByCaller"))FGameplayTag SetByCallerTag, float NewValue);/** 动态更新活动游戏效果的多个set-by-caller强度 */UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = GameplayEffects)virtual void UpdateActiveGameplayEffectSetByCallerMagnitudes(FActiveGameplayEffectHandle ActiveHandle, const TMap<FGameplayTag, float>& NewSetByCallerValues);/** 更新已应用游戏效果的等级。意图是这是“无缝的”,并且不像移除/重新应用那样行为 */UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = GameplayEffects)virtual void SetActiveGameplayEffectLevel(FActiveGameplayEffectHandle ActiveHandle, int32 NewLevel);/** 更新已应用游戏效果的等级。意图是这是“无缝的”,并且不像移除/重新应用那样行为 */UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = GameplayEffects)virtual void SetActiveGameplayEffectLevelUsingQuery(FGameplayEffectQuery Query, int32 NewLevel);/*** 原始访问器,询问游戏效果的强度,不一定总是正确的。外部代码(UI等)应如何询问诸如“这个游戏效果修改了我的多少伤害”之类的问题* (很可能我们希望在后端捕获这一点 - 当伤害被应用时,我们可以获得数字如何达到当前状态的完整转储/历史记录。但我们可能仍然需要像下面这样的轮询方法(我的伤害会是多少)*/UFUNCTION(BlueprintCallable, Category = GameplayEffects)float GetGameplayEffectMagnitude(FActiveGameplayEffectHandle Handle, FGameplayAttribute Attribute) const;/** 返回已应用GE的当前堆栈数 */int32 GetCurrentStackCount(FActiveGameplayEffectHandle Handle) const;/** 返回已应用GE的当前堆栈数,但给定由GE授予的能力规格句柄 */int32 GetCurrentStackCount(FGameplayAbilitySpecHandle Handle) const;/** 返回描述活动游戏效果的调试字符串 */FString GetActiveGEDebugString(FActiveGameplayEffectHandle Handle) const;/** 获取授予传入能力的GE的GE句柄 */FActiveGameplayEffectHandle FindActiveGameplayEffectHandle(FGameplayAbilitySpecHandle Handle) const;/** 返回指向实际活动游戏效果结构的常量指针 */const FActiveGameplayEffect* GetActiveGameplayEffect(const FActiveGameplayEffectHandle Handle) const;/** 返回此ASC上的所有活动游戏效果 */const FActiveGameplayEffectsContainer& GetActiveGameplayEffects() const;/** 返回与活动句柄关联的游戏效果CDO的常量指针。 */const UGameplayEffect* GetGameplayEffectCDO(const FActiveGameplayEffectHandle Handle) const;/*** 如果可能,从指定句柄表示的游戏效果规范中获取源标签* * @param Handle 要从中检索源标签的游戏效果句柄* * @return 如果可能,来自句柄表示的游戏效果规范的源标签*/const FGameplayTagContainer* GetGameplayEffectSourceTagsFromHandle(FActiveGameplayEffectHandle Handle) const;/*** 如果可能,从指定句柄表示的游戏效果规范中获取目标标签* * @param Handle 要从中检索目标标签的游戏效果句柄* * @return 如果可能,来自句柄表示的游戏效果规范的目标标签*/const FGameplayTagContainer* GetGameplayEffectTargetTagsFromHandle(FActiveGameplayEffectHandle Handle) const;/*** 使用从组件捕获属性所需的数据填充指定的捕获规范* * @param OutCaptureSpec [OUT] 要用捕获数据填充的捕获规范*/void CaptureAttributeForGameplayEffect(OUT FGameplayEffectAttributeCaptureSpec& OutCaptureSpec);// ----------------------------------------------------------------------------------------------------------------// 回调 / 通知// (这些需要在UObject级别,以便我们可以安全地绑定,而不是绑定到ActiveGameplayEffect/Container级别的原始指针,如果AbilitySystemComponent被销毁则不安全)。// ----------------------------------------------------------------------------------------------------------------/** 当特定属性聚合器值更改时调用,游戏效果在此时刷新其值 */void OnAttributeAggregatorDirty(FAggregator* Aggregator, FGameplayAttribute Attribute, bool FromRecursiveCall=false);/** 当属性强度更改时调用,以将信息转发给依赖的游戏效果 */void OnMagnitudeDependencyChange(FActiveGameplayEffectHandle Handle, const FAggregator* ChangedAggregator);/** 此ASC已成功将GE应用于某物(可能是自身) */void OnGameplayEffectAppliedToTarget(UAbilitySystemComponent* Target, const FGameplayEffectSpec& SpecApplied, FActiveGameplayEffectHandle ActiveHandle);void OnGameplayEffectAppliedToSelf(UAbilitySystemComponent* Source, const FGameplayEffectSpec& SpecApplied, FActiveGameplayEffectHandle ActiveHandle);void OnPeriodicGameplayEffectExecuteOnTarget(UAbilitySystemComponent* Target, const FGameplayEffectSpec& SpecExecuted, FActiveGameplayEffectHandle ActiveHandle);void OnPeriodicGameplayEffectExecuteOnSelf(UAbilitySystemComponent* Source, const FGameplayEffectSpec& SpecExecuted, FActiveGameplayEffectHandle ActiveHandle);/** 当游戏效果的持续时间发生变化时调用 */virtual void OnGameplayEffectDurationChange(struct FActiveGameplayEffect& ActiveEffect);/** 在服务器上当GE应用于自身时调用。这包括即时和基于持续时间的GE。 */FOnGameplayEffectAppliedDelegate OnGameplayEffectAppliedDelegateToSelf;/** 在服务器上当GE应用于其他人时调用。这包括即时和基于持续时间的GE。 */FOnGameplayEffectAppliedDelegate OnGameplayEffectAppliedDelegateToTarget;/** 在客户端和服务器上当添加基于持续时间的GE时调用(例如,即时GE不会触发此事件)。 */FOnGameplayEffectAppliedDelegate OnActiveGameplayEffectAddedDelegateToSelf;/** 在服务器上当周期性GE在自身上执行时调用 */FOnGameplayEffectAppliedDelegate OnPeriodicGameplayEffectExecuteDelegateOnSelf;/** 在服务器上当周期性GE在目标上执行时调用 */FOnGameplayEffectAppliedDelegate OnPeriodicGameplayEffectExecuteDelegateOnTarget;/** 免疫通知支持 */FImmunityBlockGE OnImmunityBlockGameplayEffectDelegate;/** 注册属性值更改时的回调,应被GetGameplayAttributeValueChangeDelegate替换 */FOnGameplayAttributeChange& RegisterGameplayAttributeEvent(FGameplayAttribute Attribute);/** 注册属性值更改时的回调 */FOnGameplayAttributeValueChange& GetGameplayAttributeValueChangeDelegate(FGameplayAttribute Attribute);/** 能力被激活(开始)时的通用回调 */FGenericAbilityDelegate AbilityActivatedCallbacks;/** 能力结束时的回调 */FAbilityEnded AbilityEndedCallbacks;/** 能力结束时的回调,带有额外信息 */FGameplayAbilityEndedDelegate OnAbilityEnded;/** 能力被提交(应用成本/冷却)时的通用回调 */FGenericAbilityDelegate AbilityCommittedCallbacks;/** 当能力激活失败时调用,带有失败原因 */FAbilityFailedDelegate AbilityFailedCallbacks;/** 当能力规格的内部发生更改时调用 */FAbilitySpecDirtied AbilitySpecDirtiedCallbacks;/** 调用上面的通知回调 */virtual void NotifyAbilityCommit(UGameplayAbility* Ability);virtual void NotifyAbilityActivated(const FGameplayAbilitySpecHandle Handle, UGameplayAbility* Ability);virtual void NotifyAbilityFailed(const FGameplayAbilitySpecHandle Handle, UGameplayAbility* Ability, const FGameplayTagContainer& FailureReason);/** 当任何游戏效果被移除时调用 */FOnGivenActiveGameplayEffectRemoved& OnAnyGameplayEffectRemovedDelegate();/** 返回允许绑定到多个游戏效果更改的委托结构 */FActiveGameplayEffectEvents* GetActiveEffectEventSet(FActiveGameplayEffectHandle Handle);FOnActiveGameplayEffectRemoved_Info* OnGameplayEffectRemoved_InfoDelegate(FActiveGameplayEffectHandle Handle);FOnActiveGameplayEffectStackChange* OnGameplayEffectStackChangeDelegate(FActiveGameplayEffectHandle Handle);FOnActiveGameplayEffectTimeChange* OnGameplayEffectTimeChangeDelegate(FActiveGameplayEffectHandle Handle);// ----------------------------------------------------------------------------------------------------------------// 游戏标签操作// 使用 TagCountContainer 实现 IGameplayTagAssetInterface// ----------------------------------------------------------------------------------------------------------------FORCEINLINE bool HasMatchingGameplayTag(FGameplayTag TagToCheck) const override{return GameplayTagCountContainer.HasMatchingGameplayTag(TagToCheck);}FORCEINLINE bool HasAllMatchingGameplayTags(const FGameplayTagContainer& TagContainer) const override{return GameplayTagCountContainer.HasAllMatchingGameplayTags(TagContainer);}FORCEINLINE bool HasAnyMatchingGameplayTags(const FGameplayTagContainer& TagContainer) const override{return GameplayTagCountContainer.HasAnyMatchingGameplayTags(TagContainer);}FORCEINLINE void GetOwnedGameplayTags(FGameplayTagContainer& TagContainer) const override{TagContainer.Reset();TagContainer.AppendTags(GameplayTagCountContainer.GetExplicitGameplayTags());}/** 返回给定标签的实例数 */FORCEINLINE int32 GetTagCount(FGameplayTag TagToCheck) const{return GameplayTagCountContainer.GetTagCount(TagToCheck);}/** 强制设置给定标签的实例数 */FORCEINLINE void SetTagMapCount(const FGameplayTag& Tag, int32 NewCount){GameplayTagCountContainer.SetTagCount(Tag, NewCount);}/** 更新给定标签的实例数并调用回调 */FORCEINLINE void UpdateTagMap(const FGameplayTag& BaseTag, int32 CountDelta){if (GameplayTagCountContainer.UpdateTagCount(BaseTag, CountDelta)){OnTagUpdated(BaseTag, CountDelta > 0);}}/** 更新给定标签的实例数并调用回调 */FORCEINLINE void UpdateTagMap(const FGameplayTagContainer& Container, int32 CountDelta){if (!Container.IsEmpty()){UpdateTagMap_Internal(Container, CountDelta);}}/** 用 BlockedAbilityTags 填充 TagContainer */FORCEINLINE void GetBlockedAbilityTags(FGameplayTagContainer& TagContainer) const{TagContainer.AppendTags(BlockedAbilityTags.GetExplicitGameplayTags());}/** * 允许游戏代码添加不受游戏效果支持的松散游戏标签。* 以此方式添加的标签不会被复制!如果需要复制,请使用这些函数的“Replicated”版本。* 由调用游戏代码确保在必要的客户端/服务器上添加这些标签*/FORCEINLINE void AddLooseGameplayTag(const FGameplayTag& GameplayTag, int32 Count=1){UpdateTagMap(GameplayTag, Count);}FORCEINLINE void AddLooseGameplayTags(const FGameplayTagContainer& GameplayTags, int32 Count = 1){UpdateTagMap(GameplayTags, Count);}FORCEINLINE void RemoveLooseGameplayTag(const FGameplayTag& GameplayTag, int32 Count = 1){UpdateTagMap(GameplayTag, -Count);}FORCEINLINE void RemoveLooseGameplayTags(const FGameplayTagContainer& GameplayTags, int32 Count = 1){UpdateTagMap(GameplayTags, -Count);}FORCEINLINE void SetLooseGameplayTagCount(const FGameplayTag& GameplayTag, int32 NewCount){SetTagMapCount(GameplayTag, NewCount);}/*** 返回给定游戏标签的当前计数。* 这包括松散标签,以及由游戏效果和能力授予的标签。* 此函数可以在客户端上调用,但可能不会显示服务器上的最新计数。** @param GameplayTag 要查询的游戏标签*/UFUNCTION(BlueprintPure, Category = "Gameplay Tags")int32 GetGameplayTagCount(FGameplayTag GameplayTag) const;/*** 允许游戏代码添加不受游戏效果支持的松散游戏标签。使用* 这些函数添加的标签将被复制。注意,复制的松散标签将覆盖模拟代理上任何本地设置的标签计数。*/FORCEINLINE void AddReplicatedLooseGameplayTag(const FGameplayTag& GameplayTag){GetReplicatedLooseTags_Mutable().AddTag(GameplayTag);bIsNetDirty = true;}FORCEINLINE void AddReplicatedLooseGameplayTags(const FGameplayTagContainer& GameplayTags){GetReplicatedLooseTags_Mutable().AddTags(GameplayTags);bIsNetDirty = true;}FORCEINLINE void RemoveReplicatedLooseGameplayTag(const FGameplayTag& GameplayTag){GetReplicatedLooseTags_Mutable().RemoveTag(GameplayTag);bIsNetDirty = true;}FORCEINLINE void RemoveReplicatedLooseGameplayTags(const FGameplayTagContainer& GameplayTags){GetReplicatedLooseTags_Mutable().RemoveTags(GameplayTags);bIsNetDirty = true;}FORCEINLINE void SetReplicatedLooseGameplayTagCount(const FGameplayTag& GameplayTag, int32 NewCount){GetReplicatedLooseTags_Mutable().SetTagCount(GameplayTag, NewCount);bIsNetDirty = true;}/** * 最小复制标签是在 bMinimalReplication 模式下来自GE的复制标签。* (GE不复制,但它们授予的标签通过这些函数复制)*/FORCEINLINE void AddMinimalReplicationGameplayTag(const FGameplayTag& GameplayTag){GetMinimalReplicationTags_Mutable().AddTag(GameplayTag);bIsNetDirty = true;}FORCEINLINE void AddMinimalReplicationGameplayTags(const FGameplayTagContainer& GameplayTags){GetMinimalReplicationTags_Mutable().AddTags(GameplayTags);bIsNetDirty = true;}FORCEINLINE void RemoveMinimalReplicationGameplayTag(const FGameplayTag& GameplayTag){GetMinimalReplicationTags_Mutable().RemoveTag(GameplayTag);bIsNetDirty = true;}FORCEINLINE void RemoveMinimalReplicationGameplayTags(const FGameplayTagContainer& GameplayTags){GetMinimalReplicationTags_Mutable().RemoveTags(GameplayTags);bIsNetDirty = true;}/** 允许注册特定游戏标签被添加或移除时的事件 */FOnGameplayEffectTagCountChanged& RegisterGameplayTagEvent(FGameplayTag Tag, EGameplayTagEventType::Type EventType=EGameplayTagEventType::NewOrRemoved);/** 取消注册先前添加的事件 */void UnregisterGameplayTagEvent(FDelegateHandle DelegateHandle, FGameplayTag Tag, EGameplayTagEventType::Type EventType=EGameplayTagEventType::NewOrRemoved);/** 注册标签事件并立即调用它 */FDelegateHandle RegisterAndCallGameplayTagEvent(FGameplayTag Tag, FOnGameplayEffectTagCountChanged::FDelegate Delegate, EGameplayTagEventType::Type EventType=EGameplayTagEventType::NewOrRemoved);/** 返回多播委托,每当标签被添加或移除时调用(但不仅仅是计数增加时。仅适用于“新”和“移除”事件) */FOnGameplayEffectTagCountChanged& RegisterGenericGameplayTagEvent();/** 执行游戏事件。返回由事件触发的成功能力激活次数 */virtual int32 HandleGameplayEvent(FGameplayTag EventTag, const FGameplayEventData* Payload);/** 添加一个新的委托,在游戏事件发生时调用。仅当它与传入过滤器容器中的任何标签匹配时才会被调用 */FDelegateHandle AddGameplayEventTagContainerDelegate(const FGameplayTagContainer& TagFilter, const FGameplayEventTagMulticastDelegate::FDelegate& Delegate);/** 移除先前注册的委托 */void RemoveGameplayEventTagContainerDelegate(const FGameplayTagContainer& TagFilter, FDelegateHandle DelegateHandle);/** 绑定到游戏标签的回调,这些回调仅在使用了确切的标签时激活。要处理标签层次结构,请使用 AddGameplayEventContainerDelegate */TMap<FGameplayTag, FGameplayEventMulticastDelegate> GenericGameplayEventCallbacks;// ----------------------------------------------------------------------------------------------------------------// 系统属性// ----------------------------------------------------------------------------------------------------------------/** 修改此组件创建的游戏效果持续时间的内部属性 */UPROPERTY(meta=(SystemGameplayAttribute="true"))float OutgoingDuration;/** 修改应用于此组件的游戏效果持续时间的内部属性 */UPROPERTY(meta = (SystemGameplayAttribute = "true"))float IncomingDuration;static FProperty* GetOutgoingDurationProperty();static FProperty* GetIncomingDurationProperty();static const FGameplayEffectAttributeCaptureDefinition& GetOutgoingDurationCapture();static const FGameplayEffectAttributeCaptureDefinition& GetIncomingDurationCapture();// ----------------------------------------------------------------------------------------------------------------// 附加辅助函数// ----------------------------------------------------------------------------------------------------------------/** 将游戏效果应用于传入的目标 */UFUNCTION(BlueprintCallable, Category = GameplayEffects, meta=(DisplayName = "ApplyGameplayEffectToTarget", ScriptName = "ApplyGameplayEffectToTarget"))FActiveGameplayEffectHandle BP_ApplyGameplayEffectToTarget(TSubclassOf<UGameplayEffect> GameplayEffectClass, UAbilitySystemComponent *Target, float Level, FGameplayEffectContextHandle Context);FActiveGameplayEffectHandle ApplyGameplayEffectToTarget(UGameplayEffect *GameplayEffect, UAbilitySystemComponent *Target, float Level = UGameplayEffect::INVALID_LEVEL, FGameplayEffectContextHandle Context = FGameplayEffectContextHandle(), FPredictionKey PredictionKey = FPredictionKey());/** 将游戏效果应用于自身 */UFUNCTION(BlueprintCallable, Category = GameplayEffects, meta=(DisplayName = "ApplyGameplayEffectToSelf", ScriptName = "ApplyGameplayEffectToSelf"))FActiveGameplayEffectHandle BP_ApplyGameplayEffectToSelf(TSubclassOf<UGameplayEffect> GameplayEffectClass, float Level, FGameplayEffectContextHandle EffectContext);FActiveGameplayEffectHandle ApplyGameplayEffectToSelf(const UGameplayEffect *GameplayEffect, float Level, const FGameplayEffectContextHandle& EffectContext, FPredictionKey PredictionKey = FPredictionKey());/** 返回此能力系统组件上当前活动的游戏效果数量 */int32 GetNumActiveGameplayEffects() const{return ActiveGameplayEffects.GetNumGameplayEffects();}/** 复制此能力组件上所有活动效果的副本 */void GetAllActiveGameplayEffectSpecs(TArray<FGameplayEffectSpec>& OutSpecCopies) const{ActiveGameplayEffects.GetAllActiveGameplayEffectSpecs(OutSpecCopies);}/** 在OnRep函数中调用,以在客户端上设置属性基础值 */void SetBaseAttributeValueFromReplication(const FGameplayAttribute& Attribute, float NewValue, float OldValue){ActiveGameplayEffects.SetBaseAttributeValueFromReplication(Attribute, NewValue, OldValue);}/** 在OnRep函数中调用,以在客户端上设置属性基础值 */void SetBaseAttributeValueFromReplication(const FGameplayAttribute& Attribute, const FGameplayAttributeData& NewValue, const FGameplayAttributeData& OldValue){ActiveGameplayEffects.SetBaseAttributeValueFromReplication(Attribute, NewValue.GetBaseValue(), OldValue.GetBaseValue());}/** 测试此GameplayEffect中的所有修饰符是否会使属性 > 0.f */bool CanApplyAttributeModifiers(const UGameplayEffect *GameplayEffect, float Level, const FGameplayEffectContextHandle& EffectContext){return ActiveGameplayEffects.CanApplyAttributeModifiers(GameplayEffect, Level, EffectContext);}/** 获取匹配查询的所有效果的剩余时间 */TArray<float> GetActiveEffectsTimeRemaining(const FGameplayEffectQuery& Query) const;/** 获取匹配查询的所有效果的总持续时间 */TArray<float> GetActiveEffectsDuration(const FGameplayEffectQuery& Query) const;/** 获取匹配查询的所有效果的剩余时间和总持续时间 */TArray<TPair<float,float>> GetActiveEffectsTimeRemainingAndDuration(const FGameplayEffectQuery& Query) const;/** 返回查询的活动效果列表 */UFUNCTION(BlueprintCallable, BlueprintPure=false, Category = "GameplayEffects", meta=(DisplayName = "Get Active Gameplay Effects for Query"))TArray<FActiveGameplayEffectHandle> GetActiveEffects(const FGameplayEffectQuery& Query) const;/** 返回具有所有传入标签的活动效果列表 */UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "GameplayEffects")TArray<FActiveGameplayEffectHandle> GetActiveEffectsWithAllTags(FGameplayTagContainer Tags) const;/** 这将给出匹配此查询的所有效果将完成的世界时间。如果多个效果匹配,则返回最后完成的一个 */float GetActiveEffectsEndTime(const FGameplayEffectQuery& Query) const;float GetActiveEffectsEndTimeWithInstigators(const FGameplayEffectQuery& Query, TArray<AActor*>& Instigators) const;/** 返回结束时间和总持续时间 */bool GetActiveEffectsEndTimeAndDuration(const FGameplayEffectQuery& Query, float& EndTime, float& Duration) const;/** 修改游戏效果的开始时间,以处理计时器最初不同步的问题 */virtual void ModifyActiveEffectStartTime(FActiveGameplayEffectHandle Handle, float StartTimeDiff);/** 移除包含Tags中任何标签的所有活动效果 */UFUNCTION(BlueprintCallable, Category = GameplayEffects)int32 RemoveActiveEffectsWithTags(FGameplayTagContainer Tags);/** 移除捕获的源标签包含Tags中任何标签的所有活动效果 */UFUNCTION(BlueprintCallable, Category = GameplayEffects)int32 RemoveActiveEffectsWithSourceTags(FGameplayTagContainer Tags);/** 移除应用Tags中任何标签的所有活动效果 */UFUNCTION(BlueprintCallable, Category = GameplayEffects)int32 RemoveActiveEffectsWithAppliedTags(FGameplayTagContainer Tags);/** 移除授予Tags中任何标签的所有活动效果 */UFUNCTION(BlueprintCallable, Category = GameplayEffects)int32 RemoveActiveEffectsWithGrantedTags(FGameplayTagContainer Tags);/** 移除匹配给定查询的所有活动效果。StacksToRemove=-1 将移除所有堆栈。 */virtual int32 RemoveActiveEffects(const FGameplayEffectQuery& Query, int32 StacksToRemove = -1);// ----------------------------------------------------------------------------------------------------------------// GameplayCues// ----------------------------------------------------------------------------------------------------------------// 不要直接调用这些函数,改为调用 GameplayCueManager 上的包装器UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueExecuted_FromSpec(const FGameplayEffectSpecForRPC Spec, FPredictionKey PredictionKey) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueExecuted(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCuesExecuted(const FGameplayTagContainer GameplayCueTags, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueExecuted_WithParams(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCuesExecuted_WithParams(const FGameplayTagContainer GameplayCueTags, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAdded(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayEffectContextHandle EffectContext) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAdded_WithParams(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters Parameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAddedAndWhileActive_FromSpec(const FGameplayEffectSpecForRPC& Spec, FPredictionKey PredictionKey) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCueAddedAndWhileActive_WithParams(const FGameplayTag GameplayCueTag, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;UFUNCTION(NetMulticast, unreliable)void NetMulticast_InvokeGameplayCuesAddedAndWhileActive_WithParams(const FGameplayTagContainer GameplayCueTags, FPredictionKey PredictionKey, FGameplayCueParameters GameplayCueParameters) override;/** GameplayCues 也可以单独出现。这些接受一个可选的效果上下文以传递命中结果等 */void ExecuteGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext = FGameplayEffectContextHandle());void ExecuteGameplayCue(const FGameplayTag GameplayCueTag, const FGameplayCueParameters& GameplayCueParameters);/** 添加一个持久的游戏提示 */void AddGameplayCue(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext = FGameplayEffectContextHandle());void AddGameplayCue(const FGameplayTag GameplayCueTag, const FGameplayCueParameters& GameplayCueParameters);/** 为最小复制模式添加游戏提示。仅当不在最小复制模式时,才会通过其他方式(例如通过GE)复制游戏提示的路径中调用 */void AddGameplayCue_MinimalReplication(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle EffectContext = FGameplayEffectContextHandle());/** 移除一个持久的游戏提示 */void RemoveGameplayCue(const FGameplayTag GameplayCueTag);/** 为最小复制模式移除游戏提示。仅当不在最小复制模式时,才会通过其他方式(例如通过GE)复制游戏提示的路径中调用 */void RemoveGameplayCue_MinimalReplication(const FGameplayTag GameplayCueTag);/** 移除任何单独添加的GameplayCue,即不是作为GameplayEffect的一部分添加的。 */void RemoveAllGameplayCues();/** 处理来自外部源的游戏提示事件 */void InvokeGameplayCueEvent(const FGameplayEffectSpecForRPC& Spec, EGameplayCueEvent::Type EventType);void InvokeGameplayCueEvent(const FGameplayTag GameplayCueTag, EGameplayCueEvent::Type EventType, FGameplayEffectContextHandle EffectContext = FGameplayEffectContextHandle());void InvokeGameplayCueEvent(const FGameplayTag GameplayCueTag, EGameplayCueEvent::Type EventType, const FGameplayCueParameters& GameplayCueParameters);/** 允许轮询以查看GameplayCue是否处于活动状态。我们期望大多数GameplayCue处理是基于事件的,但在某些情况下,我们可能需要检查GameplayCue是否处于活动状态(例如动画蓝图) */UFUNCTION(BlueprintCallable, Category="GameplayCue", meta=(GameplayTagFilter="GameplayCue"))bool IsGameplayCueActive(const FGameplayTag GameplayCueTag) const{return HasMatchingGameplayTag(GameplayCueTag);}/** 将使用此ASC的所有者(Instigator)和AvatarActor(EffectCauser)初始化游戏提示参数 */virtual void InitDefaultGameplayCueParameters(FGameplayCueParameters& Parameters);/** 我们是否准备好调用游戏提示了? */virtual bool IsReadyForGameplayCues();/** 处理在执行NetDeltaSerialize并等待AvatarActor加载时可能被延迟的GameplayCues */virtual void HandleDeferredGameplayCues(const FActiveGameplayEffectsContainer* GameplayEffectsContainer);/** 为所有活动、未被抑制的GE上的所有GC调用WhileActive事件。这通常用于“重生”或网格/化身已更改的情况 */virtual void ReinvokeActiveGameplayCues();/*** GameplayAbilities* * AbilitySystemComponent 关于 Abilities 的角色是提供:* -能力实例的管理(无论是每个Actor还是每次执行实例)。* -必须有东西跟踪这些实例。* -非实例化能力可以在没有AbilitySystemComponent中任何能力内容的情况下执行。* 它们应该能够操作 GameplayAbilityActorInfo + GameplayAbility。* * 作为便利,它可能提供一些其他功能:* -一些基本的输入绑定(无论是实例化还是非实例化能力)。* -诸如“此组件具有这些能力”的概念* *//** 授予一个能力。* 如果Actor没有权限,则将被忽略。* 返回可在 TryActivateAbility 等中使用的句柄。* * @param AbilitySpec 包含能力类、级别和要绑定到的输入ID信息的 FGameplayAbilitySpec。*/FGameplayAbilitySpecHandle GiveAbility(const FGameplayAbilitySpec& AbilitySpec);/** 授予一个能力并尝试激活它恰好一次,这将导致它被移除。* 仅在服务器上有效,并且能力的网络执行策略不能设置为 Local 或 Local Predicted* * @param AbilitySpec 包含能力类、级别和要绑定到的输入ID信息的 FGameplayAbilitySpec。* @param GameplayEventData 可选的激活事件数据。如果提供,将调用 Activate Ability From Event 而不是 ActivateAbility,传递事件数据*/FGameplayAbilitySpecHandle GiveAbilityAndActivateOnce(FGameplayAbilitySpec& AbilitySpec, const FGameplayEventData* GameplayEventData = nullptr);/*** 授予一个游戏能力并返回其句柄。* 如果Actor没有权限,则将被忽略。** @param AbilityClass 要授予的能力类型* @param Level 授予能力的级别* @param InputID 绑定能力激活的输入ID值。*/UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities", meta = (DisplayName = "Give Ability", ScriptName = "GiveAbility"))FGameplayAbilitySpecHandle K2_GiveAbility(TSubclassOf<UGameplayAbility> AbilityClass, int32 Level = 0, int32 InputID = -1);/*** 授予一个游戏能力,激活它一次,然后移除它。* 如果Actor没有权限,则将被忽略。** @param AbilityClass 要授予的能力类型* @param Level 授予能力的级别* @param InputID 绑定能力激活的输入ID值。*/UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities", meta = (DisplayName = "Give Ability And Activate Once", ScriptName = "GiveAbilityAndActivateOnce"))FGameplayAbilitySpecHandle K2_GiveAbilityAndActivateOnce(TSubclassOf<UGameplayAbility> AbilityClass, int32 Level = 0, int32 InputID = -1);/** 清除所有“已授予”的能力。如果Actor没有权限,则将被忽略。 */UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category="Gameplay Abilities")void ClearAllAbilities();/*** 清除绑定到给定输入ID的所有能力* 如果Actor没有权限,则将被忽略** @param InputID 要移除的能力的数字输入ID*/UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities")void ClearAllAbilitiesWithInputID(int32 InputID = 0);/** * 移除指定的能力。* 如果Actor没有权限,则将被忽略。* * @param Handle 要移除的能力的 Ability Spec Handle*/UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Gameplay Abilities")void ClearAbility(const FGameplayAbilitySpecHandle& Handle);/** 设置一个能力规格在其结束时移除。如果该规格当前未激活,则立即终止它。同时清除该规格的InputID。 */void SetRemoveAbilityOnEnd(FGameplayAbilitySpecHandle AbilitySpecHandle);/** * 获取匹配 GameplayTagContainer 中所有标签且满足 DoesAbilitySatisfyTagRequirements() 的所有可激活游戏能力。* 后一个要求允许此函数找到正确的能力,而无需预先了解。* 例如,如果有两个“近战”能力,一个需要武器,另一个需要徒手,那么这些能力可以使用阻塞和必需标签来确定它们何时可以触发。* 使用满足标签要求简化了许多使用情况。* 例如,行为树可以使用各种装饰器来测试使用此机制获取的能力,以及执行该能力的任务,而无需知道甚至存在多个这样的能力。*/void GetActivatableGameplayAbilitySpecsByAllMatchingTags(const FGameplayTagContainer& GameplayTagContainer, TArray < struct FGameplayAbilitySpec* >& MatchingGameplayAbilities, bool bOnlyAbilitiesThatSatisfyTagRequirements = true) const;/** * 尝试激活匹配给定标签且满足 DoesAbilitySatisfyTagRequirements() 的每个游戏能力。* 如果有任何尝试激活,则返回true。可以激活多个能力,并且能力可能稍后失败。* 如果 bAllowRemoteActivation 为 true,它将远程激活本地/服务器能力,如果为 false,则仅尝试本地激活能力。*/UFUNCTION(BlueprintCallable, Category = "Abilities")bool TryActivateAbilitiesByTag(const FGameplayTagContainer& GameplayTagContainer, bool bAllowRemoteActivation = true);/*** 尝试激活传入的能力。这将检查成本和要求后再进行。* 如果它认为已激活,则返回true,但由于稍后激活失败,可能会返回误报。* 如果 bAllowRemoteActivation 为 true,它将远程激活本地/服务器能力,如果为 false,则仅尝试本地激活该能力*/UFUNCTION(BlueprintCallable, Category = "Abilities")bool TryActivateAbilityByClass(TSubclassOf<UGameplayAbility> InAbilityToActivate, bool bAllowRemoteActivation = true);/** * 尝试激活给定的能力,将在执行前检查成本和要求。* 如果它认为已激活,则返回true,但由于稍后激活失败,可能会返回误报。* 如果 bAllowRemoteActivation 为 true,它将远程激活本地/服务器能力,如果为 false,则仅尝试本地激活该能力*/UFUNCTION(BlueprintCallable, Category = "Abilities")bool TryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool bAllowRemoteActivation = true);bool HasActivatableTriggeredAbility(FGameplayTag Tag);/** 从游戏事件触发能力,将仅根据执行标志在本地/服务器上触发 */bool TriggerAbilityFromGameplayEvent(FGameplayAbilitySpecHandle AbilityToTrigger, FGameplayAbilityActorInfo* ActorInfo, FGameplayTag Tag, const FGameplayEventData* Payload, UAbilitySystemComponent& Component);// ----------------------------------------------------------------------------------------------------------------// 能力取消/中断// ----------------------------------------------------------------------------------------------------------------/** 取消指定的能力 CDO。 */void CancelAbility(UGameplayAbility* Ability); /** 取消由传入的规格句柄指示的能力。如果在重新激活的能力中未找到句柄,则不执行任何操作。 */void CancelAbilityHandle(const FGameplayAbilitySpecHandle& AbilityHandle);/** 取消所有具有指定标签的能力。不会取消 Ignore 实例 */void CancelAbilities(const FGameplayTagContainer* WithTags=nullptr, const FGameplayTagContainer* WithoutTags=nullptr, UGameplayAbility* Ignore=nullptr);/** 取消所有能力,无论标签如何。不会取消 ignore 实例 */void CancelAllAbilities(UGameplayAbility* Ignore=nullptr);/** 取消所有能力并杀死任何剩余的实例化能力 */virtual void DestroyActiveState();/** * 从能力激活或本机代码调用,将应用正确的能力阻塞标签并取消现有能力。子类可以覆盖此行为* * @param AbilityTags 具有阻塞和取消标志的能力的标签* @param RequestingAbility 请求更改的游戏能力,对于本机事件可以为 NULL* @param bEnableBlockTags 如果为 true 将启用阻塞标签,如果为 false 将禁用阻塞标签* @param BlockTags 要阻塞的标签* @param bExecuteCancelTags 如果为 true 将取消匹配标签的能力* @param CancelTags 要取消的标签*/virtual void ApplyAbilityBlockAndCancelTags(const FGameplayTagContainer& AbilityTags, UGameplayAbility* RequestingAbility, bool bEnableBlockTags, const FGameplayTagContainer& BlockTags, bool bExecuteCancelTags, const FGameplayTagContainer& CancelTags);/** 当能力可取消或不可取消时调用。默认不执行任何操作,可以覆盖以连接到游戏事件 */virtual void HandleChangeAbilityCanBeCanceled(const FGameplayTagContainer& AbilityTags, UGameplayAbility* RequestingAbility, bool bCanBeCanceled) {}/** 如果任何传入的标签被阻塞,则返回true */virtual bool AreAbilityTagsBlocked(const FGameplayTagContainer& Tags) const;/** 阻塞或取消阻塞特定能力标签 */void BlockAbilitiesWithTags(const FGameplayTagContainer& Tags);void UnBlockAbilitiesWithTags(const FGameplayTagContainer& Tags);/** 检查能力系统当前是否阻塞 InputID。如果 InputID 被阻塞则返回 true,否则返回 false。 */bool IsAbilityInputBlocked(int32 InputID) const;/** 阻塞或取消阻塞特定输入 ID */void BlockAbilityByInputID(int32 InputID);void UnBlockAbilityByInputID(int32 InputID);// ----------------------------------------------------------------------------------------------------------------// 旨在从 GameplayAbility 及其子类调用的函数,但不适用于一般用途// ----------------------------------------------------------------------------------------------------------------/** 返回所有可激活能力的列表。只读。 */const TArray<FGameplayAbilitySpec>& GetActivatableAbilities() const{return ActivatableAbilities.Items;}/** 返回所有可激活能力的列表。 */TArray<FGameplayAbilitySpec>& GetActivatableAbilities(){return ActivatableAbilities.Items;}/** 返回能力上次激活的本地世界时间。在权限(服务器)和自主代理(控制客户端)上有效。 */float GetAbilityLastActivatedTime() const { return AbilityLastActivatedTime; }/** 从句柄返回能力规格。如果修改,调用 MarkAbilitySpecDirty */FGameplayAbilitySpec* FindAbilitySpecFromHandle(FGameplayAbilitySpecHandle Handle);/** 从 GE 句柄返回能力规格。如果修改,调用 MarkAbilitySpecDirty */FGameplayAbilitySpec* FindAbilitySpecFromGEHandle(FActiveGameplayEffectHandle Handle);/** 返回对应于给定能力类的能力规格。如果修改,调用 MarkAbilitySpecDirty */FGameplayAbilitySpec* FindAbilitySpecFromClass(TSubclassOf<UGameplayAbility> InAbilityClass);/** 从句柄返回能力规格。如果修改,调用 MarkAbilitySpecDirty */FGameplayAbilitySpec* FindAbilitySpecFromInputID(int32 InputID);/*** 返回具有给定 InputID 的所有能力** @param InputID 要匹配的输入 ID* @param OutAbilitySpecs 匹配规格的指针数组*/virtual void FindAllAbilitySpecsFromInputID(int32 InputID, TArray<const FGameplayAbilitySpec*>& OutAbilitySpecs) const;/*** 从类、级别和可选的输入 ID 构建一个简单的 FGameplayAbilitySpec*/virtual FGameplayAbilitySpec BuildAbilitySpecFromClass(TSubclassOf<UGameplayAbility> AbilityClass, int32 Level = 0, int32 InputID = -1);/*** 返回包含所有已授予能力句柄的数组* 注意:当前这不包括正在激活的能力* * @param OutAbilityHandles 此数组将填充已授予的 Ability Spec Handles*/UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Gameplay Abilities")void GetAllAbilities(TArray<FGameplayAbilitySpecHandle>& OutAbilityHandles) const;/*** 返回匹配提供标签的所有能力的数组** @param OutAbilityHandles 此数组将填充匹配的 Ability Spec Handles* @param Tags 要匹配的游戏标签* @param bMatchAll 如果为 true,则必须完全匹配标签。否则,将返回匹配任何标签的能力*/UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Gameplay Abilities")void FindAllAbilitiesWithTags(TArray<FGameplayAbilitySpecHandle>& OutAbilityHandles, FGameplayTagContainer Tags, bool bExactMatch = true) const;/*** 返回匹配提供的游戏标签查询的所有能力的数组** @param OutAbilityHandles 此数组将填充匹配的 Ability Spec Handles* @param Query 要匹配的游戏标签查询*/UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Gameplay Abilities")void FindAllAbilitiesMatchingQuery(TArray<FGameplayAbilitySpecHandle>& OutAbilityHandles, FGameplayTagQuery Query) const;/*** 返回绑定到输入ID值的所有能力的数组** @param OutAbilityHandles 此数组将填充匹配的 Ability Spec Handles* @param InputID 要匹配的输入 ID*/UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Gameplay Abilities")void FindAllAbilitiesWithInputID(TArray<FGameplayAbilitySpecHandle>& OutAbilityHandles, int32 InputID = 0) const;/** 从活动游戏效果的句柄中检索游戏效果的EffectContext。 */FGameplayEffectContextHandle GetEffectContextFromActiveGEHandle(FActiveGameplayEffectHandle Handle);/** 调用以标记能力规格已被修改 */void MarkAbilitySpecDirty(FGameplayAbilitySpec& Spec, bool WasAddOrRemove=false);/** 尝试激活给定的能力,仅当从正确的客户端/服务器上下文调用时才有效 */bool InternalTryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, FPredictionKey InPredictionKey = FPredictionKey(), UGameplayAbility ** OutInstancedAbility = nullptr, FOnGameplayAbilityEnded::FDelegate* OnGameplayAbilityEndedDelegate = nullptr, const FGameplayEventData* TriggerEventData = nullptr);/** 由 InternalTryActivateAbility 使用的失败标签(例如,这存储了上次调用 InternalTryActivateAbility 的 FailureTags) */FGameplayTagContainer InternalTryActivateAbilityFailureTags;/** 从能力调用,让组件知道它已结束 */virtual void NotifyAbilityEnded(FGameplayAbilitySpecHandle Handle, UGameplayAbility* Ability, bool bWasCancelled);void ClearAbilityReplicatedDataCache(FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActivationInfo& ActivationInfo);/** 从 FScopedAbilityListLock 调用 */void IncrementAbilityListLock();void DecrementAbilityListLock();// ----------------------------------------------------------------------------------------------------------------// 调试// ----------------------------------------------------------------------------------------------------------------struct FAbilitySystemComponentDebugInfo{FAbilitySystemComponentDebugInfo(){FMemory::Memzero(*this);}class UCanvas* Canvas;bool bPrintToLog;bool bShowAttributes;bool bShowGameplayEffects;;bool bShowAbilities;float XPos;float YPos;float OriginalX;float OriginalY;float MaxY;float NewColumnYPadding;float YL;bool Accumulate;TArray<FString> Strings;int32 GameFlags; // 游戏在 Debug_Internal 中设置/读取的任意标志};static void OnShowDebugInfo(AHUD* HUD, UCanvas* Canvas, const FDebugDisplayInfo& DisplayInfo, float& YL, float& YPos);virtual void DisplayDebug(class UCanvas* Canvas, const class FDebugDisplayInfo& DebugDisplay, float& YL, float& YPos);virtual void PrintDebug();void AccumulateScreenPos(FAbilitySystemComponentDebugInfo& Info);virtual void Debug_Internal(struct FAbilitySystemComponentDebugInfo& Info);void DebugLine(struct FAbilitySystemComponentDebugInfo& Info, FString Str, float XOffset, float YOffset, int32 MinTextRowsToAdvance = 0);FString CleanupName(FString Str);/** 打印所有游戏效果的调试列表 */void PrintAllGameplayEffects() const;/** 请求服务器将能力系统调试信息发送回客户端,通过 ClientPrintDebug_Response */UFUNCTION(Server, reliable, WithValidation)void ServerPrintDebug_Request();/** 与 ServerPrintDebug_Request 相同,但这包括客户端调试字符串,以便服务器可以将它们嵌入到重放中 */UFUNCTION(Server, reliable, WithValidation)void ServerPrintDebug_RequestWithStrings(const TArray<FString>& Strings);/** 虚拟函数,游戏可以覆盖以在 ServerPrintDebug 函数在服务器上运行时执行自己的操作 */virtual void OnServerPrintDebug_Request();/** 确定是调用 ServerPrintDebug_Request 还是 ServerPrintDebug_RequestWithStrings。 */virtual bool ShouldSendClientDebugStringsToServer() const;UFUNCTION(Client, reliable)void ClientPrintDebug_Response(const TArray<FString>& Strings, int32 GameFlags);virtual void OnClientPrintDebug_Response(const TArray<FString>& Strings, int32 GameFlags);#if ENABLE_VISUAL_LOGvoid ClearDebugInstantEffects();
#endif // ENABLE_VISUAL_LOGUE_DEPRECATED(4.26, "这在未来的引擎版本中将变为私有。请改用 SetClientDebugStrings、GetClientDebugStrings 或 GetClientDebugStrings_Mutable。")UPROPERTY(ReplicatedUsing=OnRep_ClientDebugString)TArray<FString> ClientDebugStrings;void SetClientDebugStrings(TArray<FString>&& NewClientDebugStrings);TArray<FString>& GetClientDebugStrings_Mutable();const TArray<FString>& GetClientDebugStrings() const;UE_DEPRECATED(4.26, "这在未来的引擎版本中将变为私有。请改用 SetServerDebugStrings、GetServerDebugStrings 或 GetServerDebugStrings_Mutable。")UPROPERTY(ReplicatedUsing=OnRep_ServerDebugString)TArray<FString> ServerDebugStrings;void SetServerDebugStrings(TArray<FString>&& NewServerDebugStrings);TArray<FString>& GetServerDebugStrings_Mutable();const TArray<FString>& GetServerDebugStrings() const;UFUNCTION()virtual void OnRep_ClientDebugString();UFUNCTION()virtual void OnRep_ServerDebugString();// ----------------------------------------------------------------------------------------------------------------// 批处理客户端->服务器 RPCs// 这是一个进行中的功能,用于批处理客户端->服务器通信。它是选择加入且不完整的。它仅批处理以下函数。在批处理窗口期间调用其他服务器 RPC 是不安全的。仅当您知道自己在做什么时才选择加入!// ---------------------------------------------------------------------------------------------------------------- void CallServerTryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool InputPressed, FPredictionKey PredictionKey);void CallServerSetReplicatedTargetData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, const FGameplayAbilityTargetDataHandle& ReplicatedTargetDataHandle, FGameplayTag ApplicationTag, FPredictionKey CurrentPredictionKey);void CallServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo ActivationInfo, FPredictionKey PredictionKey);virtual bool ShouldDoServerAbilityRPCBatch() const { return false; }virtual void BeginServerAbilityRPCBatch(FGameplayAbilitySpecHandle AbilityHandle);virtual void EndServerAbilityRPCBatch(FGameplayAbilitySpecHandle AbilityHandle);/** 在 EndServerAbilityRPCBatch 上批量发送到服务器的累积客户端数据 */TArray<FServerAbilityRPCBatch, TInlineAllocator<1> > LocalServerAbilityRPCBatchData;UFUNCTION(Server, reliable, WithValidation)void ServerAbilityRPCBatch(FServerAbilityRPCBatch BatchInfo);// 子类可覆盖的函数virtual void ServerAbilityRPCBatch_Internal(FServerAbilityRPCBatch& BatchInfo);// ----------------------------------------------------------------------------------------------------------------// 输入处理/目标选择// ---------------------------------------------------------------------------------------------------------------- /*** 这旨在用于从输入角度抑制激活能力。(例如,菜单已拉起,另一个游戏机制正在消耗所有输入等)* 这应仅在本地拥有的玩家上调用。* 这不应用于游戏机制,如沉默或禁用。那些应通过游戏效果完成。*/UFUNCTION(BlueprintCallable, Category="Abilities")bool GetUserAbilityActivationInhibited() const;/** 禁用或启用本地用户激活能力的能力。这应仅用于输入/UI等相关抑制。不要用于游戏机制。 */UFUNCTION(BlueprintCallable, Category="Abilities")virtual void SetUserAbilityActivationInhibited(bool NewInhibit);/** 当前激活是否被抑制 */UPROPERTY()bool UserAbilityActivationInhibited;/** 当启用时,GameplayCue RPCs 将通过 AvatarActor 的 IAbilitySystemReplicationProxyInterface 路由,而不是通过此组件 */UPROPERTY()bool ReplicationProxyEnabled;/** 抑制通过此组件上的GE授予的所有能力 */UPROPERTY()bool bSuppressGrantAbility;/** 抑制此组件上的所有GameplayCues */UPROPERTY()bool bSuppressGameplayCues;/** 当前活动的目标选择Actor列表 */UPROPERTY()TArray<TObjectPtr<AGameplayAbilityTargetActor>> SpawnedTargetActors;/** 使用一些默认操作名称绑定到输入组件 */virtual void BindToInputComponent(UInputComponent* InputComponent);/** 使用自定义绑定绑定到输入组件 */virtual void BindAbilityActivationToInputComponent(UInputComponent* InputComponent, FGameplayAbilityInputBinds BindInfo);/** 初始化 BlockedAbilityBindings 变量 */virtual void SetBlockAbilityBindingsArray(FGameplayAbilityInputBinds BindInfo);/** 调用以处理能力绑定输入 */virtual void AbilityLocalInputPressed(int32 InputID);virtual void AbilityLocalInputReleased(int32 InputID);/** 发送具有提供的输入ID的本地玩家输入按下事件,通知任何绑定的能力** @param InputID 要匹配的输入ID*/UFUNCTION(BlueprintCallable, Category = "Gameplay Abilities")void PressInputID(int32 InputID);/*** 发送具有提供的输入ID的本地玩家输入释放事件,通知任何绑定的能力* @param InputID 要匹配的输入ID*/UFUNCTION(BlueprintCallable, Category = "Gameplay Abilities")void ReleaseInputID(int32 InputID);/** 处理目标选择Actor的确认/取消 */virtual void LocalInputConfirm();virtual void LocalInputCancel();/*** 发送本地玩家输入确认事件,通知能力*/UFUNCTION(BlueprintCallable, Category = "Gameplay Abilities")void InputConfirm();/*** 发送本地玩家输入取消事件,通知能力*/UFUNCTION(BlueprintCallable, Category = "Gameplay Abilities")void InputCancel();/** 用于绑定GenericConfirm/Cancel事件的InputID */int32 GenericConfirmInputID;int32 GenericCancelInputID;bool IsGenericConfirmInputBound(int32 InputID) const { return ((InputID == GenericConfirmInputID) && GenericLocalConfirmCallbacks.IsBound()); }bool IsGenericCancelInputBound(int32 InputID) const { return ((InputID == GenericCancelInputID) && GenericLocalCancelCallbacks.IsBound()); }/** 通用本地回调,用于任何能力可以监听的通用 ConfirmEvent */FAbilityConfirmOrCancel GenericLocalConfirmCallbacks;/** 通用本地回调,用于任何能力可以监听的通用 CancelEvent */FAbilityConfirmOrCancel GenericLocalCancelCallbacks;/** 任何活动的目标选择Actor将被通知停止并返回当前目标数据 */UFUNCTION(BlueprintCallable, Category = "Abilities")virtual void TargetConfirm();/** 任何活动的目标选择Actor将被停止并取消,不返回任何目标数据 */UFUNCTION(BlueprintCallable, Category = "Abilities")virtual void TargetCancel();// ----------------------------------------------------------------------------------------------------------------// AnimMontage 支持// ---------------------------------------------------------------------------------------------------------------- /** 播放蒙太奇,并根据传入的能力/激活信息处理复制和预测 */virtual float PlayMontage(UGameplayAbility* AnimatingAbility, FGameplayAbilityActivationInfo ActivationInfo, UAnimMontage* Montage, float InPlayRate, FName StartSectionName = NAME_None, float StartTimeSeconds = 0.0f);/** 播放蒙太奇而不更新复制/预测结构。当复制告诉模拟代理播放蒙太奇时使用。 */virtual float PlayMontageSimulated(UAnimMontage* Montage, float InPlayRate, FName StartSectionName = NAME_None);/** 停止当前正在播放的任何蒙太奇。期望调用者仅在他们是当前动画能力(或有充分理由不检查)时才停止它 */virtual void CurrentMontageStop(float OverrideBlendOutTime = -1.0f);/** 如果当前蒙太奇是作为 Montage 参数给定的蒙太奇,则停止当前蒙太奇 */virtual void StopMontageIfCurrent(const UAnimMontage& Montage, float OverrideBlendOutTime = -1.0f);/** 清除传入的动画能力,如果它仍然是当前动画能力 */virtual void ClearAnimatingAbility(UGameplayAbility* Ability);/** 将当前蒙太奇跳转到给定部分。期望调用者仅在他们是当前动画能力(或有充分理由不检查)时才执行此操作 */virtual void CurrentMontageJumpToSection(FName SectionName);/** 设置当前蒙太奇的下一个部分名称。期望调用者仅在他们是当前动画能力(或有充分理由不检查)时才执行此操作 */virtual void CurrentMontageSetNextSectionName(FName FromSectionName, FName ToSectionName);/** 设置当前蒙太奇的播放速率 */virtual void CurrentMontageSetPlayRate(float InPlayRate);/** 如果传入的能力是当前动画能力,则返回true */bool IsAnimatingAbility(UGameplayAbility* Ability) const;/** 返回当前动画能力 */UGameplayAbility* GetAnimatingAbility();/** 返回当前正在播放的蒙太奇 */UAnimMontage* GetCurrentMontage() const;/** 获取当前正在播放的AnimMontage的SectionID */int32 GetCurrentMontageSectionID() const;/** 获取当前正在播放的AnimMontage的SectionName */FName GetCurrentMontageSectionName() const;/** 获取当前部分的时间长度 */float GetCurrentMontageSectionLength() const;/** 返回当前部分的剩余时间量 */float GetCurrentMontageSectionTimeLeft() const;/** 设置蒙太奇中位置复制方法的方法 */void SetMontageRepAnimPositionMethod(ERepAnimPositionMethod InMethod);// ----------------------------------------------------------------------------------------------------------------// Actor 交互// ---------------------------------------------------------------------------------------------------------------- private:/** 逻辑上拥有此组件的Actor */UPROPERTY(ReplicatedUsing = OnRep_OwningActor)TObjectPtr<AActor> OwnerActor;/** 用于能力的物理表示形式的Actor。可以为 NULL */UPROPERTY(ReplicatedUsing = OnRep_OwningActor)TObjectPtr<AActor> AvatarActor;public:void SetOwnerActor(AActor* NewOwnerActor);AActor* GetOwnerActor() const { return OwnerActor; }void SetAvatarActor_Direct(AActor* NewAvatarActor);AActor* GetAvatarActor_Direct() const { return AvatarActor; }UFUNCTION()void OnRep_OwningActor();UFUNCTION()void OnAvatarActorDestroyed(AActor* InActor);UFUNCTION()void OnOwnerActorDestroyed(AActor* InActor);UFUNCTION()void OnSpawnedAttributesEndPlayed(AActor* InActor, EEndPlayReason::Type EndPlayReason);/** 缓存关于拥有Actor的数据,能力将需要频繁访问(移动组件、网格组件、动画实例等) */TSharedPtr<FGameplayAbilityActorInfo> AbilityActorInfo;/*** 初始化能力的ActorInfo - 保存关于我们正在对谁行动以及谁控制我们的信息的结构。* OwnerActor 是逻辑上拥有此组件的Actor。* AvatarActor 是我们在世界中行动的物理Actor。通常是一个Pawn,但也可能是一个塔、建筑、炮塔等,可能与Owner相同*/virtual void InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor);/** 返回用于特定任务的Avatar Actor,通常是 GetAvatarActor */virtual AActor* GetGameplayTaskAvatar(const UGameplayTask* Task) const override;/** 返回此组件的Avatar Actor */AActor* GetAvatarActor() const;/** 更改Avatar Actor,保持Owner Actor不变 */void SetAvatarActor(AActor* InAvatarActor);/** 当ASC的AbilityActorInfo设置了PlayerController时调用。 */virtual void OnPlayerControllerSet() { }/*** 当初始化到此系统的Actor死亡时调用,这将从系统和FGameplayAbilityActorInfo中清除该Actor*/virtual void ClearActorInfo();/*** 这将根据当前的ActorInfo刷新能力的ActorInfo结构。也就是说,AvatarActor将是相同的,但我们将寻找新的* AnimInstance、MovementComponent、PlayerController等。*/ void RefreshAbilityActorInfo();// ----------------------------------------------------------------------------------------------------------------// 同步 RPCs// 虽然这些看起来是状态,但它们实际上是带有一些负载数据的同步事件// ----------------------------------------------------------------------------------------------------------------/** 将通用复制事件复制到服务器。 */UFUNCTION(Server, reliable, WithValidation)void ServerSetReplicatedEvent(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, FPredictionKey CurrentPredictionKey);/** 将带有负载的通用复制事件复制到服务器。 */UFUNCTION(Server, reliable, WithValidation)void ServerSetReplicatedEventWithPayload(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, FPredictionKey CurrentPredictionKey, FVector_NetQuantize100 VectorPayload);/** 将通用复制事件复制到客户端。 */UFUNCTION(Client, reliable)void ClientSetReplicatedEvent(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 调用使用给定通用复制事件注册的本地回调 */bool InvokeReplicatedEvent(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, FPredictionKey CurrentPredictionKey = FPredictionKey());/** 调用使用给定通用复制事件注册的本地回调 */bool InvokeReplicatedEventWithPayload(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, FPredictionKey CurrentPredictionKey, FVector_NetQuantize100 VectorPayload);/** 将目标数据复制到服务器 */UFUNCTION(Server, reliable, WithValidation)void ServerSetReplicatedTargetData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, const FGameplayAbilityTargetDataHandle& ReplicatedTargetDataHandle, FGameplayTag ApplicationTag, FPredictionKey CurrentPredictionKey);/** 复制到服务器,目标选择已被取消 */UFUNCTION(Server, reliable, WithValidation)void ServerSetReplicatedTargetDataCancelled(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, FPredictionKey CurrentPredictionKey);/** 设置当前目标数据并调用适用的回调 */virtual void ConfirmAbilityTargetData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, const FGameplayAbilityTargetDataHandle& TargetData, const FGameplayTag& ApplicationTag);/** 取消能力目标数据并调用回调 */virtual void CancelAbilityTargetData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 删除所有缓存的能力客户端数据(以前是:ConsumeAbilityTargetData)*/void ConsumeAllReplicatedData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 使用来自客户端的目标数据(仅TargetData) */void ConsumeClientReplicatedTargetData(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 使用给定的通用复制事件(取消设置它)。 */void ConsumeGenericReplicatedEvent(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 获取给定通用复制事件的复制数据。 */FAbilityReplicatedData GetReplicatedDataOfGenericReplicatedEvent(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 调用任何已发送的复制委托(TargetData 或 Generic Replicated Events)。注意,如果在能力的多个位置注册事件然后调用此函数,这可能很危险。 */void CallAllReplicatedDelegatesIfSet(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 如果已发送,则调用 TargetData Confirm/Cancel 事件。 */bool CallReplicatedTargetDataDelegatesIfSet(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 如果事件已发送,则调用给定的通用复制事件委托 */bool CallReplicatedEventDelegateIfSet(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 如果客户端事件已发送,则调用传入的委托。如果尚未发送,则将委托添加到我们的多播回调中,该回调将在发送时触发。 */bool CallOrAddReplicatedDelegate(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey, FSimpleMulticastDelegate::FDelegate Delegate);/** 返回给定 Ability/PredictionKey 对的 TargetDataSet 委托 */FAbilityTargetDataSetDelegate& AbilityTargetDataSetDelegate(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 返回给定 Ability/PredictionKey 对的 TargetData Cancelled 委托 */FSimpleMulticastDelegate& AbilityTargetDataCancelledDelegate(FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 返回给定 Ability/PredictionKey 对的 Generic Replicated Event */FSimpleMulticastDelegate& AbilityReplicatedEventDelegate(EAbilityGenericReplicatedEvent::Type EventType, FGameplayAbilitySpecHandle AbilityHandle, FPredictionKey AbilityOriginalPredictionKey);/** 直接输入状态复制。如果能力上的 bReplicateInputDirectly 为 true,则将调用这些,通常不是一件好事。(相反, prefer to use Generic Replicated Events)。 */UFUNCTION(Server, reliable, WithValidation)void ServerSetInputPressed(FGameplayAbilitySpecHandle AbilityHandle);UFUNCTION(Server, reliable, WithValidation)void ServerSetInputReleased(FGameplayAbilitySpecHandle AbilityHandle);/** 在本地玩家上始终调用。仅当 GameplayAbility 上设置了 bReplicateInputDirectly 时,在服务器上调用。 */virtual void AbilitySpecInputPressed(FGameplayAbilitySpec& Spec);/** 在本地玩家上始终调用。仅当 GameplayAbility 上设置了 bReplicateInputDirectly 时,在服务器上调用。 */virtual void AbilitySpecInputReleased(FGameplayAbilitySpec& Spec);// ----------------------------------------------------------------------------------------------------------------// 组件覆盖// ----------------------------------------------------------------------------------------------------------------virtual void InitializeComponent() override;virtual void UninitializeComponent() override;virtual void OnComponentDestroyed(bool bDestroyingHierarchy) override;virtual bool GetShouldTick() const override;virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;virtual void GetSubobjectsWithStableNamesForNetworking(TArray<UObject*>& Objs) override;virtual bool ReplicateSubobjects(class UActorChannel *Channel, class FOutBunch *Bunch, FReplicationFlags *RepFlags) override;/** 强制拥有Actor更新其复制,以确保游戏提示快速发送下去。覆盖以更改此操作的积极程度 */virtual void ForceReplication() override;virtual void PreNetReceive() override;virtual void PostNetReceive() override;virtual void OnRegister() override;virtual void OnUnregister() override;virtual void ReadyForReplication() override;virtual void BeginPlay() override;protected:/*** 我们可以激活的能力。* -这将包括非实例化能力和每次执行实例化能力的CDO。* -Actor实例化能力将是实际实例(不是CDO)* * 此数组对于工作不是至关重要的。它是为了“给Actor授予能力”的便利。但能力也可以在没有AbilitySystemComponent的情况下工作。* 例如,一个能力可以被编写为在 StaticMeshActor 上执行。只要能力不需要实例化或AbilitySystemComponent提供的任何其他东西,那么它就不需要该组件来运行。*/UPROPERTY(ReplicatedUsing=OnRep_ActivateAbilities, BlueprintReadOnly, Category = "Abilities")FGameplayAbilitySpecContainer ActivatableAbilities;/** 从能力规格映射到目标数据。用于跟踪复制数据和回调 */FGameplayAbilityReplicatedDataContainer AbilityTargetDataMap;/** 游戏标签容器过滤器及其调用的委托列表 */TArray<TPair<FGameplayTagContainer, FGameplayEventTagMulticastDelegate>> GameplayEventTagContainerDelegates;/** 与此组件关联的所有每次执行实例游戏能力的完整列表 */UE_DEPRECATED(5.1, "此数组将变为私有。请改用 GetReplicatedInstancedAbilities、AddReplicatedInstancedAbility 或 RemoveReplicatedInstancedAbility。")UPROPERTY()TArray<TObjectPtr<UGameplayAbility>> AllReplicatedInstancedAbilities;/** 与此组件关联的所有每次执行实例游戏能力的完整列表 */PRAGMA_DISABLE_DEPRECATION_WARNINGSconst TArray<UGameplayAbility*>& GetReplicatedInstancedAbilities() const { return AllReplicatedInstancedAbilities; }PRAGMA_ENABLE_DEPRECATION_WARNINGS/** 添加与此组件关联的游戏能力 */void AddReplicatedInstancedAbility(UGameplayAbility* GameplayAbility);/** 移除与此组件关联的游戏能力 */void RemoveReplicatedInstancedAbility(UGameplayAbility* GameplayAbility);/** 取消注册此组件的所有游戏能力 */void RemoveAllReplicatedInstancedAbilities();/** 将从 GiveAbility 或 OnRep 调用。使用给定能力初始化事件(触发器和输入) */virtual void OnGiveAbility(FGameplayAbilitySpec& AbilitySpec);/** 将从 RemoveAbility 或 OnRep 调用。解除与给定能力的输入绑定 */virtual void OnRemoveAbility(FGameplayAbilitySpec& AbilitySpec);/** 从 ClearAbility、ClearAllAbilities 或 OnRep 调用。清除任何不应再存在的触发器。 */void CheckForClearedAbilities();/** 取消特定的能力规格 */virtual void CancelAbilitySpec(FGameplayAbilitySpec& Spec, UGameplayAbility* Ignore);/** 创建能力的新实例,将其存储在规格中 */virtual UGameplayAbility* CreateNewInstanceOfAbility(FGameplayAbilitySpec& Spec, const UGameplayAbility* Ability);int32 AbilityScopeLockCount;TArray<FGameplayAbilitySpecHandle, TInlineAllocator<2> > AbilityPendingRemoves;TArray<FGameplayAbilitySpec, TInlineAllocator<2> > AbilityPendingAdds;/** 上次能力激活的本地世界时间。用于AFK/空闲检测 */float AbilityLastActivatedTime;UFUNCTION()virtual void OnRep_ActivateAbilities();UFUNCTION(Server, reliable, WithValidation)void ServerTryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool InputPressed, FPredictionKey PredictionKey);UFUNCTION(Server, reliable, WithValidation)void ServerTryActivateAbilityWithEventData(FGameplayAbilitySpecHandle AbilityToActivate, bool InputPressed, FPredictionKey PredictionKey, FGameplayEventData TriggerEventData);UFUNCTION(Client, reliable)void ClientTryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate);/** 由 ServerEndAbility 和 ClientEndAbility 调用;避免代码重复。 */void RemoteEndOrCancelAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo ActivationInfo, bool bWasCanceled);UFUNCTION(Server, reliable, WithValidation)void ServerEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo ActivationInfo, FPredictionKey PredictionKey);UFUNCTION(Client, reliable)void ClientEndAbility(FGameplayAbilitySpecHandle AbilityToEnd, FGameplayAbilityActivationInfo ActivationInfo);UFUNCTION(Server, reliable, WithValidation)void ServerCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo ActivationInfo);UFUNCTION(Client, reliable)void ClientCancelAbility(FGameplayAbilitySpecHandle AbilityToCancel, FGameplayAbilityActivationInfo ActivationInfo);UFUNCTION(Client, Reliable)void ClientActivateAbilityFailed(FGameplayAbilitySpecHandle AbilityToActivate, int16 PredictionKey);int32 ClientActivateAbilityFailedCountRecent;float ClientActivateAbilityFailedStartTime;void OnClientActivateAbilityCaughtUp(FGameplayAbilitySpecHandle AbilityToActivate, FPredictionKey::KeyType PredictionKey);UFUNCTION(Client, Reliable)void ClientActivateAbilitySucceed(FGameplayAbilitySpecHandle AbilityToActivate, FPredictionKey PredictionKey);UFUNCTION(Client, Reliable)void ClientActivateAbilitySucceedWithEventData(FGameplayAbilitySpecHandle AbilityToActivate, FPredictionKey PredictionKey, FGameplayEventData TriggerEventData);/** ServerTryActivateAbility 的实现 */virtual void InternalServerTryActivateAbility(FGameplayAbilitySpecHandle AbilityToActivate, bool InputPressed, const FPredictionKey& PredictionKey, const FGameplayEventData* TriggerEventData);/** 当播放蒙太奇的预测键被拒绝时调用 */void OnPredictiveMontageRejected(UAnimMontage* PredictiveMontage);/** 将 LocalAnimMontageInfo 复制到 RepAnimMontageInfo */void AnimMontage_UpdateReplicatedData();void AnimMontage_UpdateReplicatedData(FGameplayAbilityRepAnimMontage& OutRepAnimMontageInfo);/** 为重复的动画数据复制播放标志 */void AnimMontage_UpdateForcedPlayFlags(FGameplayAbilityRepAnimMontage& OutRepAnimMontageInfo);UE_DEPRECATED(4.26, "这在未来的引擎版本中将变为私有。请改用 SetRepAnimMontageInfo、GetRepAnimMontageInfo 或 GetRepAnimMontageInfo_Mutable。")/** 用于将蒙太奇信息复制到模拟客户端的数据结构 */UPROPERTY(ReplicatedUsing=OnRep_ReplicatedAnimMontage)FGameplayAbilityRepAnimMontage RepAnimMontageInfo;void SetRepAnimMontageInfo(const FGameplayAbilityRepAnimMontage& NewRepAnimMontageInfo);FGameplayAbilityRepAnimMontage& GetRepAnimMontageInfo_Mutable();const FGameplayAbilityRepAnimMontage& GetRepAnimMontageInfo() const;/** 缓存此是否为模拟Actor的值 */UPROPERTY()bool bCachedIsNetSimulated;/** 设置如果在我们尚未拥有与我们关联的动画实例时发生蒙太奇复制 */UPROPERTY()bool bPendingMontageRep;/** 在本地启动的蒙太奇的数据结构(如果是服务器,则为所有内容;如果是客户端,则为预测内容;如果是模拟代理,则为复制内容) */UPROPERTY()FGameplayAbilityLocalAnimMontage LocalAnimMontageInfo;UFUNCTION()virtual void OnRep_ReplicatedAnimMontage();/** 如果我们准备好处理复制的蒙太奇信息,则返回true */virtual bool IsReadyForReplicatedMontage();/** 从 CurrentMontageSetNextSectopnName 调用的 RPC 函数,复制到其他客户端 */UFUNCTION(reliable, server, WithValidation)void ServerCurrentMontageSetNextSectionName(UAnimMontage* ClientAnimMontage, float ClientPosition, FName SectionName, FName NextSectionName);/** 从 CurrentMontageJumpToSection 调用的 RPC 函数,复制到其他客户端 */UFUNCTION(reliable, server, WithValidation)void ServerCurrentMontageJumpToSectionName(UAnimMontage* ClientAnimMontage, FName SectionName);/** 从 CurrentMontageSetPlayRate 调用的 RPC 函数,复制到其他客户端 */UFUNCTION(reliable, server, WithValidation)void ServerCurrentMontageSetPlayRate(UAnimMontage* ClientAnimMontage, float InPlayRate);/** 由游戏事件触发的能力 */TMap<FGameplayTag, TArray<FGameplayAbilitySpecHandle > > GameplayEventTriggeredAbilities;/** 由添加到所有者的标签触发的能力 */TMap<FGameplayTag, TArray<FGameplayAbilitySpecHandle > > OwnedTagTriggeredAbilities;/** 当绑定到能力的拥有标签更改时调用的回调 */virtual void MonitoredTagChanged(const FGameplayTag Tag, int32 NewCount);/** 如果在此网络模式下应从事件激活指定能力,则返回true */bool HasNetworkAuthorityToActivateTriggeredAbility(const FGameplayAbilitySpec &Spec) const;virtual void OnImmunityBlockGameplayEffect(const FGameplayEffectSpec& Spec, const FActiveGameplayEffect* ImmunityGE);// 内部游戏提示函数virtual void AddGameplayCue_Internal(const FGameplayTag GameplayCueTag, FGameplayEffectContextHandle& EffectContext, FActiveGameplayCueContainer& GameplayCueContainer);virtual void AddGameplayCue_Internal(const FGameplayTag GameplayCueTag, const FGameplayCueParameters& GameplayCueParameters, FActiveGameplayCueContainer& GameplayCueContainer);virtual void RemoveGameplayCue_Internal(const FGameplayTag GameplayCueTag, FActiveGameplayCueContainer& GameplayCueContainer);/** 实际上将最终属性值推送到属性集的属性。不应由外部代码调用,因为这不会通过属性聚合器系统。 */void SetNumericAttribute_Internal(const FGameplayAttribute &Attribute, float& NewFloatValue);bool HasNetworkAuthorityToApplyGameplayEffect(FPredictionKey PredictionKey) const;void ExecutePeriodicEffect(FActiveGameplayEffectHandle Handle);void ExecuteGameplayEffect(FGameplayEffectSpec &Spec, FPredictionKey PredictionKey);void CheckDurationExpired(FActiveGameplayEffectHandle Handle);TArray<UGameplayTask*>& GetAbilityActiveTasks(UGameplayAbility* Ability);/** 包含此组件上当前活动的所有游戏效果 */UPROPERTY(Replicated)FActiveGameplayEffectsContainer ActiveGameplayEffects;/** 所有活动游戏提示的列表,包括手动应用的提示 */UPROPERTY(Replicated)FActiveGameplayCueContainer ActiveGameplayCues;/** 在最小复制模式下的复制游戏提示。这些是通常来自 ActiveGameplayEffects 的提示 */UPROPERTY(Replicated)FActiveGameplayCueContainer MinimalReplicationGameplayCues;/** 具有这些标签的能力无法被激活 */FGameplayTagCountContainer BlockedAbilityTags;UE_DEPRECATED(4.26, "这在未来的引擎版本中将变为私有。请改用 SetBlockedAbilityBindings、GetBlockedAbilityBindings 或 GetBlockedAbilityBindings_Mutable。")/** 跟踪基于输入绑定被阻塞的能力。如果 BlockedAbilityBindings[InputID] > 0,则能力被阻塞 */UPROPERTY(Transient, Replicated)TArray<uint8> BlockedAbilityBindings;void SetBlockedAbilityBindings(const TArray<uint8>& NewBlockedAbilityBindings);TArray<uint8>& GetBlockedAbilityBindings_Mutable();const TArray<uint8>& GetBlockedAbilityBindings() const;void DebugCyclicAggregatorBroadcasts(struct FAggregator* Aggregator);/** 所有游戏标签的加速映射(来自GE的OwnedGameplayTags和显式GameplayCueTags) */FGameplayTagCountContainer GameplayTagCountContainer;UE_DEPRECATED(4.26, "这在未来的引擎版本中将变为私有。请改用 SetMinimalReplicationTags、GetMinimalReplicationTags 或 GetMinimalReplicationTags_Mutable。")UPROPERTY(Replicated)FMinimalReplicationTagCountMap MinimalReplicationTags;void SetMinimalReplicationTags(const FMinimalReplicationTagCountMap& NewMinimalReplicationTags);FMinimalReplicationTagCountMap& GetMinimalReplicationTags_Mutable();const FMinimalReplicationTagCountMap& GetMinimalReplicationTags() const;FMinimalReplicationTagCountMap& GetReplicatedLooseTags_Mutable();const FMinimalReplicationTagCountMap& GetReplicatedLooseTags() const;void ResetTagMap();void NotifyTagMap_StackCountChange(const FGameplayTagContainer& Container);virtual void OnTagUpdated(const FGameplayTag& Tag, bool TagExists) {};const UAttributeSet* GetAttributeSubobject(const TSubclassOf<UAttributeSet> AttributeClass) const;const UAttributeSet* GetAttributeSubobjectChecked(const TSubclassOf<UAttributeSet> AttributeClass) const;const UAttributeSet* GetOrCreateAttributeSubobject(TSubclassOf<UAttributeSet> AttributeClass);void UpdateTagMap_Internal(const FGameplayTagContainer& Container, int32 CountDelta);friend struct FActiveGameplayEffect;friend struct FActiveGameplayEffectAction;friend struct FActiveGameplayEffectsContainer;friend struct FActiveGameplayCue;friend struct FActiveGameplayCueContainer;friend struct FGameplayAbilitySpec;friend struct FGameplayAbilitySpecContainer;friend struct FAggregator;friend struct FActiveGameplayEffectAction_Add;friend struct FGameplayEffectSpec;friend class AAbilitySystemDebugHUD;friend class UAbilitySystemGlobals;private:// 当修改 SpawnedAttributes 数组时,需要调用此函数以使更改被复制void SetSpawnedAttributesListDirty();// 在 AllReplicatedInstancedAbilities 数组上的弃用标记被移除并且我们可以再次直接引用该数组之前,对该数组的私有访问器。PRAGMA_DISABLE_DEPRECATION_WARNINGSTArray<UGameplayAbility*>& GetReplicatedInstancedAbilities_Mutable() { return AllReplicatedInstancedAbilities; }PRAGMA_ENABLE_DEPRECATION_WARNINGSprivate:/** 属性集列表 */UPROPERTY(Replicated, ReplicatedUsing=OnRep_SpawnedAttributes)TArray<TObjectPtr<UAttributeSet>> SpawnedAttributes;UFUNCTION()void OnRep_SpawnedAttributes(const TArray<UAttributeSet*>& PreviousSpawnedAttributes);FDelegateHandle MonitoredTagChangedDelegateHandle;FTimerHandle OnRep_ActivateAbilitiesTimerHandle;/** 用于复制松散游戏标签的容器 */UPROPERTY(Replicated)FMinimalReplicationTagCountMap ReplicatedLooseTags;uint8 bDestroyActiveStateInitiated : 1;
public:/** 缓存指示此组件是否具有网络权限的标志。 */void CacheIsNetSimulated();/** PredictionKeys,更多信息请参见 GameplayPrediction.h。这必须放在 AbilitySystemComponent 上所有复制属性的 *最后*,以确保 OnRep/回调顺序。 */UPROPERTY(Replicated)FReplicatedPredictionKeyMap ReplicatedPredictionKeyMap;protected:struct FAbilityListLockActiveChange{FAbilityListLockActiveChange(UAbilitySystemComponent& InAbilitySystemComp,TArray<FGameplayAbilitySpec, TInlineAllocator<2> >& PendingAdds,TArray<FGameplayAbilitySpecHandle, TInlineAllocator<2> >& PendingRemoves) :AbilitySystemComp(InAbilitySystemComp),Adds(MoveTemp(PendingAdds)),Removes(MoveTemp(PendingRemoves)){AbilitySystemComp.AbilityListLockActiveChanges.Add(this);}~FAbilityListLockActiveChange(){AbilitySystemComp.AbilityListLockActiveChanges.Remove(this);}UAbilitySystemComponent& AbilitySystemComp;TArray<FGameplayAbilitySpec, TInlineAllocator<2> > Adds;TArray<FGameplayAbilitySpecHandle, TInlineAllocator<2> > Removes;};TArray<FAbilityListLockActiveChange*> AbilityListLockActiveChanges;};