01 - GAS基本概念和组成
本文主要说明了UE5中Gameplay技能系统(Gameplay Ability System, GAS)中的基本概念和组成,以及简要介绍它的预测功能。
概述
Gameplay技能系统(Gameplay Ability System)是一种框架,它可以构建Actor可以拥有和触发的属性Attributes,技能Ability和交互GameplayEffect。该系统可适应各种各样的Gameplay驱动项目,例如角色扮演游戏RPG,动作冒险游戏和多玩家在线战术经济MOBA等。
GAS是管理下述概念的系统框架:
- 属性Attributes:人物的各种数值属性,例如生命值,伤害值等;
- 技能Abilities:人物的各种行为,例如播放动画、造成伤害等;
- 效果Effects:导致Attribute值改变的游戏机制,例如让生命值回复的治疗buff;
- 特效Cues:和游戏机制相关的视/声效等;
组成
这些概念在UE5的GAS中由如下基本组件构成:
- Ability System Component(ASC):是让Actor参与到GAS的核心组件,它可以让Actor受到GAS中GameplayEffect的影响,进而处理Ability相关的功能;
- Attribute Set:负责存储多个Attribute;
- Gameplay Ability(GA):封装Actor的行为,使之与GAS中的GameplayEffect,视觉效果,动画、声音等组件进行协作;
- Ability Task:在GAS中的Gameplay Ability执行期间,异步执行相关工作;
- Gameplay Effects(GE):可以改变Attribute值,在网络同步上允许客户端预测,服务端回滚;
- Gameplay Cue:处理GAS中的视/声效,也负责这些效果的网络同步;
- Gameplay Tags:虽然不属于GAS,但在其中被广泛应用,主要用于分类管理Actor;
使用搭配
在使用GAS前,请确保在编辑器中启用相关插件,在
Build.cs中包含相关模块。
对于不复杂的Actor,可用Pawn+ASC+Attribute Set完成简单GAS功能;
对于复杂的Actor(例如玩家本身),则推荐用Player State+ASC+Attribute Set完成GAS相关功能。
预测 Prediction
GAS在网络同步方面提供了完善的预测机制,可有效减少客户端和服务器间的延迟。具体原理是客户端会提前在本地进行模拟,如果模拟结果和服务器一致就继续执行下去,不一致会进行数据的回滚,并应用服务器的权威结果。GAS预测相关的代码详见GameplayPrediction.h。
目前GAS支持如下特性的自动预测:
-
激活Gameplay Ability;
-
触发事件;
-
Gameplay Effect相关应用:
- Attribute的Modifier相关(不是Execution);
- Gameplay Tag的修改;
-
Gameplay Cue 相关事件:
- 来自有本地预测的Gameplay Ability;
- 它们自己拥有的事件;
-
蒙太奇;
-
移动(
UCharacterMovement);
GAS尚未支持如下特性的自动预测:
- Gameplay Effect 的移除;
- Gameplay Effect 周期性的效果;
预测键 Prediction Key
预测键基于FPredictionKey类,实质上是一个唯一ID。当客户端执行预测时,它会向服务器发送一个预测键,它本次的预测行为会和此键关联。服务器在接受该客户端的预测键后,将它之后创建的副作用与该键关联,最后通过FPredictionKey::NetSerialize()函数通知目标客户端该键是否被接受,其他客户端只会接收到值为0的无用预测键。
预测窗口 Prediction Window
以GA的激活为例,每当客户端带有预测地激活一个GA时,都会存在一个支持客户端本地预测行为的预测窗口,该客户端可在预测窗口内执行一些改变游戏状态的重要行为(例如消耗Attribute资源等)且不需要询问服务器相关权限。更细致的内容如下图所示,它解释了客户端调用TryActivateAbility()后,客户端和服务器的相关逻辑:


