GameplayAbilities System介紹 (二)
本篇要說明個人最近研究有關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的相關項目。
留言
張貼留言