[程式] GameplayAbilities System介绍 (二)

楼主: yekdniw (yekdniw)   2018-09-08 14:58:40
网页版
https://yekdniwunrealengine.blogspot.com/2018/09/gameplayabilities-system.html
本篇要说明个人最近研究有关UE4 Gameplay abilities system的各个系统介绍以及
负责的项目。
AbilitySystemComponent
AbilitySystemComponent(ASC),处理一个角色整个GAS的相关事务。每一个可以
发动ability或是受到ability效果的单位都必须挂上ASC。
ASC身为中心负责了ability的发动与接收,角色属性值的变更与网络传输。
由于ASC通常是程式在C++端就挂上去,所以这个系统原则上跟企划比较没有关系。
AttributeSets
一个角色的属性值,通常技能最后的结果就是影响角色的值。
例如血量,能量,气条,攻击力。
AtrributeSets内储存的值都是浮点数,要使用其他类型可能就不适合
(或是根本没办法?)。
通常这部份的值都是企划决定。UE4在这部份也提供了curve table,
让值可以从表格决定,并且可以定义根据不同等级该有的值。
例如玩家角色的防御值可能会被定义为
PlayerDefense 1,2,5,10
代表等级1的时候防御是1,到了等级4的时候防御值是10。
GameplayAbility
一个Ability可以视为一个技能,技能可以决定从client先发动,
或是从server发动,以及技能要不要同步。
Tag组合
技能上面可以定义许多不同的tag组合,用来处理各种可能的情况:
1. 技能在角色拥有哪些tag才可以发动
2. 角色有哪些tag的话不能发动此技能
3. 这个技能启动后会取消有哪些tag的其他技能
4. 这个技能发动期间哪些tag的其他技能不能被发动成功
以下是范例:
1. 要有已知用火的tag,火技能才能发动
2. 角色被上了冻结的tag,技能不能发动
3. 施放大绝会取消所有普通技能
4. 施放技能中所有战斗技能都不能被发动。
Costs and Cooldowns
技能也支援costs以及cooldowns的概念,costs处理发动一个技能要有的消耗,
例如发动技能要耗10点魔力,如果角色魔力不足就会发动失败。
cooldowns处理发动一个技能后的冷却时间,要冷却时间结束之后才能够再次发动。
Triggers
技能的发动除了可以手动呼叫之外,也可以利用技能的Trigger机制,
设定角色的某一个tag被触发的时候就启动这个技能。
GameplayEffect
GameplayEffect(GE)效果通常用来处理属性值的变化,效果的效期,叠加的规则,
以及这个效果启动时的表现。
Duration Policy设定此效果是Instanct(即时),infinite(永久),
或是HasDuration(有时间区段)
效果的部分有很多细项,目前我也不是全部都看完,以下就说明有稍微理解的部分。
Modifiers
Modifiers决定的就是属性值的变更,一个效果可以决定多个属性值的变更,
例如扣血并降防。
ModifierOp则是宣告数值的使用方法是加、乘、除、或是覆蓋。
例如移动速度加100,能量除2,或是血量变成1。
Modifier Magnitude定义这个效果要变更这个属性的量是多少。
Scalable Float是一个常数值,或是常数值*表格中的某一个值。
Attribute Based就是一个常数公式。CustomCalculationClass是更进阶的公式,
如果Attribute Based无法满足还可以自己定义算式。
Set by Caller则是可以从外部用GameplayEvent的方式传入。
Application
Change to Apply to Target可以设定效果发生的机率。
Display
可以决定效果发动的时候要播放的GameplayCue,因为gameplay Cue是一个Actor,
所以可以挂特效,或是挂音效在上面。
Immunity
似乎是可以设定如果要上效果的单位有哪些tag的话会免疫。
或是可以建立更复杂的判断公式决定效果无法上。没有实际试过。
Stacking
处理效果堆叠的部分,包含堆叠的对象,堆叠的数量,堆叠时效果该有的行为。
各个系统之间的关系
一个角色会有一个AbilitySystemComponent,一个ASC要定义那些Ability可以
被这个角色使用,然后才能在适当的时机启动ability。
也就是说如果角色不会冰冻技能,即使你叫他启动冰冻的技能也会启动失败。
一个角色可以有多个AttributeSets,例如大家都有血量(AS_Base),
但是只有某些角色有魔力,就可以把这个角色挂上(AS_Mana)之类的attribute sets
做组合。
而一个Ability里面通常会定义多组GameplayEffect,宣示一个技能发动可能
可以触发多个效果,例如冰球打中后损血(GE_Damage),并且缓速(GE_SlowDown)。
除此之外,costs及cooldowns也是以特别的GE定义在Ability之内。
GameplayEffect不局限于只能在Ability内发动,只要拿的到ASC
就可以为ASC所拥有的角色发动GameplayEffect。
使用范例
在此列出一些使用上的范例。
狂暴技能
假设狂暴模式启动会播放狂暴开始的动画,移动速度提升30%,防御加100,5秒后结束
AttributeSet:需要两个属性MoveSpeed,Defense
GameplayEffect:GE_SuperMode
DurationPolicy设Has Duration,Scalable Float Magnitude设5秒
Modifiers有两项,一项是Defense,Add 100,另一项是MoveSpeed,Multiply 1.3。
Ability:SuperModeAbility,在ActivateAbility串PlayMontageAndWait,
在动画播完的后面呼叫ApplyGameplayEffectSpecToOwner,类似下图。
(记得要呼叫CommitAbility以及EndAbility,不然可能会不正常)
大致上完成上面的设定,狂暴技能就完成了。
技能与效果取消
假设有一个技能A能够取消技能B,只要在技能B的AbilityTags新增一个Tag
假设叫Ability.B。然后在技能A的CancelAbilitiesWithTags新增Ability.B。
这样当A发动的时候B就会被呼叫CancelAbility。
以上是大概用了两个半礼拜的心得,未来再看看有没有可以介绍GAS的相关项目。
作者: coolrobin (泳圈)   2018-09-08 17:07:00
推一下,看来这整个系统不小,改天来研究一下
作者: tst5381 (tst)   2018-09-17 18:32:00
最近一直在找相关概念的实作,感谢提供资讯

Links booklink

Contact Us: admin [ a t ] ucptt.com