摘要:该代码实现了一个Unreal Engine的GameplayAbilitySystem(GAS)数据资产类UDataAsset_StartUpDataBase,用于批量管理游戏技能授予。主要功能包括:1)通过GrantAbilities方法批量授予技能;2)支持配置初始技能等级;3)将技能源对象绑定至角色Avatar;4)区分立即激活和被动技能。该设计遵循GAS推荐模式,将技能配置与逻辑分离,适用于角色初始化、装备系统和技能升级等场景,提高了代码的可维护性和扩展性。
1.创建启动数据资产:


Source/Warrior/Public/DataAssets/StartUp/DataAsset_StartUpDataBase.h:
cpp
// Copyright @ ChenChao
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "DataAsset_StartUpDataBase.generated.h"
class UWarriorGameplayAbility;
class UWarriorAbilitySystemComponent;
/**
*
*/
UCLASS()
class WARRIOR_API UDataAsset_StartUpDataBase : public UDataAsset
{
GENERATED_BODY()
public:
virtual void GiveToAbilitySystemComponent(UWarriorAbilitySystemComponent* InWarriorASCToGive, int32 ApplyLevel = 1);
protected:
//授予能力
void GrantAbilities(const TArray<TSubclassOf<UWarriorGameplayAbility>>& InAbilitiesToGive, UWarriorAbilitySystemComponent* InWarriorASCToGive, int32 ApplyLevel = 1);
protected:
//原始就有的能力
UPROPERTY(EditDefaultsOnly, Category="StartUpData")
TArray<TSubclassOf<UWarriorGameplayAbility>> ActivateOnGivenAbilities;
//激活才能有的能力
UPROPERTY(EditDefaultsOnly, Category="StartUpData")
TArray<TSubclassOf<UWarriorGameplayAbility>> ReactiveAbilities;
};
Source/Warrior/Private/DataAssets/StartUp/DataAsset_StartUpDataBase.cpp:
cpp
// Copyright @ ChenChao
#include "DataAssets/StartUp/DataAsset_StartUpDataBase.h"
#include "AbilitySystem/WarriorAbilitySystemComponent.h"
#include "AbilitySystem/GameplayAbilities/WarriorGameplayAbility.h"
void UDataAsset_StartUpDataBase::GiveToAbilitySystemComponent(UWarriorAbilitySystemComponent* InWarriorASCToGive,
int32 ApplyLevel)
{
check(InWarriorASCToGive);
GrantAbilities(ActivateOnGivenAbilities, InWarriorASCToGive, ApplyLevel);
GrantAbilities(ReactiveAbilities, InWarriorASCToGive, ApplyLevel);
}
void UDataAsset_StartUpDataBase::GrantAbilities(const TArray<TSubclassOf<UWarriorGameplayAbility>>& InAbilitiesToGive,
UWarriorAbilitySystemComponent* InWarriorASCToGive, int32 ApplyLevel)
{
if (InAbilitiesToGive.IsEmpty()) return;
for (const TSubclassOf<UWarriorGameplayAbility>& Ability : InAbilitiesToGive)
{
if (! Ability) continue;
FGameplayAbilitySpec AbilitySpec(Ability); //设置技能类引用
AbilitySpec.SourceObject = InWarriorASCToGive->GetAvatarActor(); //指定技能源对象为角色Avatar
AbilitySpec.Level = ApplyLevel; //配置技能初始等级
InWarriorASCToGive->GiveAbility(AbilitySpec); //将技能授予目标组件
}
}
这段代码实现了在Unreal Engine的Gameplay Ability System(GAS)中批量授予技能的功能,主要逻辑如下:
参数说明
InAbilitiesToGive
:需要授予的技能类数组InWarriorASCToGive
:目标角色的技能系统组件ApplyLevel
:技能初始等级
核心流程
- 检查技能数组是否为空,为空则直接返回
- 遍历技能数组,跳过无效的技能类
- 为每个技能创建
FGameplayAbilitySpec
结构体实例:- 设置技能类引用
- 指定技能源对象为角色Avatar
- 配置技能初始等级
- 通过
GiveAbility
方法将技能授予目标组件
关键设计
- 使用数据资产(
UDataAsset_StartUpDataBase
)集中管理技能配置 - 支持批量授予多个技能
- 可统一设置技能等级
- 通过技能系统组件管理技能生命周期
典型应用场景
- 角色初始化时加载默认技能
- 装备系统附加新技能
- 升级时提升技能等级
该实现体现了GAS推荐的技能管理模式,将技能配置与逻辑分离,便于后期维护和扩展。
2.生成子类:DataAsset_HeroStartUpData
创建它的蓝图子类:

配置资产:
