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

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

文章目录

  • 前言
  • 一、Ability System 的核心组成
  • 二、UGameplayAbility:技能定义类
  • 三、技能的注册与初始化机制
  • 四、技能激活执行流程(详细调用链)
  • 五、FGameplayAbilitySpec:技能运行体
  • 六、技能输入绑定与触发原理
  • 七、冷却 & 消耗机制
  • 八、技能任务(Ability Task)机制
  • 九、网络同步原理
  • 十、技能中断与多技能管理机制
  • 十一、技能条件控制:标签、资源、状态
  • 十二、总结:Ability System 的核心价值
  • 示例:完整技能流程(如“火球术”)


前言

深入了解 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. 技能生命周期结束
http://www.xdnf.cn/news/1249669.html

相关文章:

  • 设计模式—桥梁模式(Bridge)
  • Spring Boot全局异常处理与日志监控实战指南
  • 华硕携多款明星电竞显示器亮相 ChinaJoy2025,联袂 TCL 华星打造沉浸体验
  • 鼠标下滑时回跳问题
  • 从 “认知优势” 到现实赋能:DPVR AI Glasses 重构智能穿戴价值
  • Chrontel昆泰-【CH7036A-BF】CH7036 LVDS to HDMI/VGA/LVDS Converter
  • 4、docker数据卷管理命令 | docker volume
  • docker run 入门到进阶:容器启动背后的门道
  • C++音视频流媒体开发面试题:音视频基础
  • 什么是RabbitMQ?
  • OpenObserve非sql模式 query editor 中 xx like ‘|’报错如何处理
  • mysql 8递归查询
  • 科技云报到:Agent应用爆发,谁成为向上托举的力量?
  • 网络编程epoll学习
  • UE编辑器相机窗口运行时相机fov 大小不一致
  • Vue Router 路由的创建和基本使用(超详细)
  • 手动开发一个TCP服务器调试工具(二):无界面 TCP 通信服最小实现
  • Linux网络编程基础-简易TCP服务器框架
  • 大前端游戏应用中 AI 角色行为智能控制
  • 网站、域名、IP在什么场景下需要备案
  • Fabric.js从入门学习到实现labelImg矩形多边形标注工具【上】
  • SmartMediaKit 模块化音视频框架实战指南:场景链路 + 能力矩阵全解析
  • ICCV 2025 | 视频生成迈入“多段一致”新时代!TokensGen用“压缩Token”玩转长视频生成
  • GPU 优化-用 tensor core实现5G Massive MIMO 64x64
  • Linux系统之Docker命令与镜像、容器管理
  • nginx代理出https,request.getRequestURL()得到http问题解决
  • imx6ull-驱动开发篇10——pinctrl 子系统
  • 福彩双色球第2025090期篮球号码分析
  • 生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践
  • Spring之【初识AOP】