// 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; #endifprotected:/** * 当拥有的游戏玩法效果的抑制状态发生变化时(这可能在初始应用时发生),通知我们 * @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; };