虚幻GAS底层原理解剖五 (AS)


前言

深入了解 Ability System(技能系统) 的实现原理,就从底层结构、执行流程、网络同步,到触发机制逐层拆解。这个系统是 GAS(Gameplay Ability System) 的核心,用于管理技能的激活、执行、冷却、条件判断、资源消耗等一整套流程。

一、Ability System 的核心组成

模块说明关键类
技能对象描述技能逻辑和行为UGameplayAbility
技能组件技能容器和调度器UAbilitySystemComponent (ASC)
技能上下文封装调用信息FGameplayAbilitySpec, FGameplayAbilityActorInfo
技能任务蓝图中组合行为UAbilityTask
技能标签控制是否可激活/中断等FGameplayTag, FGameplayTagContainer

二、UGameplayAbility:技能定义类

每一个技能都继承自 UGameplayAbility 类,你可以在其中定义:
技能类型(Instant / Duration / Channeling)
激活条件
技能行为(动画、GE 应用、移动等)

生命周期关键函数:

virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle,
                              const FGameplayAbilityActorInfo* ActorInfo,
                              const FGameplayAbilityActivationInfo ActivationInfo,
                              const FGameplayEventData* TriggerEventData) override;

virtual void EndAbility(...) override;
virtual void CancelAbility(...) override;

三、技能的注册与初始化机制

技能本身并不自动存在于角色身上,只有注册到 AbilitySystemComponent(ASC)中,才能使用。

添加技能流程:

FGameplayAbilitySpec Spec = FGameplayAbilitySpec(AbilityClass, Level, InputID);
ASC->GiveAbility(Spec);
ASC->InitAbilityActorInfo(OwnerActor, AvatarActor);
  1. 每个技能对应一个 FGameplayAbilitySpec
  2. ASC 会创建该技能类的实例,绑定输入等

四、技能激活执行流程(详细调用链)

激活流程概览(通过蓝图 or 代码):

↓ 玩家按键(Input)
↓ ASC 调用 TryActivateAbility()
↓ 检查:激活条件(如 Tag、资源)
↓ 调用 Ability->ActivateAbility()
↓ AbilityTask 执行实际行为
↓ ApplyGE、WaitTarget、WaitGameplayEvent 等
↓ EndAbility() or CancelAbility()

五、FGameplayAbilitySpec:技能运行体

它记录每个技能的运行状态,包括:

struct FGameplayAbilitySpec {
  UGameplayAbility* Ability;     // 技能对象
  int32 Level;
  bool bIsActive;
  FGameplayAbilityActivationInfo ActivationInfo;
  FGameplayAbilitySpecHandle Handle;
  TArray<UGameplayAbility*> ReplicatedInstances; // 网络同步用
};

一个技能可以有多个激活实例(如 DOT 技能多段激活)

六、技能输入绑定与触发原理

在 GAS 中,技能并不会直接响应输入,而是通过 InputID 实现:

FGameplayAbilitySpec Spec(MyAbility, 1, InputID);
ASC->GiveAbility(Spec);

然后再调用:

ASC->AbilityLocalInputPressed(InputID);
ASC->TryActivateAbilityByClass(MyAbilityClass);

或者你可以使用 Enhanced Input 系统绑定并传递到 ASC。

七、冷却 & 消耗机制

GAS 并不会自动实现冷却或消耗,但它提供了强大的数据驱动方式支持这两者:

方法一:使用 GE 管理冷却时间

Ability->CooldownGameplayEffectClass = UMyCooldownGE;

这个 GE 会:

  1. 授予角色 Cooldown.X 标签
  2. 设置持续时间(冷却时间)
  3. 在标签存在期间,禁止技能再次激活

方法二:使用 GE 管理消耗(蓝、体力)

Ability->CostGameplayEffectClass = UMyCostGE;

GE 的 Modifier 会减少 Mana、Stamina 属性

八、技能任务(Ability Task)机制

在 Blueprint 中你通过 Ability Task 来拼接技能逻辑,如:

WaitTargetData
↓
ApplyGameplayEffectToTarget
↓
WaitGameplayEvent
↓
EndAbility

任务类都继承自 UAbilityTask,例如:

UAbilityTask_WaitGameplayEvent
UAbilityTask_WaitDelay
UAbilityTask_ApplyRootMotion

你也可以自定义 Task,实现定制的技能行为流程。

九、网络同步原理

GAS 是高度权威服务器驱动,技能同步由服务器控制,客户端只能请求。

流程概览:

阶段处理方式
激活请求客户端调用 ServerTryActivateAbility()
技能执行服务端执行 ActivateAbility(),广播 GE、动画等
结果同步ASC 同步 GE、属性变化、状态标签等到客户端
任务通知AbilityTask 自动使用 RPC 或事件广播通知客户端完成状态

