前言
上一篇已经大概介绍了什么是GAS,它有什么功能,这一篇对后面要介绍的三个案例做一个预览。
一、GASDocumentation案例
GASDocumentation案例是开源在Github上的项目,也是本文的前期基础,作者分享了自己对于GAS的理解,并做了详细的文档和简单的案例展示。同样是这个作者tranek,制作了GASShooter,对GAS的应用做了非常好的实践示例。这两个案例,后面都会做非常详细的分析。
GASDocumentation包含一个支持多人联机的第三人称射击游戏模板项目, 其目标受众为初识GameplayAbilitySystem
插件, 但并不适合Unreal Engine 5新手.
用户应该了解C++, 蓝图, UMG, Replication和其他UE5的中间件.
该项目提供了一个样例, 其向你展示了如何使用GameplayAbilitySystem
插件建立一个基础的支持多人联机的第三人称射击游戏, 其中AbilitySystemComponent(ASC)
分别位于PlayerState
类代表玩家/AI控制的人物和位于Character
类代表AI控制的小兵.
我在保证展现GAS基础和带有完整注释的代码所表示的一些普遍技能的同时, 尽力使这个样例足够简单. 由于该文档专注于初学者, 因此该样例不包含像[Predicting Projectiles]这样的高阶技术.
概念说明:
ASC
位于PlayerState
还是Character
.- 网络同步的
Attribute
. - 网络同步的蒙太奇(Animation Montages).
GameplayTag
.- 在
GameplayAbility
内部和外部应用和移除GameplayEffect
. - 应用被护甲防御后的伤害值来修改角色生命值.
GameplayEffectExecutionCalculations
.- 眩晕效果.
- 死亡和重生.
- 在服务端上使用能力(Ability)生成抛射物(Projectile).
- 在瞄准和奔跑时, 预测性的修改本地玩家速度.
- 不断消耗耐力来奔跑.
- 消耗魔法值来使用能力(Ability).
- 被动能力(Ability).
- 堆栈
GameplayEffect
. - 锁定Actor.
- 在蓝图中创建
GameplayAbility
. - 在C++中创建
GameplayAbility
. - 实例化每个Actor的
GameplayAbility
. - 非实例化的
GameplayAbility
(Jump). - 静态
GameplayCue
(子弹撞击粒子效果). - Actor
GameplayCue
(奔跑和眩晕粒子效果).
角色类有如下能力:
能力 | 输入绑定 | 是否可预测 | C++/Blueprint | 描述 |
---|---|---|---|---|
跳跃 | 空格键 | Yes | C++ | 使角色跳跃. |
枪 | 鼠标左键 | No | C++ | 从角色的枪中发射投掷物, 发射动画是可预测的, 但是投掷物不能预测. |
瞄准 | 鼠标右键 | Yes | Blueprint | 当按住鼠标右键时, 角色会走的更慢并且摄像机会拉近(zoom in)以获得更高的射击精度. |
奔跑 | 左Shift | Yes | Blueprint | 当按住左Shift时, 角色在消耗体力的同时跑得更快. |
向前猛冲 | Q | Yes | Blueprint | 角色消耗体力的同时向前猛冲. |
被动护盾叠加 | 被动 | No | Blueprint | 每过4s角色获得一个最大层数为4的护盾, 每次受到伤害时移除一层护盾. |
陨石坠落 | R | No | Blueprint | 角色锁定一个敌人召唤一个陨石, 对其造成伤害和眩晕效果. 定位是可以预测的而陨石生成是不可预测的. |
GameplayAbility
无论是由蓝图还是C++创建都没关系. 这里我们使用蓝图和C++混合创建, 意在展示每种方式的使用方法.
AI控制的小兵没有预先定义的GameplayAbility
. 红方小兵有较多的生命回复, 蓝方小兵有较多的初始生命.
对于GameplayAbility
的命名, 我使用_BP
后缀表示由蓝图创建的GameplayAbility
逻辑, 没有后缀则表示由C++创建.
蓝图资源命名前缀
Prefix | Asset Type |
---|---|
GA_ | GameplayAbility |
GC_ | GameplayCue |
GE_ | GameplayEffect |
二、GASShooter案例
GASShooter是一个基于Unreal Engine 5的GameplayAbilitySystem (GAS) 插件开发的 FPS/TPS 高级案例。在研究GASShooter之前应该先学习 GASDocumentation相关文档和案例,从而循序渐进的掌握GAS,毕竟是非常复杂的系统。
2.1简介
这个项目并非是产品级的代码,而是一个利用GAS中不同技术来使用武器方面的评估起点,带有一定的探索和实验性质。
项目中使用的相关资源来源于Epic Games的ShooterGame学习项目,Epic Games的Infinity Blade和一些tranek自己制作的资源。
GASShooter 当前的引擎版本是 Unreal Engine 5.0,还有一些之前的版本,但是不再对他们做长期支持,所以建议大家更新到UE5的版本。
按键 | 动作 |
---|---|
T | 切换第一和第三人称视角 |
鼠标左键 | 激活主武器,锁定目标 |
鼠标中键 | 激活武器的可用能力 |
鼠标右键 | 激活武器的第二能力 |
鼠标向上滚轮 | 切换背包中的下一个武器 |
鼠标向下滚轮 | 切换背包中的上一个武器 |
R | 填装子弹 |
Left Ctrl | 取消瞄准 |
Left Shift | 冲刺 |
E | 和可交互物体进行互动 |
控制台命令 | 动作 |
---|---|
kill | 杀死本地玩家 |
英雄角色有魔法,但是当前没有技能涉及到魔法消耗。在新版BioShock发布时开始了这个项目的概念,意在实现类似BioShock那样的可升级技能,这使得项目牵涉的范围太广,但这是将来可能要实现的。
次级的弹药并未被使用,可以用来填充枪榴弹之类的东西。
2.2 覆盖的概念
- 技能批处理
- 带技能的可装备武器
- 预测武器切换
- 武器弹药
- 简单的武器库
- 爆头伤害
- 可重用的自定义目标角色
- 瞄准镜
- 在使用某个技能时在多个蒙皮骨骼组件上播放同步蒙太奇动画
- 通过继承
FGameplayEffectContext
来向GameplayCue发送额外的信息。 - 在生命值被伤害移除之前角色格挡
- 物品拾取
- 一键交互系统。按住“E”可与可交互对象交互,包括玩家复活、武器箱和滑动门。
该项目不展示子弹预测,这个应该是个技术难点。我建议您参考虚幻锦标赛(Unreal Tournament)源代码,了解如何在拥有的客户端上使用假投射物来实现这一点。
武器 | 主技能 (鼠标左键) | 次技能 (鼠标右键) | 切换技能 (鼠标中键) |
---|---|---|---|
来复枪 | 根据当前的射击模式发射命中扫描子弹。 | 瞄准目前。 | 在全自动、半自动和爆发之间更改射击模式。 |
火箭发射器 | 发射火箭。 | 瞄准目标。开始锁定火箭的目标。按下鼠标左键向目标发射火箭。 | 无 |
猎枪 | 基于当前射击模式发射命中扫描弹丸。 | 瞄准,减少弹丸的射程。 | 在半自动和全自动之间更改发射模式。 |
三、Lyra Starter Game案例
官方介绍:
Lyra 是一款供你学习用的游戏示例,可以帮助你理解 虚幻引擎5 (UE5)的框架。其架构设计为模块化形式,包含一个核心系统和一些插件,它们会随着UE5的开发而定期更新。
- 跨平台兼容性和可扩展性。 对Epic在线服务和主机在线子系统的在线多人玩家和跨平台游戏支持。
- 可在三种不同的游戏模式之间选择:淘汰(团队死亡竞赛)、控制(捕获控制点)和爆炸器(自上而下的派对游戏)。
- 自定义的Gameplay技能系统。 Niagara FX。
- 项目的Gameplay概念的虚幻示意图形(UMG)控件类和UI图标,包括菜单设置、手柄按键摇杆,以及生命值、法力和武器的显示。这些UI功能是以模块化方式设计的,因此你可以独立于Lyra在自己的游戏中使用其系统。
- 优化的手工制作内容,包括移动动画资产、声音以及与Pawn兼容的武器系统。
- 新的UE5人体模型Manny和Quinn。这些人体模型是可操作角色,拥有与MetaHuman相同的核心骨架层级,并带有兼容的动画系统。
官方介绍的部分,这里没有必要全部搬运过来,大家有兴趣可以通过超链接去详细查看。后面要详细分析的内容是官方文档没有细讲的部分,会通过源代码做细致入微的分析,从而让大家搞清楚来龙去脉。
UE5 GAS 学习笔记目录
前置技能:1.编程语言C++;2.Unreal Engine 5;3.Github和VS开发环境
1.0 概念
1.1 能力系统组件(AbilitySystemComponent)
1.2 游戏标签(GameplayTag)
1.3 属性(Attribute)
1.4 属性集(AttributeSet)
1.5 游戏效果(GameplayEffect)
1.6 技能(GameplayAbility)
1.7 任务(AbilityTask)
1.8 特效(GameplayCue)
1.9 技能系统全局(AbilitySystemGlobals)
1.10 预测(Prediction)
1.11 目标定位(Targeting)
2.0 常用技能和效果
2.1 眩晕
2.2 冲刺
2.3 瞄准
2.4 生命偷取
2.5 在客户端和服务器生成一个随机数
2.6 暴击
2.7 受击
2.8 当游戏暂停时生成目标数据
2.9 一键互动系统
3.0 调试
3.1 显示调试信息
3.2 游戏调试器
3.3 日志
4.0 优化
4.1 技能批处理
4.2 特效批处理
4.3 技能系统组件网络同步模式
4.4 属性代理网络同步协议
4.5 技能系统组件懒加载
5.0 建议
5.1 效果容器
5.2 技能系统组件代理绑定
6.0 疑难
6.1LogAbilitySystem: Warning: Can't activate LocalOnly or LocalPredicted ability %s when not local!
6.2 脚本结构体缓存错误
6.3 动画蒙太奇没有同步到客户端
6.4 复制的蓝图角色把属性集设置为空指针
6.5 无法解析的外部符号:UEPushModelPrivate::MarkPropertyDirty(int,int)
8.0 参考资料
8.1 虚幻引擎官方文档
8.2 Github开源项目
- 4.27
- 4.26
- 4.25.1
- 4.25
- 4.24
10. 0案例分析
10.1 GASDocumentation案例(上)
10.1 GASDocumentation案例(中)
10.1 GASDocumentation案例(下)
10.2 GASShooter案例解析
10.3 LyraStarter案例解析