在过往的开发中,采用了GAS框架作为整个游戏的能力框架,因此在接触和学习过程中有了些思考,这里作为一篇随笔记录
一、框架的设计思考
GAS技能框架的分工
- 程序:提供逻辑功能节点
BPLibrary、AT、GEEC(公式相关)、Montage通知点、技能效果逻辑类 - 策划:配置GA、GE、GC、Tag、配置表
- 美术:提供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去操作属性的变化
当属性值过多时,需要属性生成工具
生成要点:
- 定义属性
- 定义OnRep方法
- 实现OnRep方法
- GetLifetimeReplicatedProps方法中加入新的属性
5. GameplayCue
产生特效表现、摄像机抖动、伤害飘字
例如:命中后飙血特效、中毒后添加中毒特效等
6. AbilityTask
一些异步任务
例如等待玩家输入、等待网络同步、等待玩家选择目标,等待标签添加等
7. Prediction
GA、GE、AS等预测
Montage网络同步
三、开发问题
1. 如果在服务器上执行一个Duration的GE,修改了属性,在客户端上监听此属性变更,能监听到,但是从函数参数中取得的数值都是基础值,获得错误?
这里可以通过ASC去获取CurrentValue
2.GE如果直接New出来的,在网络上没法复制Tag,因为使用的是CDO
解决方案是:使用工具批量生成GE蓝图资源或者通过ASC直接调用可复制标签的方法
但是直接通过New出来的GE,可以用来修改属性,因为属性数值本身是可复制的
- 标签可网络复制添加调用
- 标签本地添加调用
3. 技能的上下文数据存储
在进行技能公式伤害计算时,常用到以下3种数据
- Capture的属性值
- 配置数据(蓝图、DataTable)
- 临时动态数据(随机产生暴击)
4. 标签和状态关联技巧
- bool2tag
例如在GA中,勾选了bIsMelee标记此GA为近战类型,需要增加标签Ability.AbilityType.Melee
则可以重写PreSave方法,然后在编辑器勾选了GA中对应bool值后进行保存操作,即可添加标签。这里给出单一条件判断,而往往会有更为复杂的复合判断去进行标签管理。
- tag2bool
直接通过ASC中HasMatching相关方法,就可以将tag转为bool值
5. GA监听事件、标签的方法
- 赋予GA,在GA列表设置监听的事件或标签
- 赋予GA时激活,执行AT等待
两者不同在于,前者技能属于未激活状态,后者一个技能是激活状态
例如,等待玩家选择目标,等待标签添加等。
6. GameplayEvent与GameplayTag在GAS中的运用区别
GameplayEvent大部分是瞬时的
GameplayTag可以监听添加和删除的瞬时状态,还有持续的一个状态
总结
其实在框架设计过程,都是对现实事务的一个抽象过程,怎么让这个过程更加的有规律、容易理解。从实践中来再到实践中去,遇到重复性高的流程,会想到找出流程的规律,总结标准的流程,再不断的精简,从而得出一套高复用性框架。
参考文档、项目
插件文档:https://github.com/tranek/GASDocumentation
参考项目:Lyra,ActionRPG,GASShotter,GASDocumentation