UE4 GAS GamplayEffect 簡(jiǎn)單總結(jié)①
注意,這只是一個(gè)基于個(gè)人學(xué)習(xí)經(jīng)驗(yàn)的簡(jiǎn)單嘗試性總結(jié),可能會(huì)出現(xiàn)錯(cuò)誤,硬要說的話本人也沒有對(duì)此完全地掌握。如果您發(fā)現(xiàn)其中錯(cuò)誤了,請(qǐng)務(wù)必提出。
指定教材 《GASDocumentation》
目錄??
一 認(rèn)識(shí)結(jié)構(gòu)
二 持續(xù)策略
三 Modifier?
四 Execution?
一?認(rèn)識(shí)結(jié)構(gòu)
GameplayEffect(后續(xù)簡(jiǎn)稱GE)
此處省略一堆介紹語(yǔ)
GE的持續(xù)策略有三種,分別是Instant(瞬時(shí))、Infinite(無限)和HasDuration(有持續(xù)時(shí)間)。
GE的屬性修改可以分為兩類,一個(gè)是通過Modifier進(jìn)行修改,還有一種是借助Execution。此外,Modifier有四種方式,分別是 ScalableFloat、AttributeBased、CustomCulculationclass和SetByCaller。后續(xù)會(huì)分別介紹。
這里補(bǔ)一張導(dǎo)圖。
?



二 持續(xù)策略
① Instant策略 (間歇地,即設(shè)置了周期觸發(fā)的,也可以視為瞬時(shí)的)
*?僅有瞬時(shí)類型的GE,會(huì)觸發(fā)AttributeSet的PostGameplayEffectExecute方法
*?僅有瞬時(shí)類型的GE,能夠使用Execution Calculation [ExecCalc]
*??對(duì)于Instant類型所攜帶的GameplayCue,具體為GameplayCueNotifyStatic子類,可以使用HandleGameplayCueEvent或OnExecution,復(fù)寫兩個(gè)方法任意一個(gè)即可。
② Infinite策略(Duration策略與之類似,兩者可以統(tǒng)稱為Ongoing類型),
*??對(duì)于Ongoing類型所攜帶的GameplayCue,具體為GameplayCueNotifyStatic子類,會(huì)在添加時(shí)觸發(fā)OnActive,會(huì)在移除時(shí)觸發(fā)OnRemove,不應(yīng)當(dāng)嘗試觸發(fā)HandleGameplayCueEvent。
?

三 Modifier
① ScalableFloat
可以傳入一個(gè)CurveTable,完成由等級(jí)到數(shù)值的映射,沒什么好說的,最常用的方式。
② AttributedBase
基于其他屬性的計(jì)算與修改,比①稍微復(fù)雜一點(diǎn)方式。
示例:恢復(fù)最大生命值的12%。
過程:需要先指定BackingAttribute為MaxHP,然后在Coefficient一欄填寫 0.12,最后指定賦予的屬性。

③ CustomCulculationclass 即ModMag
最好C++來實(shí)現(xiàn),但可以考慮使用藍(lán)圖子類修改其中部分的預(yù)設(shè)數(shù)值。
非常實(shí)用的方式,可以一次捕捉多個(gè)屬性并賦給另一個(gè)屬性。
示例:角色的攻擊力AttackPower 往往是由多個(gè)屬性決定的,如等級(jí),攻擊力加成,攻擊點(diǎn)數(shù)等。
公式: AttackPower = [(ATK + Level * 2) + Add] * (1 + Mul)
過程:
?
*?可以在C++中定義Float數(shù)值,在藍(lán)圖子類中修改。
*?可以在C++中定義FCurveTableRowHandle,在藍(lán)圖子類中指定相應(yīng)的CurveTable
* 以攻擊力計(jì)算GE為例,它是Infinite策略,會(huì)在游戲開始時(shí)就交給角色。
④ SetByCaller
通常為在GA中計(jì)算得到了一個(gè)數(shù)值,然后想要在GE中應(yīng)用該數(shù)值,會(huì)用到該方式。
如在GA中計(jì)算了一個(gè)基礎(chǔ)傷害,希望它能夠傳遞至GE中,以進(jìn)行進(jìn)一步的傷害計(jì)算。
一般使用GameplayTag來傳遞該數(shù)值。
過程:
?
四、Execution 處理器
最強(qiáng)大的屬性處理方式,僅支持Instant類型。
你幾乎可以在UGameplayEffectExecutionCalculation類中做你想做的任何事,唯一的缺點(diǎn)是需要被重寫的Execute_Implementation是一個(gè)const方法,會(huì)有些許不便。
在ARPGSample項(xiàng)目中有一個(gè)完整且詳細(xì)的案例,這里就不貼代碼了。一般的,會(huì)在復(fù)雜的傷害計(jì)算時(shí)用到它。
* 之前有一篇教程,提及如何將GA實(shí)例以及其他復(fù)雜結(jié)構(gòu)體傳到 Execution中。具體方式為重寫了FGameplayEffectContext。