[原创]UE—GAS系列:1. 基础概念

UE的技能系统 ( Gameplay Ability System 简称:GAS ) ,官方是以插件的形式嵌入在UE引擎中;你完全可以在自己的项目中用使用自己团队的”祖传”技能系统,但我还是推荐大型项目优先使用 GAS 。它的优点是:度高灵活、可复用性强;缺点是:过于庞大、不易上手

如果你是第一次接触 GAS,可能被一些专有名词给绕晕 :GameplayAbility(GA)、 AbilitySystemComponent(ASC) 、GameplayEffect (GE)、AttributeSet(AS)、 GameplayCue (GC); 那么,我就通俗易懂的解释一下这些概念

GameplayAbility(GA)

武当有一门神技《梯云纵》,施展以后就能一跃十丈,潇洒无边。这本秘籍就是GA ,我们来看看这本秘籍的内容:梯云纵(第一重)

神技心法:

  • 气沉丹田
  • 聚气成力

神技说明:

  • 每天只能施展一次
  • 每次施展消耗一点真气

神技威力:

  • 一跃而起,离地一丈
  • 形成雷鸣,方圆一里

AbilitySystemComponent(ASC)

想要习得上乘武功,就必须有习武的神经中枢(俗称:天赋),没有天赋只有秘籍那就是个王语嫣;而这个神经中枢就是ASC

因此想要施展技能,Character 必须挂上ASC 组件,神经中枢是通过 GiveAbility 融汇贯通了梯云纵的神技心法

ASC->GiveAbility(const FGameplayAbilitySpec& Spec);
FGameplayAbilitySpec 主要参数如下:
UGameplayAbility* GA;  //梯云纵
int32 Level;           //第一重
UObject* SourceObject; //谁习得梯云纵(自己)

GameplayEffect (GE)

融汇贯通了梯云纵心法,那是不是就可以出门行侠仗义,闯荡江湖了呢?还是得从长计议,神技虽然威力无边,但也有很大的自身限制,因为神技第一重每天只能使用一次。用GAS它是怎么实现的呢?那就要用到 GE 了

GE 通俗一点理解就是 Buff,DeBuff ;施展完一次梯云纵以后,GA会告知 ASC,请在小本本上写一行标记: CoolDown.Skill.TiYunZong ,然后24小时后删掉这行标记。伪代码如下:

//GE相当于一份配置文件,包含ASC要记的标记,持续时间等要素
UGameplayEffect* CooldownGE = GetCooldownGameplayEffect();
if (CooldownGE)
{
    const auto SpecHandle = MakeOutGESpec(CooldownGE->GetClass(), 1);
    ApplyGameplayEffectSpecToOwner(ActivationInfo, SpecHandle);
}

施展梯云纵之前,ASC 首先会去小本本检查是否有 CoolDown.Skill.TiYunZong 这个标签。如果有那就表示距离上次使用未超过一天时间不得再次施展,这就是GAS 进行技能冷却的原理

AttributeSet(AS)

施展梯云纵之前,中枢神经ASC还会去检查你体内是否有足够的真气,而真气就是 AS,也就是GAS中常说的属性点,比如: 真气(Mana),血量(Health) 等。那么扣一点属性点,是怎么实现的呢?同样是使用 GE 告知 ASC,你扣除身上的Mana属性值 1 点,瞬间完成。伪代码如下:

UGameplayEffect* CostGE = CostEnergyGE;
const auto SpecHandle = MakeOutGESpec(CostGE->GetClass(), 1);
if (SpecHandle.Data)
{
    //代码有删改,意思就是设置GE内对应tag扣的值
    SpecHandle.Data->SetSetByCallerMagnitude("Data.Energy.Mana", 1);
    ApplyGameplayEffectSpecToOwner(ActivationInfo, SpecHandle);
}

这样,就完成了属性点扣除。同样,在梯云纵施展之前,出了要检查是否有 CoolDown.Skill.TiYunZong 这个标签,ASC 还会去检查属性点 Mana 是否足够你施展完以后扣除,不够就不能施展;强行施展后会抽走全身精气走火入魔

GameplayCue (GC)

施展梯云纵的时候,由于它威力巨大,会在方圆一里产生巨大的雷鸣,震撼八方 宵小之辈。那么GAS 是如何实现的呢?也是通过 GE 告知 ASC,丢出去一个一次性暗器 ( 也就是GC ),它会播放一个3D环绕雷声(声音范围:方圆一里)以及雷电特效,播放完以后自动销毁 。GE 配置了丢哪个暗器(Gameplay Cue Tag),以及何时销毁(Has Duration)

总结

注意: ASC 组件不一定非得挂在 Character 身上,你也可以挂在 PlayerState 身上,甚至游戏内任何想要使用技能的 Actor 身上。GE 是 GAS 的灵魂,也是重中之重,很多效果都是通过 GE 去驱动。GAS 还有一个核心 — FGameplayTag,但这是UE4引擎本身的标签系统;如果没有 FGameplayTag 配合,GAS 就显得平平无奇;FGameplayTag + GAS 组成强大的技能系统,可以实现任何上天入地的炫酷技能

至此,我们可以基本上明白GAS内的各个名词的功能。但实际上,这才是梯云纵的第一层,想要达到大圆满境界,我们仍需努力。以下是我觉得比较好的一些 GAS 视频链接,适合新手登堂入室

GAS新手链接: