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

文章目录

  • 前言
    • [GAS(Gameplay Ability System)是虚幻引擎(Unreal Engine)用于实现角色技能、效果和战斗逻辑的强大框架,广泛应用于RPG、MOBA、FPS 等游戏中。你提到想深入理解 GAS 的底层原理,特别是 GE(GameplayEffect)是如何实现的,我们就从核心架构说起,逐层展开。](#GAS(Gameplay Ability System)是虚幻引擎(Unreal Engine)用于实现角色技能、效果和战斗逻辑的强大框架,广泛应用于RPG、MOBA、FPS 等游戏中。你提到想深入理解 GAS 的底层原理,特别是 GE(GameplayEffect)是如何实现的,我们就从核心架构说起,逐层展开。)
  • [一、GAS 底层架构概览](#一、GAS 底层架构概览)
  • 二、底层原理详解
  • [三、GE(Gameplay Effect)实现原理](#三、GE(Gameplay Effect)实现原理)
    • [1. GE 的创建与应用流程](#1. GE 的创建与应用流程)
    • [2. GE 的内部结构](#2. GE 的内部结构)
  • 四、属性如何更新与同步
  • [五、Execution Calculation 是实现伤害计算的关键](#五、Execution Calculation 是实现伤害计算的关键)
  • [六、例子:造成伤害 GE 的生命周期](#六、例子:造成伤害 GE 的生命周期)
  • 七、开发建议

前言

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。

二、底层原理详解

:
注册属性集合:通过 InitStats() 注册 UAttributeSet(如生命、蓝量等)

复制代码
持有所有 Ability 和 GE 的上下文:包括冷却、施放状态等   

处理 RPC / 网络同步:自动在客户端/服务器同步 GE 和属性变化

:
是一个 Blueprint/C++ 类,可以触发、取消、冷却技能

复制代码
可以使用 WaitGameplayEvent, WaitTargetData, ApplyGameplayEffectToTarget 等 Task 节点组合逻辑   

生命周期核心函数:
cpp 复制代码
virtual void ActivateAbility(...) override;
virtual void EndAbility(...) override;

三、GE(Gameplay Effect)实现原理

1. GE 的创建与应用流程

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

cpp 复制代码
// 伪代码
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 的内部结构

cpp 复制代码
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 结构体 → 自动同步
cpp 复制代码
UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing = OnRep_Health)
FGameplayAttributeData Health;

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

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

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

cpp 复制代码
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
相关推荐
mxwin11 小时前
Unity URP 法线贴图色彩空间、编码与解码
unity·游戏引擎·贴图·shader
玖玥拾14 小时前
Cocos学习笔记:项目框架搭建与异步加载进度
游戏引擎·cocos2d
mxwin14 小时前
Unity Shader URP:将法线可视化,便于调试
unity·游戏引擎·shader
蓝黑墨水15 小时前
unity相关链接
unity·游戏引擎
mxwin15 小时前
Unity Shader 法线贴图的七种错误用法
unity·游戏引擎·贴图·shader
mxwin18 小时前
Unity URP 切线空间详解
unity·游戏引擎·shader
caimouse1 天前
Godot Engine 最新版官方文档(简体中文完整翻译 & 精简梳理)
游戏引擎·godot
huizhixue-IT1 天前
Superpowers 游戏引擎从零开发实战指南
游戏引擎
做cv的小昊2 天前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
玖玥拾2 天前
Cocos学习笔记:序列化、配置文件与数据驱动
游戏引擎·cocos2d