跳到主要内容
信息
· 文章中可能会出现一些错误,希望大佬们可以在评论区指出;

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()后,客户端和服务器的相关逻辑:

参考资料