Calmer的文章

  • 首页
  • 文章归档
  • 关于页面

  • 搜索
体验游戏 笔记 推荐 工具链 工具使用 小游戏 插件 UI 软件 教程

UE5中GAS框架使用随笔

发表于 2024-08-30 | 分类于 随笔 | 2 | 阅读次数 1270

在过往的开发中,采用了GAS框架作为整个游戏的能力框架,因此在接触和学习过程中有了些思考,这里作为一篇随笔记录

一、框架的设计思考

GAS技能框架的分工

  1. 程序:提供逻辑功能节点
    BPLibrary、AT、GEEC(公式相关)、Montage通知点、技能效果逻辑类
  2. 策划:配置GA、GE、GC、Tag、配置表
  3. 美术:提供Montage、粒子特效等

二、实战开发

1. GameplayAbility

GA的理解

任何的事物都可以作为一种能力(技能)
例如:攻击的能力、开门的能力、与NPC对话的能力、上下坐骑的能力

常见标准主动动作技能(ARPG游戏中)

  • 赋予能力,InputID与Ability进行Bind,用于判定技能的再激活和长按蓄力等
  • Try激活能力
  • Check:冷却,消耗,状态(Tag)等
  • WaitTargetData:等待玩家选择目标,客户端输入
  • Play Montage(动作表现、特效等)
  • 监听Montage抛来的通知,触发技能效果:GE/GC/Event

被动能力

  • 触发器:暴击触发、受击触发、命中触发等...
  • 比较器:血量低于30%、处于某状态...
  • 效果器
    • GE效果:Buff、状态(Tag)
    • GC:特效
    • 抛出Event:处理自定义逻辑

2. GameplayTag

分类

  • 能力的标签:Ability.xxx.xxx
  • 表现的标签:GameplayCue.xxx.xxx
  • 冷却的标签:Cooldown.xxx.xxx
  • 事件的标签:Event.xxx.xxx
  • 状态的标签:State.xxx.xxx
    例如:State.Disable.xxx;State.Resist.xxx;State.World.xxx;
  • AI的标签:AI.xxx.xxx
  • 测试的标签:Test.xxx.xxx

建议:统一使用GA、GE去操作标签的变化

3. GameplayEffect

统一管理操作标签(状态)和属性(AS),便于Bug的排查
例如:给玩家上中毒状态、给玩家扣血

4. Attribute(属性)

BaseValue和CurrentValue

统一使用GE去操作属性的变化

当属性值过多时,需要属性生成工具

生成要点:

  • 定义属性
    image.png
  • 定义OnRep方法
    image.png
  • 实现OnRep方法
    image.png
  • GetLifetimeReplicatedProps方法中加入新的属性
    image.png

5. GameplayCue

产生特效表现、摄像机抖动、伤害飘字
例如:命中后飙血特效、中毒后添加中毒特效等

6. AbilityTask

一些异步任务
例如等待玩家输入、等待网络同步、等待玩家选择目标,等待标签添加等

7. Prediction

GA、GE、AS等预测
Montage网络同步


三、开发问题

1. 如果在服务器上执行一个Duration的GE,修改了属性,在客户端上监听此属性变更,能监听到,但是从函数参数中取得的数值都是基础值,获得错误?

这里可以通过ASC去获取CurrentValue
1.png

2.GE如果直接New出来的,在网络上没法复制Tag,因为使用的是CDO

解决方案是:使用工具批量生成GE蓝图资源或者通过ASC直接调用可复制标签的方法
但是直接通过New出来的GE,可以用来修改属性,因为属性数值本身是可复制的

  • 标签可网络复制添加调用
    2.png
  • 标签本地添加调用
    3.png

3. 技能的上下文数据存储

在进行技能公式伤害计算时,常用到以下3种数据

  1. Capture的属性值
  2. 配置数据(蓝图、DataTable)
  3. 临时动态数据(随机产生暴击)

4. 标签和状态关联技巧

  • bool2tag
    例如在GA中,勾选了bIsMelee标记此GA为近战类型,需要增加标签Ability.AbilityType.Melee
    则可以重写PreSave方法,然后在编辑器勾选了GA中对应bool值后进行保存操作,即可添加标签。这里给出单一条件判断,而往往会有更为复杂的复合判断去进行标签管理。
    4.png
  • tag2bool
    直接通过ASC中HasMatching相关方法,就可以将tag转为bool值
    5.png

5. GA监听事件、标签的方法

  1. 赋予GA,在GA列表设置监听的事件或标签
    6.png
  2. 赋予GA时激活,执行AT等待
    7.png
    两者不同在于,前者技能属于未激活状态,后者一个技能是激活状态
    例如,等待玩家选择目标,等待标签添加等。

6. GameplayEvent与GameplayTag在GAS中的运用区别

GameplayEvent大部分是瞬时的
GameplayTag可以监听添加和删除的瞬时状态,还有持续的一个状态


总结

其实在框架设计过程,都是对现实事务的一个抽象过程,怎么让这个过程更加的有规律、容易理解。从实践中来再到实践中去,遇到重复性高的流程,会想到找出流程的规律,总结标准的流程,再不断的精简,从而得出一套高复用性框架。


参考文档、项目

插件文档:https://github.com/tranek/GASDocumentation
参考项目:Lyra,ActionRPG,GASShotter,GASDocumentation

  • 本文作者: Calmer
  • 本文链接: https://mytechplayer.com/archives/ue5中gas框架使用随笔
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
UE5人物移动浅析(一)
UE5局部资源打包方案
  • 文章目录
  • 站点概览
Calmer

Calmer

88 日志
7 分类
10 标签
RSS
Creative Commons
0%
© 2020 — 2025 Calmer
由 Halo 强力驱动
蜀ICP备20010026号-1川公网安备51019002006543
Copyright © 2020-2025 Calmer的文章