基于 Unreal Lyra 的 GAS 技能添加流程

Viewed 5

说明

  • 本文主要目的:以给游戏新增名为 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

链接

**声明:**本文来自公众号:GameDevLearning,转载请附上原文链接(https://mp.weixin.qq.com/s/RJqAb3P4p2jmXHTC0pWzJg)及本声明。

0 Answers