例如,客户端看到技能动画,是服务器同步结果,而非本地执行。

十、技能中断与多技能管理机制

GAS 支持多技能并发、互斥、可打断机制:

技能互斥机制:

ActivationBlockedTags = Status.Stunned
CancelAbilitiesWithTag = Ability.Magic

中断机制:

Ability->EndAbility(CurrentSpecHandle, ActorInfo, ActivationInfo, true, false);

当 GE 加上一个如 Status.Stunned 的标签时,系统会自动取消与之冲突的技能。

十一、技能条件控制:标签、资源、状态

GAS 的技能激活控制非常精细化:

类型控制手段
状态阻断ActivationBlockedTags
状态需求ActivationRequiredTags
属性需求在 CheckCost() 中判断属性值(如蓝是否足够)
自定义逻辑重写 CanActivateAbility() 进行复杂条件

十二、总结:Ability System 的核心价值

模块功能优点
UGameplayAbility技能逻辑定义支持蓝图 + C++
FGameplayAbilitySpec技能状态跟踪可动态添加、修改等级
ASC技能执行入口支持网络同步、GE 应用
AbilityTask技能逻辑拼装像写脚本一样设计技能
GE + Tag数据驱动限制条件易维护、组合灵活

示例:完整技能流程(如“火球术”)

  1. 玩家按下 Q → 调用 ASC->TryActivateAbility
  2. 系统检查:是否沉默?是否在冷却?
  3. 激活后播放动画 → 发射子弹
  4. 命中目标 → ApplyGameplayEffectToTarget(造成伤害)
  5. 给自己添加 Cooldown.Fireball GE(冷却)
  6. 技能生命周期结束
### 虚幻引擎中的GAS(Gameplay Ability System) #### GAS的核心功能 Gameplay Ability System (GAS)虚幻引擎的一个内置插件,提供了强大的框架来实现角色技能、属性系统以及状态效果等功能。它支持复杂的数值计算、能力消耗与冷却机制,并集成了网络同步和预测功能[^3]。 #### 插件激活 要在项目中使用 GAS,需先在插件管理器中启用该插件。一旦启用,可以通过 `AbilitySystemComponent` 来管理和执行各种能力和属性操作。 #### 主要组成部分 1. **Abilities(能力)** Abilities 定义了游戏中可触发的行为或动作,例如攻击、施法或其他交互行为。它们通常绑定到特定输入事件并具有自己的逻辑脚本。每个 Ability 可以设置资源成本(如生命值或能量)、持续时间及冷却周期。 2. **Attributes(属性)** Attributes 表示实体的基础数据项,比如健康度、耐力或者力量等级等。这些动态变化的数据由 `AttributeSet` 类型定义并通过 `AbilitySystemComponent` 进行更新维护。 3. **Effects(效果)** Effects 用于描述当某个条件满足时所发生的变化,可能涉及修改目标单位的一系列参数或是附加特殊标记(Tag)。常见的例子有伤害加成、减速惩罚等等。 4. **Gameplay Tags 和 Gameplay Events** - **Gameplay Tags**: 提供了一种灵活的方式来分类和检索游戏内的元素。几乎所有的核心结构都支持关联标签以便于查询匹配。 - **Gameplay Events**: 允许广播自定义消息给监听者列表从而驱动复杂互动链路的发生发展过程。 5. **Network Replication & Prediction** 鉴于多人在线环境下的需求考量,GAS 设计之初就充分考虑到了跨客户端间一致性保障的重要性,因此包含了完备可靠的网路传输解决方案. #### 示例代码展示如何创建简单的Skill System基于GAS: ```cpp // MyCharacter.h UCLASS() class MYPROJECT_API AMyCharacter : public ACharacter { GENERATED_BODY() public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") UAbilitySystemComponent* AbilitySystemComp; protected: virtual void BeginPlay() override; }; // MyCharacter.cpp #include "MyCharacter.h" #include "AbilitySystemBlueprintLibrary.h" AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer) { AbilitySystemComp = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystemComp")); } void AMyCharacter::BeginPlay() { Super::BeginPlay(); if(AbilitySystemComp && HasAuthority()) { // Grant abilities on server side only. FGameplayAbilitySpecDef SpecDef; SpecDef.Ability = StaticClass()->FindFunctionByName(FName(TEXT("ExecuteBasicAttack"))); SpecDef.InputID = EInputAction::IA_BasicAttack; // Assuming you have this enum defined elsewhere const TArray<FGameplayEffectContextHandle> ContextHandles; AbilitySystemComp->GiveAbility(SpecDef); // Initialize default attributes here... } } ``` 上述片段展示了怎样在一个继承自ACharacter类的新角色身上添加基本战斗技巧的能力授予方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值