虚幻GAS底层原理解剖一(开篇)


前言

GAS(Gameplay Ability System)是虚幻引擎(Unreal Engine)用于实现角色技能、效果和战斗逻辑的强大框架,广泛应用于RPG、MOBA、FPS 等游戏中。你提到想深入理解 GAS 的底层原理,特别是 GE(GameplayEffect)是如何实现的,我们就从核心架构说起,逐层展开。

一、GAS 底层架构概览

GAS的核心分为以下几个组件:

模块名作用关键类
Attribute System属性管理(如血量、攻击力)UAttributeSet, FGameplayAttribute
Ability System技能管理(主动技能、被动技能)UGameplayAbility, UAbilitySystemComponent
Effect System效果系统(如造成伤害、加速等)UGameplayEffect, FGameplayEffectSpec
Tag System标签系统(逻辑判断、触发)FGameplayTag, FGameplayTagContainer
Targeting目标系统(锁定目标等)GameplayAbilityTargetActor

这些模块都由 UAbilitySystemComponent(ASC)统筹管理。每个角色通常都拥有一个 ASC。

二、底层原理详解

1.AbilitySystemComponent 是核心大脑
注册属性集合:通过 InitStats() 注册 UAttributeSet(如生命、蓝量等)
持有所有 Ability 和 GE 的上下文:包括冷却、施放状态等
处理 RPC / 网络同步:自动在客户端/服务器同步 GE 和属性变化
2.GameplayAbility 的执行流程
是一个 Blueprint/C++ 类,可以触发、取消、冷却技能
可以使用 WaitGameplayEvent, WaitTargetData, ApplyGameplayEffectToTarget 等 Task 节点组合逻辑
生命周期核心函数:
virtual void ActivateAbility(...) override;
virtual void EndAbility(...) override;

三、GE(Gameplay Effect)实现原理

1. GE 的创建与应用流程

假设你要对敌人造成伤害:

// 伪代码
FGameplayEffectSpecHandle GEHandle = MakeOutgoingSpec(DamageEffectClass, Level, Context);
ApplyGameplayEffectSpecToTarget(GEHandle, TargetASC);
底层流程如下:
1.MakeOutgoingSpec() 创建 FGameplayEffectSpec
2.内含 伤害数值(Mods)、标签(Tag)、应用时机(DurationPolicy)
3.ApplyGameplayEffectSpecToTarget() 由 ASC 将 Effect 应用到目标 ASC
4.ASC 调用 ExecuteGameplayEffect() → 修改 AttributeSet 中属性
5.自动同步到客户端(NetMulticast)

2. GE 的内部结构

struct FGameplayEffectSpec {
  const UGameplayEffect* Def;          // 指向 Effect 配置
  FGameplayEffectContextHandle Context;
  TArray<FModifierSpec> Modifiers;     // 多个属性修改器
  FGameplayTagContainer GrantedTags;   // 授予目标的标签
  DurationPolicy Duration;             // 持续类型(Instant, Duration, Infinite)
};

Modifier 定义了:修改哪个属性、用什么运算符(Add、Mult、Override)、值是多少
ExecutionCalculation:自定义复杂公式(如暴击、抗性)
ModifierMagnitude 可绑定到 Attribute, CurveTable, Custom Calculation

四、属性如何更新与同步

属性更新流程(以造成伤害为例)
1.GE 修改了属性(如 Health)
2.ASC 调用 PostGameplayEffectExecute(),触发逻辑(如死亡、UI更新)
3.NetDeltaSerialize + FGameplayAttributeData 结构体 → 自动同步
UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing = OnRep_Health)
FGameplayAttributeData Health;

这比手动 RPC 更高效且自动。

五、Execution Calculation 是实现伤害计算的关键

如果伤害公式复杂(如暴击 = 基础伤害 * (1+暴击率) - 护甲),推荐用:

class UMyDamageExecution : public UGameplayEffectExecutionCalculation

Override Execute_Implementation
读取属性(攻、防、暴击等)
写入 Modifier 输出

这样实现就类似于一个数据驱动的“脚本”系统。

六、例子:造成伤害 GE 的生命周期

  1. 玩家点击攻击键 → 触发 UGameplayAbility::ActivateAbility()

  2. 调用 ApplyGameplayEffectToTarget() 应用伤害 GE

  3. 创建 FGameplayEffectSpec → 带有攻击力、标签等上下文

  4. 应用到目标 ASC

  5. 修改 Health,判断是否死亡

  6. 同步属性给客户端 → 刷新 UI 血条

七、开发建议

需求建议做法
批量技能配置用 DataTable 驱动 GA/GE 生成
自定义技能逻辑GA 中组合多个 Task 执行
多人游戏同步ASC、AttributeSet 均支持 Replication
限制 GE 应用条件用 Tag 限制、或 ConditionalGameplayEffect
### 虚幻引擎中的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、付费专栏及课程。

余额充值