当前位置: 首页 > news >正文

虚幻GAS底层原理解剖七 (ASC)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、ASC 的基本角色与定位
  • 二、ASC 的核心数据结构
  • 三、ASC 生命周期与初始化流程
  • 四、技能激活流程(ASC 的调用链)
  • 五、GameplayEffect 应用机制(GE 应用链)
  • 六、Attribute 系统的集成与更新
  • 八、网络同步核心原理(关键)
  • 九、事件与回调系统
  • 十、常用扩展点和重写函数
  • 十一、总结:ASC 是 GAS 的神经中枢
  • 附加建议


前言

UAbilitySystemComponent(ASC)是整个 GAS(Gameplay Ability System) 框架的 核心中枢组件,它统筹:

  1. Ability 注册、激活、执行、冷却
  2. AttributeSet 和属性同步
  3. GameplayEffect 应用与管理
  4. GameplayTag 的持有与同步
  5. 网络同步(技能发起与结果确认)

下面将从 架构设计、关键数据结构、生命周期、能力激活流程、GE 应用机制、属性修改、网络同步 等维度,逐层剖析 ASC 的底层实现原理。

一、ASC 的基本角色与定位

每个游戏角色(Player、AI)通常都拥有一个 ASC,它是 GAS 的“大脑”,连接了所有子系统:

角色Pawn└── AbilitySystemComponent (ASC)├── AttributeSet(多个)├── GameplayAbilities(FGameplayAbilitySpec 列表)├── ActiveGameplayEffectsContainer├── GameplayTagContainer(Owned Tags)├── PredictionKey / Net Serialization

其职责:

功能说明
注册技能动态添加/移除技能能力
激活技能管理技能生命周期
应用GE管理 GE 的生命周期和作用
管理属性注册/读写 AttributeSet 属性
持有标签储存当前状态标签(Stun、Invisible)
网络同步客户端预测、服务端授权、Delta同步

二、ASC 的核心数据结构

  1. TArray ActivatableAbilities
    每个元素代表一个技能(UGameplayAbility 的实例化)
    包含等级、输入绑定、冷却状态、是否激活中等信息

  2. FActiveGameplayEffectsContainer ActiveGameplayEffects
    所有施加在该角色身上的 GE
    会 Tick 持续型 GE,并触发属性变更

  3. TArray<UAttributeSet*> SpawnedAttributes
    所有注册到 ASC 的属性集合(生命、攻击、速度等)

  4. FGameplayTagContainer OwnedTags
    当前角色持有的状态标签
    被 GE、GA、外部逻辑动态添加/移除

  5. FPredictionKey, FScopedPredictionWindow
    网络同步所用的预测机制结构

三、ASC 生命周期与初始化流程

初始化步骤:

// 1. ASC 初始化
ASC->InitAbilityActorInfo(OwnerActor, AvatarActor);// 2. 注册属性
UAbilitySystemGlobals::Get().InitGlobalData();
ASC->AddAttributeSetSubobject(MyAttributeSet);// 3. 注册能力
ASC->GiveAbility(FGameplayAbilitySpec(AbilityClass, Level, InputID));

初始化完成后,ASC:

  1. 与角色绑定
  2. 知道谁是实际拥有者(Owner)、视觉表现者(Avatar)
  3. 可以接收输入、处理 GE、修改属性、同步网络

四、技能激活流程(ASC 的调用链)

激活流程入口:

bool ASC->TryActivateAbility(FGameplayAbilitySpecHandle Handle, ...)

执行流程如下:

→ 校验条件(冷却、资源、标签等)
→ 调用 Ability->CanActivateAbility()
→ 调用 Ability->ActivateAbility()
→ 使用 AbilityTask 执行技能逻辑
→ EndAbility / CancelAbility

如果绑定了输入(InputID),可通过:

ASC->AbilityLocalInputPressed(InputID);

或通过 EnhancedInput 系统传入。

五、GameplayEffect 应用机制(GE 应用链)

应用 GE 的关键调用:

ASC->ApplyGameplayEffectToTarget(Spec, TargetASC);

流程如下:

→ 构建 FGameplayEffectSpec
→ 调用 ASC::ApplyGameplayEffectSpecToSelf / ToTarget
→ 放入 ActiveGameplayEffectsContainer
→ 执行 Modifier(属性修改器)
→ 触发 AttributeSet 中的 PostGameplayEffectExecute()
→ 网络同步属性变更、标签添加

持续型 GE 会定期 Tick,直到到期或被移除。

六、Attribute 系统的集成与更新

ASC 负责:

  1. 读取 AttributeSet 中属性(通过 FGameplayAttribute 引用)
  2. 计算所有 GE 修改后的最终值(通过 FAggregator)
  3. 使用 NetDeltaSerialize 同步属性变化

调用示例:

