// Copyright Epic Games, Inc. All Rights Reserved.
// 版权所有 (c) Epic Games, Inc. 保留所有权利。
#pragma once
#include "GameplayEffectComponent.h"
#include "GameplayAbilitySpec.h"
#include "AbilitiesGameplayEffectComponent.generated.h"
/**
* 关于如何配置要授予 Actor 的 GameplayAbilitySpec 的选项
*/
USTRUCT()
struct FGameplayAbilitySpecConfig
{
GENERATED_BODY()
/** 要授予的技能类型 */
UPROPERTY(EditDefaultsOnly, Category = "Ability Definition")
TSubclassOf<UGameplayAbility> Ability;
/** 授予该技能的等级 */
UPROPERTY(EditDefaultsOnly, Category = "Ability Definition", DisplayName = "Level", meta=(UIMin=0.0))
FScalableFloat LevelScalableFloat = FScalableFloat{ 1.0f };
/** 要将此技能绑定到的输入 ID */
UPROPERTY(EditDefaultsOnly, Category = "Ability Definition")
int32 InputID = INDEX_NONE;
/** 之后将如何移除这个技能 */
UPROPERTY(EditDefaultsOnly, Category = "Ability Definition")
EGameplayEffectGrantedAbilityRemovePolicy RemovalPolicy = EGameplayEffectGrantedAbilityRemovePolicy::CancelAbilityImmediately;
};
/**
* 在激活时,为游戏玩法效果的目标授予额外的游戏技能
*/
UCLASS(DisplayName="Grant Gameplay Abilities")
class GAMEPLAYABILITIES_API UAbilitiesGameplayEffectComponent : public UGameplayEffectComponent
{
// 为升级路径,让 UGameplayEffect 类可以访问私有成员
friend class UGameplayEffect;
GENERATED_BODY()
public:
/** 构造函数 */
UAbilitiesGameplayEffectComponent();
/**
* 当我们应用时,注册相应的事件
* @param ActiveGEContainer 活动的游戏玩法效果容器
* @param ActiveGE 活动的游戏玩法效果
* @return 如果注册成功返回 true,否则返回 false
*/
virtual bool OnActiveGameplayEffectAdded(FActiveGameplayEffectsContainer& ActiveGEContainer, FActiveGameplayEffect& ActiveGE) const override;
/**
* 添加一个授予游戏技能的配置项
* @param Config 游戏技能规格配置
*/
void AddGrantedAbilityConfig(const FGameplayAbilitySpecConfig& Config);
#if WITH_EDITOR
/**
* 对配置错误的游戏玩法效果发出警告
* @param Context 数据验证上下文
* @return 数据验证结果
*/
virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endif
protected:
/**
* 当拥有的游戏玩法效果的抑制状态发生变化时(这可能在初始应用时发生),通知我们
* @param ActiveGEHandle 活动的游戏玩法效果句柄
* @param bIsInhibited 是否被抑制
*/
virtual void OnInhibitionChanged(FActiveGameplayEffectHandle ActiveGEHandle, bool bIsInhibited) const;
/**
* 我们应该授予配置好的游戏技能
* @param ActiveGEHandle 活动的游戏玩法效果句柄
*/
virtual void GrantAbilities(FActiveGameplayEffectHandle ActiveGEHandle) const;
/**
* 我们应该移除配置好的游戏技能
* @param ActiveGEHandle 活动的游戏玩法效果句柄
*/
virtual void RemoveAbilities(FActiveGameplayEffectHandle ActiveGEHandle) const;
private:
/**
* 当移除时,我们必须撤销所有效果
* @param RemovalInfo 游戏玩法效果移除信息
*/
void OnActiveGameplayEffectRemoved(const FGameplayEffectRemovalInfo& RemovalInfo) const;
protected:
/**
* 当此游戏玩法效果激活时,要授予目标的技能
*/
UPROPERTY(EditDefaultsOnly, Category = GrantAbilities)
TArray<FGameplayAbilitySpecConfig> GrantAbilityConfigs;
};