游戏技能系统 简称(GAS),是一个健壮的,高度可扩展的gameplay框架,通常用于构件RPG、MOBA等游戏的完整战斗逻辑框架。
通过GAS,可以快速地制作游戏中的主动/被动技能、各种效果Buff、计算属性伤害、处理玩家各种战斗状态逻辑。
Ability System Component(ASC)是整个GAS的基础组件。
ASC本质上是一个UActorComponent,用于处理整个框架下的交互逻辑,包括
使用技能GA(GameplayAbility)包括攻击、疾跑、施法、翻滚、使用道具等,但不包括基础移动和UI
包含属性AS(AttributeSet)角色身上可以用float表示的属性,如生命值、体力值、魔力值等
处理各种效果GE(GameplayEffect)用于修改属性,如增加50移动速度10s;还能配合GA实现更多玩法
GC(Gameplay Cues) 播放特效、音效等
所有需要应用GAS的对象(Actor),都必须用于GAS组件。
拥有ASC的Actor本称为ASC的OwnerActor,ASC实际作用的Actor叫做AvatarActor。
ASC可以被赋予某个角色ASC,也可以被赋予PlayerState(可以保存死亡角色的一些数据)
GameplayTags 是一种层级标签,通过GameplayTagManager进行注册。它不属于GAS的功能,是内置在UE中。
它可以替代原本的Bool或Enum的结构,可以在玩法设计中更高效的标记对象的行为或状态。
Gameplay Ability(GA)标识了游戏中的一个对象(Actor)可以做的行为或技能。
能力(Ability)可以是普通攻击或者吟唱技能,可以是角色被击飞倒地,还可以是使用某种道具,交互某个物件,甚至跳跃、飞行等角色行为也可以是Ability。
Ability可以被赋予对象或从对象的ASC中移除,对象同时可以激活多个GameplayAbility。
基本的移动输入、UI交互行为不能或不建议通过GA来实现。
技能制作需要继承至插件内置的GameplayAbility类,里面事件触发回调以及事件结束回调。
触发相应的技能需要使用ASC的方法去调用
在触发技能之前,可以根据自己的需求设置是否触发当前的技能。
Gameplay Effect(GE)是Ability对自己或他人产生影响的途径。
GE通常可以被理解为我们游戏中的buff。比如增益/减益效果(修改属性)。
但是GAS中的GE也更为广义,释放技能时候的伤害结算,施加特殊效果的控制、霸体效果(修改GameplayTag)都是通过GE来实现的。
GE相当于一个可配置的数据表,不可以添加逻辑。开发者创建一个UGameplayEffect的派生蓝图,就可以根据需求制作想要的效果。
创建GE需要继承GameplayEffect
它只是一个纯数据蓝图,不处理逻辑,所以有用的就是配置里面的配置项的修改。
AttributeSet(AS) 负责定义和持有属性,并且管理属性的变化,包括网络同步。
需要在Actor中被添加为成员变量,并注册到ASC(C++)。
一个ASC可以拥有一个或多个(不同的)AttributeSet,隐藏可以角色共享一个很大的Attribute Set,也可以每个角色按需添加Attribute Set。
可以在属性变化前(PreAttributeChange)后(PostGameplayEffectExecute)处理相关逻辑,可以通过委托的方式绑定属性变化。
GAS是官方内置的插件,所以,我们可以在插件管理器里面直接搜到,安装完成以后,如何查看安装成功。在资源管理器右键查看是否有Gameplay技能蓝图。
这个需要创建继承Character的子类,然后在子类上面添加GAS。
自己创建的类需要继承Acharacter,还需要继承IAbilitySystemInterface接口
增加相应的变量申明
获取GAS的方法
在类的构造函数里面实例化
UAbilitySystemComponent* ASACharacter::GetAbilitySystemComponent()const
{
return AbilitySystemComponent;
}
获取GAS里面直接返回GAS实例即可。
角色初始是没有技能,需要我们在初始时,将GA赋予ASC,并初始化ASC
在角色的类的默认值这里,设置角色的初始技能。
如果在运行时附加技能,那么,在Character上面增加一个调用ASC增加技能的方法即可。
我们首先需要继承AttributeSet类
增加基类里面的定义方法的宏
构造函数,属性修改回调
构造函数设置默认值
属性网络同步用的,我做的是单机游戏,用不到,先留着
属性修改前回调,有属性修改就会触发,里面主要防止血量和体力值出现负值的情况
属性修改后回调,只在GE为Instant的时候触发
定义单个属性设置这些内容
别忘了在character里面构造函数里面初始化
设置完成这些,就可以直接在character里面直接获取相应的属性
在蓝图里面就可以直接获得角色相关属性值
创建一个Gameplay技能蓝图
调用的方法内置了三种,分别是通过实例,类,以及GA的Tag。注意,一定先将GA设置给GAS,调用才起作用。设置在创建GAS的有说。
技能里面内置两个事件,ActivateAbility是当前GA触发时的回调。事件OnEndAbility为当前GA结束时的回调。
在类的默认值这里,标签这里设置Tags,其它GA可以通过Tags来处理GA之间的逻辑关系。比如GAS可以通过TryActivateAbilitiesbyTag来调用GA。
此项为是否总是同步到服务器
网络相关的一些配置,我用不到,没有细研究。
Retrigger Instanced Ability 尝试重新触发技能,并停止之前触发的。
Costs为消耗,释放当前技能所需的成本
Cooldowns 冷却
这两个参数都需要设置一个GE的类,后面会讲GE
触发器可以在角色身上添加了某个Tag时,来触发此GA
Trigger Source :
Gameplay Event: 接收到带有Tag的Gameplay Event时触发GA,角色身上不会拥有此tag
Owner Tag Added :OwnerActor添加相应的tag时触发GA,每次添加触发一次GA
Owner Tag Present :OwnerActor拥有此tag的时候触发GA,失去时将取消GA
根据技能的运行流程,判断是否触发GA是ASC里面去做的逻辑处理
成功将触发事件ActivateAbility
判断消耗和冷却是在触发ActivateAbility之前就完成了,现在CommitAbility是提交消耗和冷却,如果提交时,技能消耗和冷却不符合要求,也会退出技能。
一般技能都是随带着动画播放实现的,技能里面需要播放的都是蒙太奇动画
正常的蒙太奇是这种
带有task的是这种,可以在GA结束时自动停掉蒙太奇
这个是定义的带有Gameplay Event的蒙太奇,可以在GASDocument项目案例中找到代码
结束时记得调用EndAbility来结束此技能
当然,中间还有技能释放时会播放GE,修改目标的值,获取目标的方法还是和之前一样了,你可以通过动画通知事件触发获取相应的事件获取
获取到目标的ASC,然后赋予目标ASC相应的GE造成相应的伤害等效果。
GE其实相当于一个数据蓝图,里面没有相关的逻辑处理,我们只能在配置那里进行相应的数值处理,GE也是修改Attribute的唯一渠道。
GE不但可以实现伤害效果,还可以实现技能冷却,技能消耗,以及初始化角色属性。
创建GE需要继承GameplayEffect
创建完成里面主要配置有上面的几大类,下面,将会对每一项的属性进行讲解。
首先是主要配置项,它属于GE的核心配置
Duration Policy 当前GE的持续效果
Modifiers 修改attribute,因为是数组,可以修改多个
Executions 支持更复杂的方式修改attribute
Conditional Gameplay Effects 当前GE触发成功后,需要调用的其它GE
这些简短的介绍一下,因为后面我会出特定的使用情景下的设置方式
参考文章: