当前位置: 首页 > 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.lryc.cn/news/611949.html

相关文章:

  • 常见的大模型分类
  • #3:Maven进阶与私服搭建
  • 面试问题11
  • 用html写一个类似于postman可以发送请求
  • PyCharm vs. VSCode 到底哪个更好用
  • 面试题:基础的sql命令
  • 使用Nginx部署前后端分离项目
  • AS32S601 芯片 ADC 模块交流耦合测试:技术要点与实践
  • 大前端游戏应用中 AI 角色行为智能控制
  • AdGuard 安卓修改版:全方位广告拦截与隐私保护专家
  • webrtc弱网-OveruseFrameDetector源码分析与算法原理
  • Template 显式实例化 隐式实例化
  • C++之vector类的代码及其逻辑详解 (下)
  • java学习 leetcode24交换链表节点 200岛屿数量 +一些开发任务
  • win10/11网络防火墙阻止网络连接?【图文详解】防火墙阻止连接网络的解决方法
  • 最新教程 | CentOS 7 下 MySQL 8 离线部署完整手册(含自动部署脚本)
  • 【MyBatis新手避坑】详解 `Could not find resource ...Mapper.xml` 错误
  • 从博客到播客:文本转音频的全流程技术点
  • C++ - 仿 RabbitMQ 实现消息队列--网络通信协议设计
  • DOM的XML命名空间革命:从混乱到有序的蜕变
  • IP与MAC地址的区别解析
  • OpenAI重磅推出开源模型!gpt-oss-120b与20b全面解析
  • OpenAI/gpt-oss开源模型部署与使用全指南
  • OpenAI 开源GPT OSS系列模型
  • 小实验--震动点灯
  • GPT-OSS 与 Ollama 完整安装使用教程
  • 【JavaEE】(8) 网络原理 HTTP/HTTPS
  • NWinfo(硬件信息检测工具)v1.4.20绿色免费版,U盘随走随检,结果即刻导出
  • DM数据库的安全版本SYSDBA无法修改其他用户密码?
  • 基于串口实现可扩展的硬件函数 RPC 框架(附完整 Verilog 源码)