GAS Companion - Quick Start官方文档翻译及补充

  前言

  Game Ability SYstem(以下简称GAS)是虚幻引擎4(以下简称UE4)中内建的一个插件,并在虚幻引擎5(以下简称UE5)中逐步升级到了1.0版本,是Epic在开发《堡垒之夜》等游戏的过程中逐步建立并完善起来的一个官方插件。其本身是用于解决游戏中控制属性定义,以及技能激活、消耗、影响的一揽子框架,默认结合了一部分网络同步的安排工作,与虚幻引擎的Gameplay Tags亦有丰富的关联。GAS在虚幻引擎中并不是默认启用的插件,需要在Plugins面板中手动启用。

  本文是关于GAS Companion插件官方文档Quick Start章节的翻译及补充。GAS Companion同样是从UE4版本就出现的一个非官方插件,如今同样支持到了UE5的最新版本,是用于辅助GAS工作的插件。

  GAS Companion插件主要作用是在GAS中简化了添加Attribute Set的步骤,开发者可以使用插件面板进行添加和注册而无需使用C++编写代码;以及利用GAS Companion插件自带的组件,能够简化原本GAS的一部分编辑工作,并丰富了GAS的事件系统。需要注意的是,在配置了Attribute Set后,如果开发者如果需要对已创建内容进行编辑,仍然需要使用C++进行操作,本插件作者提供另一个插件Gameplay BluePrint Attributes来改善相关操作的体验,但这不在本文章的讨论范围,感兴趣的朋友可自行搜索相关的内容。

  之所以有这一篇文章,是在我购买并学习GAS Companion的过程中,发现插件文档的部分内容仍然是按照UE4面板,以及过往的GAS组件面板来说明的,这对于使用当前版本(截至文章编写时为UE5.5)的开发者来说会有稍许的不便,在此我进行了一些尝试并将自己对应在UE5.5中的一些操作说明补充到文章内。

  本文对特定的英文单词如"Attributes"等不会进行翻译,避免和我一样的初学者在编辑器面板上不能找到对应的部分;每个主要分部标题附加了原文档链接“#”,如有表述不清的情况,可以查看原文档。

  因为我不擅长C++编程,也不是专业的虚幻引擎游戏开发者,如有翻译不当的部分,还请指出,谢谢。

  接下来让我们开始吧。

  Getting Started # 

  开始

  学习如何开始应用GAS Companion

  为了达成本次指南的目标,我们将使用Unreal引擎的第三人称角色模板来创建一个新的蓝图项目。 你可以使用这个模板来创建一个新项目,或者稍后通过Add/Import > Add Feature or Content Pack > Blueprint Feature > Third Person来添加它到你的项目中

   

  Setup Map and Game Mode #

  设置地图和游戏模式

  首先我们要做的事情是创建我们的游戏debug地图,可以从第三人称模板中复制它的默认地图。

  在资产浏览器导航到/Content/ThirdPersonBP/Maps将地图复制到你想要放置的文件夹。在这个例子中我们复制地 图到/Content/GettingStarted/Maps这个文件夹。然后打开它,我们要为这个新地图来创建一个新的Game Mode。

  在创建新的Game Mode之前要注意,确认从我们复制的地图上去掉ThirdPersonCharacter Actor。在默认情况 下,它会自动创建一个player并完全绕开我们的Game Mode Pawn Class。

  在Content Browser内右键点击,并在唤出的菜单内选择创建新的蓝图类,这里选择的是GameModeBase作为父类。

  

 

  我们把这个新的蓝图命名为BP_GameMode。GameModes是一个重要的类,你要使用它来配置你地图中的对应游 戏框架各个部分内容的类:

  ·Player Controller(玩家控制器)

  ·Player State(玩家状态)

  ∙HUD Class(抬头显示界面)

  ·Default Pawn(默认Pawn)

  ∙Etc.

  在本指南中,有两个最重要的类分别是Default Pawn Class和Player Controller Class ∙Default Pawn Class →需要是GSCModularCharacter, GSCModularPawn 或者 GSCModularPlayerStateCharacter的子类。在下个章节,我们会创建一个新的GSCModularCharacter蓝图。

  Player Controller Class→需要是GSCModularPlayerController类或者是它的子类。你可以直接设置为 GSCModularPlayerController,不需要再创建一个新的派生类。这个父类主要为了能够反应和处理一些来自Pawns 的事件,特别是在GAS Companion v3中对应nput Binding(输入绑定)和new Enhanced Input integration(新增强输入)

  

 

  现在,需要设置我们的地图来使用BP_GameMode。在你的World Settings面板里面进行设置(如果你没有见到它的话,从Window > World Settings来找到并显示它),然后将GameMode Override设置为你的GameMode。 (在Project Settings→Map&Modes中可以设置默认的地图GameMode,该默认项会在创建新地图的时候套用。)

  

 

  Setup Pawn Class (Player Character) #

  设置Pawn类(Player Character)

  在这个例子里,我们将会使用Epic的第三人人称蓝图模板。

  如果你在开始项目的时候没有使用这个模板,可以通过在Content Browser右键点击,选择Add / Import > Blueprint Feature > Third Person来添加它

  

  Create new Modular Character Blueprint

  创建新的模块化Characte蓝图

  注意:如果你想跳过这个章节,你可以直接将ThirdPersonCharacter蓝图的父类设置为GSCModularCharacter。

  打开ThirdPersonCharacter蓝图(默认位置在Content/ThirdPersonBP),我们不会对它进行更改,但是为了方便 接下来的工作,我们会从它那儿复制一些部分到我们即将要创建的新Character蓝图。

  现在,就像我们在Game Mode所作的那样,右键点击Content Browser的任意位置来唤出菜单,选择新的蓝图类, 然后选择GSCModularCharacter作为父类。给它命名,我们这儿会给它命名为BP_Modular_Character。

  

 

  打开新创建的BP(蓝图),然后按接下来的说明配置:

  1.设置Mesh(网格)和Anim(动画)蓝图:在components页面,点击Mesh组件然后

  i:设置Skeletal Mesh Asset为SK_Mannequin(在UE5中,对应的新引擎默认网格为SKM_Manny)

  ii:对于Animation类别中的Anim类,选择来自于第三人称模板的ThirdPerson_AnimBP(在UE5中,对应的是 ABPO_Manny)

  iii:将Location Z的值设置为-88. Iv:设置Rotation Z的值设置为-90

  2.创建Camera:从ThirdPersonCharacter蓝图中选择CameraBoom和FollowCamera组件,将其复制粘贴到新的 BP_Modular_Character蓝图。

  3.配置移动和旋转:

  i:选择Character Movement组件,搜索Orient Rotation to Movement然后确认它处于enabled状态(该设置激 活的时候会平滑角色转向的角度变化,使其不会突兀的转向,保持一定的自然观感)。

  ii:在Class Defaults(该设置是Character自身持有的),搜索Use Controller Rotation Yaw,然后确认它属于 disabled的状态(激活该配置角色面向将会跟随视角转动,这里关闭是因为我们想要将视角转动和角色面向的操作 分离,举个例子比如刺客信条或者是黑暗之魂,我们用左摇杆/键盘来控制角色的移动,右摇杆/鼠标来控制视角)。

  4.配置Movement输入 i.从ThirdPersonCharacter蓝图中,在EventGraph面板内,复制所有的节点,将它们复制到新蓝图中。 Ii.从ThirdPersonCharacter蓝图中,复制和粘贴BaseTurnRate和BaseLookUpRate的数值到新蓝图中。(UE5.5中我没有找到这些内容,对应功能的是图示的设置)

  

  5.编译然后保存(Compile and Save)。

  Update GameMode Default Pawn Class #

  更新GameMode的默认Pawn类

  现在Character蓝图搞定了,现在我们将要把它设置到Game Mode的Default Pawn Class。

  

   现在编辑器中运行,我们会有一个带有Ability System Component 的角色,不过现在它还没带有任何的Attributes 或者Abilities。

  Ability System Component#

  能力系统组件

  GSCAbilitySystemComponent是来自于GAS中AbilitySystemComponent的子类,如果你使用了 GSCModularCharacter或者GSCModularPawn来创建蓝图或者是设置为蓝图父类则会自动在蓝图创建这个组 件。(同样作用于GSCModularPlayerState,如果你想要ASC存在于PlayerState的话)

  

  它会暴露一些GAS Companion | Abilities可用的资产。如果你在components页面中选择它,你可以看到和编辑以 下内容:

  ∙GrantedAbilities:当Ability System Component初始化后,可以被给予的Gameplay Abilities列表,可选择使用 Enhanced Input Action来绑定输入进行激活。

   ∙GrantedAttributes:当Ability System Component初始化后,可以被给予的GrantedAttributesl列表,可选择用 数据来进行初始化(指UE内置的Data Table)。

  ∙GrantedEffects:Ability System Component初始化后(通常是在begin play时),可以被给予的GrantedEffects列表。

  

  注意:如果你使用GAS Companion v2,这些是GSCCoreComponent的一部分,它们仍然可用。不过现在Core Component中它们被废弃了,因为显得冗余。

  Granting Attributes (给予属性) 

  不同于之前的版本,给予Attribute是在Project Settings中进行的,你现在可以每个actor中进行给予attribute的操 作。其他不同的是现在GSCAttributeSet不会默认添加给Modular Actor。 GSCAttributeSet是包含于GAS Companion的配置,包含了默认的Health、Stamina、Mana(且他们已经建立了 与最大数值的联系)

  Granting Abilities(给予能力)  

  要将abilities给予Actor,他们必须要在使用前被“给予”。 GrantedAbilities资产可以让你使用一个Gameplay Ability列表添加到Actor的Ability System。 同样你可以选择将Enhanced Input Action(高级输入)来绑定这些Gameplay Abilities的释放

  Granting Effects (给予效果)

   GrantedEffects让你指定一个Gameplay Effects列表供Actor生成的时候使用,典型的是在游戏开始的时候。有时候 你会想要创建一些不断运行的Gameplay Effect比如恢复效果。我们接下来会创建一个关于耐力恢复效果(Stamina Regen effect)。

  Granting Player Attributes#

  给予玩家属性

  在这个部分中,我们会解释如何给予一个Attribute Set到我们的Player Character,并使用默认的数值来初始化每一个Attributes。

  1.在Granted Attributes中,点击“+”图标来添加一个新的入口。

  2.Attribute Set设置为GSCAttributeSet。

  如果你点击运行,并在CMD中输入showdebug abilitysystem命令,你会看见每个Gameplay Attribute,我们刚才 就是将GSCAttributeSet配置到了这个Actor的Ability System Component中。

  

  如果你想要添加其他的AttributeSets到角色上,或者想要替换GSCAttributeSet,可以直接将他们添加到Granted Attributes列表。

 

  Initialization with Data Table(使用Data Table来进行初始化)

  Attribute的默认值是0,现在通过创建一个Data Table来初始化并改变它们。右键点击Content Browser,并在唤出 的菜单选择Miscellaneous > DataTable

  

  点选后,在接下来弹出的窗口里,选择AttributeMetaData来作为行结构。

  

  给它命名并打开它,现在我们先把它命名为DT_Player_Attributes。

   现在,点击面板上的"+"图标来对应所有你想要初始化的attributes。前两列是目前需要配置的: ∙Row Name → 需要符合特定的格式要求,首先是Attribute Set类名称,然后是".",再后是Attribute名称(例 (GSCAttributeSet.Health) (不包括C++类前缀"U",GSCAttributeSet替代了UGSCAttributeSet) ∙Base Value → 在gameplay attribute中启用的当前数值。

  注意:其他列目前还没有在引擎中实现,但它们是其他特定代码用来调整和改变Attribute数值时会用到的。

  

  Create HUD #

  创建抬头显示

  在配置新的Ability和Gameplay Effect消耗耐力设置到跳跃能力激活前,将数值显示到屏幕上会更有利于接下来的操 作(不通过使用gameplay debugger)。

  现在是时候讨论Player HUD和在游戏开始时创建这些界面组件(Widget)了。

  对比之前的V2版本,HUD界面组件现在不会在使用Modular Actors时自动创建了,这会提供一点灵活性,你可以在 需要的时候添加HUD界面组件到屏幕上。

幸运的是,这很容易做到。在开始游戏的时候,创建一个界面组件并添加它到玩家屏幕。UMG界面组件必须是 GSCUWHud的子类,是由WB_HUD...提供并连接了GAS Companion(更多信息可以查看Working with UI

  

  现在能看到如下图。

  

 

  如果我们在联机模式下测试((clients or listen server)),我们将会看到如图所示(你可以稍微调整之前创建的 Data Table看看它是如何影响进度条的)。

  

 

  First Ability - Jump (第一个技能-跳跃)

   在这个部分,我们将会实现我们的第一个ability。为了让事情简单一些,我们要做的只是实现一个跳跃技能和在它激 活的时候消耗一定数值的Stamina。

  现在,我们的跳跃机制已经在BP_Modular_Character蓝图做好了,这是来自于第三人称模板(如果你已经从 ThirdPersonCharacter复制了对应的输入部分)

  

  它只是在玩家按下跳跃输入动作键的时候调用了跳跃(Jump)方法。 让我们使用一个Gameplay Ability重构这部分。

  创建一个新的Gameplay Ability蓝图,在Context menu中导航到你想要创建这个蓝图的位置,然后右键点击在唤出 的菜单选择Gameplay > Gameplay Ability Blueprint。

  

  然后在接下来的窗口,选择父类。

  

  你可以在GameplayAbility与GSCGameplayAbility两者之间任选一个。

  Notes on GSCGameplayAbility(关于GSCGameplayAbility的提示)

  GSCGameplayAbility是来自于Companion的一个GameplayAbility子类,它依赖于GAS Companion。 与标准UGameplayAbility相比增加了如下功能:

   ∙GameplayEffect容器: https://github.com/tranek/GASDocumentation#concepts-ge-containers

   ∙支持技能队列系统(Ability Queue System):如果你想要使用Ability Queueing,你需要使用这个类来创建 Abilities。

  ∙宽松的消耗检测:如果你想要能力激活时候忽视属性值会变为负数,或者只是检测属性不小于或等于0.

  ∙结束点委托(End delegate):一个可供分配的委托将会暴露在ability结束的时候。在组织AI行为树的时候会很有 用。

    ∙被给予时激活:支持被动技能,一个会自动执行且不会终止的技能。(不叫作EndAbility) 。

  在本教程中,它不是必须的,所以你使用GameplayAbility也没问题。

 

  Gameplay Ability Blueprint( Gameplay Ability蓝图)

  将这个Ability蓝图命名为GA_Jump然后打开它。现在,你将会看到两个可以实现的事件分别是ActivateAbility和 OnEndAbility。 我们基本上是想要从我们的Character上使用ActivateAbility事件来触发Jump方法。为此,将你的蓝图如下图所示连接:

  

  当设计abilities的时候有两个重要的方法需要被执行:

   ∙CommitAbility():该方法将会检测从何以及何时调用对应的资源,比如冷却时间或者是消耗。

   ∙EndAbility():该方法要在GameplayAbility结束的时候调用,这很重要否则这个Ability将会无止境的运行下去,可 能会导致接下来的将要发生的其他东西。(除非你想要Ability无止境的运行,比如被动技能)。

   GetAvatarActorFromActorInfo()让你可以获得一个ability所属Actor的引用。当我们从它这儿调用Jump()的时候, 要采用Character的方法,我们需要将这个Actor转换为对应的类才能这么做。

   注意:如果你想要调用之前用过的StopJumping(),你可以使用GameplayEvents在输入松开的时候触发,然后在你 的ability中使用Wait Gameplay Event,或者使用增强输入(Enhanced Input integration)以及绑定系统来激活 ability,来使用WaitInputRelease任务,我们之后会简短地说怎么做。

  最后我想要建议你将Ability中的Instancing Policy设置为Instanced Per Actor。基本上它会告诉系统我们在一个 ability激活的时间内不会再重复激活它。对于基础跳跃技能来说这是合理的。 (关于这部分,通常来说如教程使用Instanced Per Actor即可,不过你可能想要实现更多复杂的效果,可以查看官 方文档Instancing Policy中关于三种实例化策略的说明。)

  

  你可以在Class Defaults中的Advanced类别中找到如上设置。

 

  Granting Ability (给予Ability)

  我们将会测试新创建的Ability是否起效了。

  首先,我们需要将ability给予我们的Character(准确的说是持有的Ability System Component)。返回Character 蓝图,然后:

   1.从components列表中选择Ability System Component。

  2.在GAS Companion | Abilities类别里,点击“+”图标来给予技能(Granted Abilities)。

  3.展开到Ability和Input Action资产。 4.将GA_Jump填入Ability。

  

  Manual Activation (手动激活)

  我们需要激活它的方法,所以在Character蓝图中创建和使用InputAction Jump来做这个。

  

  我们可以使用Ability System Component的TryActivateAbilityByClass方法。(该方法会尝试激活技能,同时返回 一个布尔值反映是否成功激活)

  现在运行它,你会发现当你按空格键的时候角色会跳起来。

 

  Using Input Binding with Enhanced Input #

  使用增强输入来绑定输入 现在我们换种方式来激活技能,在V3版本中结合自动输入绑定(automatic input binding)以及增强输入集成 (Enhanced Input integration)来做这件事。

  在开始之前,我们需要对项目设置进行一点调整。打开Peoject Setting,然后导航到Engine > Input。

  然后,确认你使用如下设置:

  ∙Default Player Input Class填入EnhancedPlayerInput

  ∙Default Input Component Class填入EnhancedPlayerInputComponent

  

 

  注意:你可以在官方关于Enhanced Input的文档中找到更多信息。(4.27/5.0文档有更多关于在蓝图中设置和应用 的信息)

 

  Ability Input Binding Component (技能输入绑定组件)

  如果你查看了官方文档相关内容,你会知道你需要店家一个InputMapping上下文到增强输入系统(Enhanced Input Subsystem)。我们会使用GSCAbilityInputBinding这个组件来处理这件事。

  在Components面板点击Add Component,将GSCAbilityInputBinding添加到角色蓝图。

  

  除了允许Ability System输入绑定在增强输入(Enhanced Input)下工作,这个组件也让我们可以定义一个Input Mapping上下文(你需要手动在增强输入系统中设置)。

  

  在GSCAbilityInputBinding组件内的Player Controls类别下能找到增强输入(Enhanced Input)的相关设置。

   Input Mapping Context只是在Enhanded Input subsystem中吉纳丹的添加映射上下文,你通常可以在第三人称 模板的Begin Play事件链看到这些内容。

  

  注意:如果你使用Game Feature来给予abilities,AddInputMapping将会处理在这个组件上的注册,如果在目标 的Actor类上不可用的话。

  Input Action and Mapping Context (输入行为和映射上下文)现在我们来看看,通过增强输入(Enhanced Input)来激活Jump Ability所需要创建的最简组件,以及如何注册一 个输入当它触发时自动激活ability。 1.首先,我们创建一个Input Action。在Content Browser中右键点击并在唤出的菜单中选择Inputs > Input Action。

  

  为它命名比如叫做IA_Jump。你可以打开它来熟悉输入行为设置,但默认设置对我们来说就足够了。(比如默认使 用按下来触发)

   2.然后,我们需要一个映射上下文(Mapping Context),这是我们在Input Actions中实际设置绑定的地方。比如我们之前做的,打开上下文菜单,然后创建一个新的映射上下文Input > Input Mapping Context。

  你可以随意命名,不过在这儿我们会为它命名为IMC_Default。打开Mapping Context Data组件我们像下图一样创建和设置它。

  

 

  Ability Binding for Jump (为跳跃进行技能绑定)

  最后我们要做的是确定Pawn添加了映射上下文(Mapping Contex)到Player Controller所持的增强输入系统 (nhanced Input Subsystem)。回到Character蓝图,从components列表中选择GSCAbilityInputBinding组 件,然后将我们创建的Mapping Contex填到Input Mapping Context。

  

  最后,我们可以Ability System Component中的Granted Abilities列表然后将GA_Jump的Input Action设置为 IA_Jump。

  

  确认移除了旧的输入绑定,就是我们在EventGraph中创建的跳跃输入绑定,然后再测试它。

   你会发现在按下空格键的时候角色使用跳跃技能跳跃了,对应的是IA_Jump输入。

 

  Rework Jump Ability#

  重构跳跃技能

  现在我们能用增强输入(Enhanced Input)来激活能力,我们可以在输入松开的时候调用StopJumping方法。我们将重温Gameplay Event的概念,以在角色着陆的时候正确处理技能结束。

  Using Input Release Task (使用输入松开任务)

  打开GA_Jump蓝图,做如下改变 1.首先我们将会将一个Acvatar Actor转换为Character并保存以便之后使用它,因为我们会在几个地方用到它(准确的 说是两个)。

  

  

  2.然后我们应用Wait Input Release,并调用Stop Jumping方法,接着是我们之前使用的Jump方法。  

  

  3.一个简单的改动就是我们会在技能结束时添加一个小延迟(不久我们将会使用一个Gameplay Event来调整)。如 果我们在跳跃时同步结束技能,Wait Input Release会随着技能结束的同时销毁,无法对我们松开输入进行反应。

  你现在测试游戏的话,你会发现debug信息会显示Jump"和"Stop Jumping"在屏幕上对应你输入的按下/松开才 做。如果你按住的事件超过两秒,就不会显示"Stop Jumping"信息。(按下超过两秒执行了EndAbility,这个时候 技能已经销毁)

  

  Using Gameplay Event on Landed(在着陆的时候使用Gameplay Event)

   现在,为了正确的处理角色着陆到地面上时的技能结束,以结束跳跃技能的执行。 我们首先注册一个OnLanded事件到我们的Character蓝图中,用于发送一个gameplay event到Actor。

  1.在Character蓝图的EvenGraph中,右键点击然后创建一个Onlanded事件。

   2,拖动引脚创建一个Send Gameplay Event to Actor

   3.将一个Self引用接入到Actor参数上。

  4.对于Event Tag,创建一个新的比如Event.Character.Landed。你可以选择创建和使用其他的Gameplay Tag,只是 在要复用技能的时候确认使用相同的名称。

 

  

  然后,我们来为GA_Jump技能收尾。

  1.重新将Delay节点连接到Wait Gameplay Event

  2.对于Event Tag,使用和Character发送时相同的名字。(本例中是Event.Character.Landed)

  3.从Event Received引脚引出调用End Ability

  

 

  你现在可以在游戏中测试它,当角色着陆的时候在debug信息中会看到"Gameplay Event Landed received, End Ability",这样就算正确结束了这个技能。

  Stamina Cost#

  耐力消耗

  为了让事情更有趣一些,我们来将耐力关联到这个技能上。 Costs会通过GameplayEffects来实施。为了将Samina消耗连接到技能,我们需要创建一个连接用的GameplayEffect然后 将它提供给Cost Gameplay Effect Class资产。

  你可以通过点击(GA details)面板上的"+"图标来快速的创建一个GameEffect资产。

  

  按照上述的说明来创建GameEffect。在这个例子中,我们将它命名为GE_Jump_Cost。

  你可以指定要消耗的attributes。确认设置了Instant Duration Policy以及附加行动(在Modifier OP内填入 ADD)。浮点数值设置为-40或者其他你想要的值。然后确认值是负数否则会变成每次激活的时候是添加资源(类似消耗资源的概念)。

  

  

  你可以决定使用其他的attributes,甚至是多个attributes来用于每次跳跃消耗。

  点击运行,每次跳跃都会消耗40stamina,直到你没有足够的资源来跳跃。

 

  Cooldown#

  冷却

  你可能想要为一个技能添加冷却时间。在这个部分,我们会迅速的学习如何将一个GameplayEffect如冷却时间一样作 用于跳跃技能。

   Abilities有一个特殊的GameplayEffect资产专门用于实现Cooldown。

  

  我们需要创建一个新的GameplayEffect然后确定我们的ability将它作为Cooldown GE来使用。(你可以点击“+”图标来 迅速的创建一个)

   这个Cooldown GE需要一个 Duration 效果(持续时间),不需要设置Modifiers,但需要为每个GameplayAbility设 置一个单独的GameplayTag,并放入GrantedTags槽内。(每个技能需要单独的冷却时间,冷却中将会添加对应的 GameplayTag,检测到这个Tag会阻止技能运行,冷却结束后会移除这个GameplayTag,则会再次允许激活技能)

  

 

  在UE5.3,GE Components组件的Gameplay Effects结构有了一些改变。大部分的UGameplayEffect 的结构都被分 割为了较小一些的GE Component。

  你需要调整这个部分,使用合适的GE Component来操作来自于Gameplay Effect CDO的有关资产。在cooldown 中,这意味着使用"Target Tags Gameplay Effect Component" 来给予所需的Tags到Owner Actor。

  

  

  (在UEE5.5中,又有了少量的变化,请按下图进行设置)

  

  冷却时间的长度将由Duration Magnitude来设置,使用一个Scalable Float数值设置到5.0(意味着我们每5秒才能 进行一次跳跃)。

  要添加新的Tag到GrantedTags槽位,点击"Edit…"按钮并创建和添加它。

  

  最后,确认你的技能已经在Cooldown Gameplay Effect Class资产里采用了对应的Cooldown GE。

  

  想要获得更多有关Cooldown Gameplay Effect的信息,可以参考官方文档对应章节它解释这些概念会比我做的更好。

 

  Stamina Regen Gameplay Effect#

  耐力恢复效果

  定义

  现在我们制作了一个跳跃技能并关联了Stamina损耗,再设置一个“被动“效果来恢复Stamina怎么样? 创建一个新的GameplayEffect,命名为GE_Stamina_Regen,并将数值按如下设置:

  

  Duraction Policy:Infinite

  Modifier Attribute:Stamina

  Modifier Operation :Add

  Modifier Magnitude: 5

  Period 0.2 (in seconds)

  注意:基于Attribute Based的数值计算类型(Magnitude Calculation Type), 你可以使用其他的attribute来计算每个周期的资源增加量,这很常见。GSCAttributeSet拥有一个RegenRate attribute对应健康、耐力和魔力(Health, Stamina and Mana)以供使用。

  我们现在需要将这个效果在我们的Character上实施。Granted Effects就是用来做这个的。更新这个Character蓝图上 的Ability System Component。

  

  现在点击运行,你会发现stamina开始恢复了。

  补充:当一个Ability激活的时候取消恢复。

  我们可做的最后的一点调整:让这个stamina恢复效果只在角色不处于跳跃的时候激活(例如在空中的时候)。我们 可以在Gameplay Ability中使用Activation Owned Tags来操作Gameplay Tags(tags granted to the Owner Actor),为恢复效果添加Ongoing Tag Requirements。

  首先,我们使用GameplayTag来配置这个技能class defaults面板中的Activation Owned Tags。

  

  尽管在本例子中不是必要的,我们仍要使用Ability Tags来确认技能,以便在其他技能使用Ability.*(父标签)的时候,通 过Block Abilities with Tag容器识别到别的技能在运行时来阻止本技能激活。 (意即使用了相同的父标签Ability的技能在激活子标签的时候,都是连带激活父标签的,如果你不想要同时激活一些 拥有相同父标签的技能,即直接检测目前父标签是否激活)

  然后,我们需要设置Ongoing Tag Requirements > Ignore Tags到恢复效果(持续时间无限),当拥有者 Actor(我们的角色)使用任何其他被给予的技能时让它暂时停止。在这个例子中,当角色跳跃的时候会激活 GA_Jump,技能会激活Ability.Jump tag并添加到角色以阻止恢复效果直到这个技能结束。

 

  

 

  以上是GAS Companion快速开始指南的全部,也是GAS的初步介绍。

  希望你喜欢这段旅行!(原作者比心)

 

posted @ 2025-04-23 10:27  赭与秋  阅读(398)  评论(0)    收藏  举报