看板 GameDesign 關於我們 聯絡資訊
網頁版 https://yekdniwue.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的相關項目。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.64.68 ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1536389925.A.20A.html
dreamnook: 09/08 15:53
coolrobin: 推一下,看來這整個系統不小,改天來研究一下 09/08 17:07
tst5381: 最近一直在找相關概念的實作,感謝提供資訊 09/17 18:32
※ 編輯: yekdniw (59.120.146.90 臺灣), 07/15/2020 11:07:25