float Health = ASC->GetNumericAttribute(HealthAttribute);
ASC->SetNumericAttributeBase(HealthAttribute, 100.f);

对于属性变化,ASC 会通知客户端并触发 UI 刷新、动画等。

🔄 七、GameplayTag 的管理机制
ASC 中维护一组“已拥有的标签”:

FGameplayTagContainer OwnedTags;

这些标签可由以下方式变动:

  1. ASC->AddLooseGameplayTag(Tag)
  2. GE 的 GrantedTags、RemoveTags
  3. Ability 激活自动添加/移除的标签

可以用来:

  1. 阻止技能激活(如 Stun)
  2. 取消技能(如 Silenced)
  3. 驱动 UI 显示(如变灰)

八、网络同步核心原理(关键)

ASC 的网络同步分为三类:

同步项技术特点
属性NetDeltaSerialize + OnRep高效压缩同步
GE 应用GE Handle 结构体复制客户端看到 GE 视觉表现
技能激活客户端预测 + 服务端确认ServerTryActivateAbility()

ASC 中的 PredictionKey 和 FScopedPredictionWindow 负责预测控制:

FScopedPredictionWindow Predict(ASC); // 自动处理 Key
ASC->ServerTryActivateAbility(Handle, Predict.Key);

客户端“预测”执行动画、GE 等,如果服务器否定,则回滚。

九、事件与回调系统

ASC 提供一套事件系统,供外部模块监听:

委托函数用途
OnGameplayEffectAppliedDelegateToSelf自己被施加 GE
OnGameplayAbilityEnded技能结束
OnAnyAttributeChange任意属性变化
OnTagChangedDelegate标签变化通知

开发者可以在角色类或 UI 层绑定这些委托,驱动动画、声音、UI。

十、常用扩展点和重写函数

你可以重写以下函数来扩展 ASC 行为:

函数说明
ApplyGameplayEffectSpecToSelf()自定义 GE 应用逻辑
GetGameplayAttributeValue()属性值读取逻辑
CanActivateAbility()技能激活前校验
NotifyAbilityEnded()技能结束时做 cleanup
RemoveActiveGameplayEffect()手动移除 GE

十一、总结:ASC 是 GAS 的神经中枢

模块功能
技能系统注册、激活、执行、输入响应
效果系统GE 应用、管理、移除、Tick
属性系统属性计算、读取、同步
标签系统状态标识、阻断判断、同步
网络同步能力预测、属性压缩同步
事件广播向外部系统(动画/UI)发出信号

它统一封装了 GameplayAbility 的执行环境与状态机,是真正的“技能运行时容器”。

附加建议

目标实现建议
多个角色共享逻辑使用抽象基类中封装 ASC 初始化和能力注册
UI 实时刷新绑定属性和标签变化事件
Debug 能力激活打印 TryActivateAbility 与 GE 应用情况
角色死亡判定在 PostGameplayEffectExecute 判断 Health <= 0
http://www.dtcms.com/a/319113.html

相关文章:

  • Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎
  • 多场景两阶段分布式鲁棒优化模型、数据驱动的综合能源系统
  • PostgreSQL面试题及详细答案120道(61-80)
  • 59.螺旋矩阵II
  • 恒虚警检测(CFAR)仿真:杂波边缘与多目标场景分析
  • 目标检测数据集 - 疟疾检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 微算法科技(NASDAQ:MLGO)利用集成学习方法,实现更低成本、更稳健的区块链虚拟货币交易价格预测
  • RocketMQ概览
  • Kotlin中String的==相等比较符
  • STM32HAL 快速入门(一):点灯前的准备 —— 从软件安装到硬件原理
  • 利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
  • 思途spring学习0807
  • Java -- Arrays类-- System类-- BigInteger和BigDecimal类
  • 串口通信02 温度传感DS18B20 01 day49
  • jetson上使用opencv的gstreamer进行MIPI和USB摄像头的连接以及udp推流
  • JAVA,Maven分模块设计
  • 语言模型(LM):n-gram模型原理与困惑度(Perplexity)计算详解
  • B-树与B+树
  • AI大模型专题:LLM大模型(初识)
  • dubbo的metadata-report是做啥的
  • 17.11 单卡24G显存微调GLM-4实战:QLoRA到全参数调优,准确率狂飙42.7%
  • Qt: WA_DontCreateNativeAncestors
  • 【缩点 拓扑序】P3119 [USACO15JAN] Grass Cownoisseur G|省选-
  • 【关于Java中==和equals( )和hashCode( )三者异同】
  • 写Rust GPU内核驱动:GPU驱动工作原理简述
  • 【性能测试】---测试工具篇
  • 医疗人效管理新标杆:盖雅工场如何赋能健康服务企业提质增效
  • 「iOS」————自动释放池底层原理
  • CSS包含块与百分比取值机制完全指南
  • 数据分析——Pandas库