说明
- 本文主要目的:以给游戏新增名为 MagicBall 的技能为例,记录和分享基于 Unreal 的 Lyra 项目进行 Gameplay Ability System (以下简称 GAS )技能添加的流程。
- 本文所述方案只是当前可行方案的一种,不代表唯一方案或最佳实践。
- 本文基于 Unreal Engine 5.2,其中的 Lyra 为引擎自带示例游戏工程。工程中的资源(主要是工程和插件 Content 目录中的资源)从虚幻商城免费工程 Lyra 中得来。引擎(含工程)源码地址见文末相关链接。
效果
- 游戏中按下 T,触发对应技能 MagicBall ,打印技能激活等流程日志。
3gb1pvr6arpbconca7b197v7st.png
修改
相关文件
1iqloquu28ld9l0s5ecojandeg.png
相关修改
- DefaultGameplayTags.ini
- 添加一个技能 Tag
7mjpcnkc5m974vmkn5k50hddt3.png
- LyraGameplayAbility_Skill.h
- (非必须)定义一种新技能,因为现有的技能不适合 MagicBall 。
4e32gskpnc4ok72m82l82tcbfj.png
- LyraGameplayAbility_Skill.cpp
- (非必须)可以抄 ULyraGameplayAbility_Jump 或其它继承自 ULyraGameplayAbility 的技能,内容只是简单输出日志。因为本文关注的是新技能的添加流程,技能的执行流程不在本文详述。
3qd4dfg8fe8rp2vilr3fudvrqj.png
- GA_MagicBall.uasset
- 主要逻辑写在 LyraGameplayAbility_Skill 中,然后基于 BP 做具体技能子类。
- 设想 BP 主要做配置,跟 Lyra 其它技能设计类似。
- 因为主要是描述技能添加流程,所以只是简单输出日志,技能的释放等逻辑暂时不配置。
6h64m41dvhu1ffpgu946f10i3e.png
3qpoklecstd1t2keqcbd2kb6gh.png
- AbilitySet_ShooterHero.uasset
- 关联 Tag 和技能 GameplayAbility (以下简称 GA)
0dhjfub0adlnjjam1iglab1p45.png
- IA_Ability_MagicBall.uasset
- 添加技能对应的 Action ,设置 Press 及 Actuation Threshold (为0的话可能按下会执行多次)
4mt5kl4b4vmki8tgn2h3ahr1bg.png
- InputData_Hero.uasset
- 关联 Input Action 和 Tag
0vcqfkdbd2nctpb0lj7g5pua40.png
- IMC_Default_KBM.uasset
- 关联 Input Action 和 Keyword
- 对于手柄等输入,本来还要填 IMC_Default_Gamepad.uasset ,但是这里暂时忽略。

16pb1cve964mqblmvpqacbbnem.png
流程
说明
- 本段从源码层面,对技能触发的执行流程进行说明,有助于更好地理解上述相关资源和文件的作用(非必看)
初始化:赋予技能
- 从 HeroData_ShooterGame 中的 AbilitySet_ShooterHero 里拿到各种技能,放到 UAbilitySystemComponent 中的 ActivatableAbilities 里。
GiveAbility.jpg
绑定 Tag 和 Action
- 遍历 HeroData_ShooterGame 的 InputData_Hero 的 AbilityInputActions 中的技能,绑定其 inputaction 和 inputtag,如把 IA_Ability_MagicBall 和 InputTag.Ability.MagicBall 绑定,且 Input为 Pressed。
BindAbilityActions.jpg
(可选)绑定 Mode 定制化 Input
- 其它 Mode 所需的定制化的 Input 的绑定(InputData_ShooterGame_AddOns)
BindAbilityActions2.jpg
按键后获取对应 InputAction 和 InputTag
- 按键后,通过 UEnhancedPlayerInput 找到对应的 InputAction:IA_Ability_MagicBall ,进而找到 InputTag:InputTag.Ability.MagicBall
AbilityInputTagPressed.jpg
更新 InputPressedSpecHandles
- 通过 Inputtag 在 ActivatableAbilities 中找到 FGameplayAbilitySpecHandle ,放到 InputPressedSpecHandles 中
AbilityInputTagPressed2.jpg
更新 AbilitiesToActivate
- 从 InputPressedSpecHandles 中根据 FGameplayAbilitySpecHandle 找到 FGameplayAbilitySpec,取其 Handle 放到 AbilitiesToActivate
ProcessAbilityInput.jpg
执行 TryActivateAbility
- 对 AbilitiesToActivate 中的技能调用 TryActivateAbility
InternalTryActivateAbility.jpg
链接
- Lyra中的技能(https://docs.unrealengine.com/5.2/zh-CN/abilities-in-lyra-in-unreal-engine/)
- Gameplay Ability System(https://docs.unrealengine.com/5.0/en-US/gameplay-ability-system-for-unreal-engine/)
- UnrealEngine GitHub(https://github.com/EpicGames/UnrealEngine)
**声明:**本文来自公众号:GameDevLearning,转载请附上原文链接(https://mp.weixin.qq.com/s/RJqAb3P4p2jmXHTC0pWzJg)及本声明。