1. Gameplay Ability System插件简介
根据官方文档的描述:
游戏能力系统(
Gameplay Ability System
,简称GAS
)是一个高度灵活的框架,用于构建在RPG或MOBA类游戏中常见的能力和属性系统。通过这个系统,你可以为游戏角色创建主动技能或被动能力,实现各种状态效果来提升或削弱不同属性,设置技能冷却时间或资源消耗来管理技能使用,调整能力等级及其效果,触发粒子或音效等等。简单来说,这个系统可以帮助你设计、实现并高效地网络同步游戏中的各种能力,从简单的跳跃到现代RPG或MOBA游戏中复杂的角色技能组合都可以实现。
GAS
插件由Epic Games开发,是虚幻引擎的内置插件。它已在《Paragon》和《堡垒之夜》等多款AAA商业游戏中经过实战检验。
这个插件为单人和多人游戏提供了一套完整的解决方案,包括:
- 实现基于等级的角色能力或技能,支持设置消耗和冷却时间(游戏能力 GameplayAbilities)
- 管理角色的数值属性(属性 Attributes)
- 为角色添加状态效果(游戏效果 GameplayEffects)
- 为角色添加游戏标签(游戏标签 GameplayTags)
- 生成视觉或音效(游戏提示 GameplayCues)
- 以上所有功能的网络同步复制(
Replication
)
在多人游戏中,GAS支持以下功能的客户端预测(client-side prediction
):
- 技能(
Ability
)激活 - 播放动画蒙太奇
- 属性值(
Attribute
)变化 - 添加
GameplayTags
- 触发
GameplayCues
- 通过
RootMotionSource
函数与CharacterMovementComponent
连接的移动功能
注意:GAS必须在C++中进行设置,但设计师可以在蓝图中创建游戏能力 GameplayAbility
和游戏效果 GameplayEffect
。
目前GAS存在的问题:
GameplayEffect
的延迟调和(Latency Reconciliation
)(无法预测技能冷却时间,导致高延迟玩家在使用低冷却技能时,实际发射速度会低于低延迟玩家)- 无法预测
GameplayEffect
的移除。虽然我们可以通过预测添加相反效果的方式来实现移除GameplayEffect
,但这种方法并不总是合适或可行 - 缺少样板模板、多人游戏示例和文档(希望本文能对此有所帮助!)
2. 示例项目
本文档包含了一个支持多人联机的第三人称射击游戏示例项目,主要面向已经熟悉虚幻引擎但刚接触游戏能力系统(GAS)插件的开发者。使用者需要具备C++、蓝图、UMG、Replication等虚幻引擎中级主题的相关知识。该项目展示了如何搭建一个基础的多人第三人称射击游戏,其中:
- 玩家/AI控制的英雄将
能力系统组件 AbilitySystemComponent
(简称ASC
),放置在PlayerState
类中 - AI控制的小兵将
ASC
放置在Character
类中
本项目的目标是保持简单的同时展示GAS的基础知识,并通过详细注释的代码演示一些常用功能。由于面向入门者,项目不涉及预测投射物(Predicting Projectiles
)等高级主题。
项目演示的概念包括:
- 在
PlayerState
和Character
类中使用ASC
的区别 - 网络同步的
Attribute
- 网络同步的
Animation Montage
(动画蒙太奇) Gameplay Tags
(游戏标签系统)- 在
GameplayAbility
内部和外部添加/移除GameplayEffect
- 应用被护甲减免的伤害来改变角色生命值
GameplayEffect Execution Calculation
(游戏效果执行计算)- 眩晕效果
- 死亡和重生
- 在服务器上通过
Ability
生成Actor(Projectile
投射物) - 预测性地改变本地玩家瞄准和冲刺时的速度
- 持续消耗耐力进行冲刺
- 使用法力值施放
Ability
- 被动
Ability
- 叠加
GameplayEffect
- 锁定
Actor
- 在蓝图中创建的
GameplayAbility
- 在C++中创建的
GameplayAbility
- 每个Actor实例化的
GameplayAbility
- 非实例化
GameplayAbility
(跳跃) - 静态
GameplayCue
(开火粒子效果) - Actor
GameplayCue
(冲刺和眩晕特效)
Character
(角色)类具有以下能力:
Ability 名称 | 输入绑定 | 是否预测 | 实现方式C++/Blueprint | 描述 |
---|---|---|---|---|
跳跃 | 空格键 | 是 | C++ | 使英雄跳跃 |
开枪 | 鼠标左键 | 否 | C++ | 从英雄的枪中发射投射物。动画可预测但投射物不可预测 |
瞄准 | 鼠标右键 | 是 | Blueprint 蓝图 | 按住按键时,英雄移动变慢,相机放大以提供更精确的射击 |
冲刺 | 左Shift | 是 | Blueprint 蓝图 | 按住按键时,英雄以消耗耐力为代价提升移动速度 |
向前冲锋 | Q键 | 是 | Blueprint 蓝图 | 英雄消耗耐力向前冲锋 |
被动护甲叠加 | 被动 | 否 | Blueprint 蓝图 | 每4秒获得一层护甲,最多4层。受到伤害时失去一层护甲 |
陨石术 | R键 | 否 | Blueprint 蓝图 | 玩家选择目标位置召唤陨石,对敌人造成伤害和眩晕。目标选择可预测但陨石生成不可预测 |
GameplayAbility
可以用C++或蓝图实现,这里混合使用两种方式来展示不同的实现方法。
AI控制的小兵没有预定义的GameplayAbility
。红色小兵具有更高的生命值恢复,而蓝色小兵具有更高的初始生命值。
关于GameplayAbility
的命名规则:使用_BP
后缀表示该能力的逻辑在蓝图中实现。没有后缀则表示在C++中实现。
蓝图资产命名前缀
前缀 | 资产类型 |
---|---|
GA_ | GameplayAbility |
GC_ | GameplayCue |
GE_ | GameplayEffect |