本文介绍了虚幻引擎GAS(GameplayAbilitySystem)中自定义GameplayAbility的实现方法,主要处理技能的自动激活和移除逻辑。核心内容包括:创建枚举定义两种技能激活策略(OnTriggered事件触发和OnGiven授予时自动激活);重写父类函数OnGiveAbility实现授予时自动激活逻辑,通过AbilitySystemComponent尝试激活技能;重写EndAbility实现技能结束时自动移除逻辑。该设计采用策略模式,通过枚举控制技能激活方式,完整实现了"赋予-激活-结束-移除"的生命周期管理,适用于被动技能和临时效果等场景,体现了GAS的组件化设计和状态管理机制。
1.GAS给予角色能力的流程:

2.
OnTriggered: 通过某种事件触发能力
OnGiven:给予能力后立刻触发
3.创建C++类:


4.创建一个枚举:游戏能力激活策略
Source/Warrior/Public/AbilitySystem/GameplayAbilities/WarriorGameplayAbility.h:
//枚举:游戏能力激活策略
UENUM(BlueprintType)
enum class EWarriorAbilityActivationPolicy :uint8
{
OnTriggered,
OnGiven
};
5.创建变量
protected:
// 游戏能力激活策略
UPROPERTY(EditDefaultsOnly, Category="WarriorAbility")
EWarriorAbilityActivationPolicy AbilityActivationPolicy = EWarriorAbilityActivationPolicy::OnTriggered;
6.重写父类函数:
protected:
//~Begin GameplayAbility Interface
virtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo,const FGameplayAbilitySpec& Spec) override;
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle,const FGameplayAbilityActorInfo* ActorInfo,const FGameplayAbilityActivationInfo ActivationInfo,bool bReplicateEndAbility,bool bWasCancelled) override;
//~End GameplayAbility Interface
Source/Warrior/Private/AbilitySystem/GameplayAbilities/WarriorGameplayAbility.cpp:
void UWarriorGameplayAbility::OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilitySpec& Spec)
{
Super::OnGiveAbility(ActorInfo, Spec);
if (AbilityActivationPolicy == EWarriorAbilityActivationPolicy::OnGiven)
{
if (ActorInfo && !Spec.IsActive())
{
ActorInfo->AbilitySystemComponent->TryActivateAbility(Spec.Handle);
}
}
}
这段代码是虚幻引擎GAS(Gameplay Ability System)中自定义GameplayAbility类的实现,主要处理技能被赋予时的自动激活逻辑。以下是关键点分析:
核心功能:
- 当技能被赋予(OnGiveAbility)时,检查AbilityActivationPolicy是否为OnGiven策略
- 满足条件时通过AbilitySystemComponent尝试激活技能(TryActivateAbility)
- 避免重复激活(!Spec.IsActive()检查)
参数说明:
- FGameplayAbilityActorInfo包含OwnerActor、AvatarActor等关键角色信息
- FGameplayAbilitySpec存储技能实例数据如Handle和激活状态
- AbilitySystemComponent是技能系统的核心组件
设计模式:
- 实现被动技能自动激活的典型方案
- 常用于无需玩家输入触发的常驻效果(如光环类技能)
- 通过EWarriorAbilityActivationPolicy枚举实现策略模式
该实现体现了GAS的核心机制:技能生命周期管理、组件化设计和策略模式应用。
Source/Warrior/Private/AbilitySystem/GameplayAbilities/WarriorGameplayAbility.cpp:
void UWarriorGameplayAbility::EndAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
bool bReplicateEndAbility, bool bWasCancelled)
{
Super::EndAbility(Handle, ActorInfo, ActivationInfo, bReplicateEndAbility, bWasCancelled);
if (AbilityActivationPolicy == EWarriorAbilityActivationPolicy::OnGiven)
{
if (ActorInfo)
{
ActorInfo->AbilitySystemComponent->ClearAbility(Handle);
}
}
}
这段代码是虚幻引擎GAS(Gameplay Ability System)中自定义GameplayAbility的结束逻辑实现,主要处理技能结束时根据激活策略自动移除技能。以下是关键点分析:
核心逻辑:
- 当技能激活策略(AbilityActivationPolicy)为OnGiven时,在技能结束时自动调用ClearAbility移除技能
- 通过AbilitySystemComponent执行技能清除操作,确保网络同步
- 包含安全校验(ActorInfo判空)和策略判断双重保护
参数说明:
- Handle用于唯一标识技能实例
- ActorInfo包含OwnerActor等关键角色信息
- bReplicateEndAbility控制是否网络同步结束状态
- bWasCancelled标识是否被强制取消
设计模式:
- 实现一次性被动技能的典型方案
- 常用于触发后立即移除的临时效果(如消耗类技能)
- 通过EWarriorAbilityActivationPolicy枚举实现策略模式
该实现体现了GAS的两个重要特性:
1)技能生命周期需显式管理;
2)AbilitySystemComponent作为核心处理器统一管理技能状态。与OnGiveAbility配合使用时,可构成完整的"赋予-激活-结束-移除"流程。
7.创建蓝图子类:


打开蓝图,改变激活策略:

完美!
1781

被折叠的 条评论
为什么被折叠?



