虚幻GameAbilitySystem源码与设计解析-AbilitiesGameplayEffectComponent的实现

// 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;
};

 

posted @ 2025-02-24 00:03  mcwhirr  阅读(47)  评论(0)    收藏  举报