在之前的五篇文章中军俊,我們已經(jīng)無數(shù)次使用了技能系統(tǒng)中的Gameplay Effect多矮,但是我們僅僅使用了最簡單的部分氯析,實際上GE的功能十分強(qiáng)大缎岗,接下來的三篇文章我打算進(jìn)一步說明GE的各個模塊和應(yīng)用方法静尼。
GE的定義
之前已經(jīng)提到過了,現(xiàn)在還是再次說明,GE可以看做是一種改變Attributes和GameplayTags的容器鼠渺,它應(yīng)該是data-only的鸭巴,不該包含額外的邏輯。
GE修改Attributes是通過Modifier和Execution拦盹。
GE Duration
GE本身有三種持續(xù)時間的方式鹃祖。分別是Instant,Infinite掌敬,Has a Duration惯豆。
Duration Type | 具體應(yīng)用方法 |
---|---|
Instant | 立即啟用,用以改變屬性的BaseValue奔害。因為瞬時的效應(yīng)楷兽,不應(yīng)該用來添加GameplayTags |
Duration | 擁有持續(xù)時間,修改的是屬性的CurrentValue华临⌒旧保可以添加Gameplay Tags。 |
Infinite | 持續(xù)時間是永久雅潭,但可以手動移除揭厚。修改的是屬性的CurrentValue》龉可以添加Gameplay Tags筛圆。 |
要注意,Duration和Infinite有特殊的情況椿浓,那就是他們擁有Periodic時太援,他們的實際執(zhí)行效果類似于每經(jīng)過一段period執(zhí)行的Instant GE。
Modifier
Modifier可以被理解為修改一個屬性Attribute的方法扳碍,一個GE可以擁有0或者多個modifier提岔。
在一個Modifier中,首先可以看到Attribute選項笋敞,它選擇的是所在Modifier修改的Attribute碱蒙。第二個選項是Modifier Op,它意味著對所選擇的Attribute是如何修改的夯巷∪停總共有四種選項: Add, Multiply, Divide, Override。Add意味著修改方式為原Attribute加上modifier計算的修改大小趁餐。其它三個選項都是相似的喷兼。
Modifier Magnitude
Magnitude可以理解為修改量,比如角色擁有20點Damage澎怒,可能經(jīng)過一系列計算,最終造成的傷害是50,這個最終值就是Magnitude喷面,計算最終傷害的方法就是Magnitude Calculation Type星瘾。
計算Magnitude的方法有四種: Scalable Float, Attribute Based, Custom Calculation Class, Set By Caller。
Scalable Float
Scalable Float可以直接輸入一個值惧辈,以這個值作為最終的Magnitude去修改所選Attribute琳状,之前我們所有的GE使用的都是這種方法。
當(dāng)然盒齿,Scalable Float還可以進(jìn)行擴(kuò)展念逞,它可以選擇一個Curve Table,使用的時候會自動的讀取數(shù)據(jù)表中的row边翁,然后根據(jù)GE的level選擇對應(yīng)的數(shù)據(jù)翎承。下圖是EPIC商城中官方的RPG游戲demo里的例子。它選擇了AttackDamage作為數(shù)據(jù)表符匾,選擇了行DefaultAttack叨咖,然后根據(jù)輸入的level選擇對應(yīng)的行的數(shù)據(jù)。
AttackDamage對應(yīng)的數(shù)據(jù)如下
我們可以通過導(dǎo)入CSV文件來生成自己的數(shù)據(jù)表啊胶。原始數(shù)據(jù)如下甸各。注意,我自己在測試的時候用EXCEL轉(zhuǎn)csv焰坪,需要設(shè)置全部的數(shù)據(jù)類型為float趣倾,否則無法導(dǎo)入。
導(dǎo)入和導(dǎo)入結(jié)果
我覺得還是通過例子來實驗一下最好某饰。創(chuàng)建一個GE命名為GE_ScalableFloat_Test
測試的方法如下儒恋,直接向自己應(yīng)用測試GE。首先輸入level為1
第一張圖里level=1露乏,可以看到造成的傷害為10碧浊。第二張圖里的level=4,造成的傷害為40瘟仿。和我們在表中定義的一致箱锐。
但是這里的Magnitude有些奇怪,無論我如何修改返回的都是-1劳较,不知道有沒有大佬知道原理可以幫我解釋一下驹止。
Attribute Based
第一種計算方式講完了,進(jìn)入第二種观蜗。顧名思義臊恋,第二種方法就是根據(jù)Attribute來計算Magnitude。
它可以從GE的Source或者Target處獲取一個Attribute墓捻,然后獲取這個ttribute的BaseValue或者CurrentValue用來計算修改量Magnitude抖仅。
獲取Attribute Value后,還需要計算最終的Magnitude,這里的計算流程為撤卢。這里的三個選項同樣可以使用DataTable环凿,然后根據(jù)level進(jìn)行調(diào)整。
和剛才一樣放吩,還是做一個測試智听。
可以看到造成的傷害為-0.5*(20+100)=-60
調(diào)整一下。
這一次造成的傷害為-0.5*100+20=-30
Custom Calculation Class
這個計算方式的實現(xiàn)需要在C++中創(chuàng)建類UGameplayModMagnitudeCalculation的派生類渡紫。重寫方法CalculateBaseMagnitude_Implementation來實現(xiàn)到推。這種計算方式非常靈活和強(qiáng)大,我們可以在其中自由的選擇所需要的Attributes惕澎,用自己想要的方法去計算最終的Magnitude莉测。它的實現(xiàn)方法和GameplayEffectExecutionCalculations類似。由于需要打開C++實現(xiàn)集灌,我今天又比較懶不像寫代碼了悔雹,所以放在下期和Execution一起實現(xiàn)。
virtual float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override;
復(fù)制代碼
Set By Caller
最后一種計算方式欣喧。
它的實現(xiàn)方式為通過向GE中傳入一個帶有Magitude的Caller腌零,作為修改值。傳入Caller可以通過指定Data Name或者Tag唆阿。這里建議使用Tag益涧,因為這樣可以避免因為輸入錯誤的Name而產(chǎn)生錯誤。
感謝藍(lán)圖驯鳖,讓理解功能變得更加方便和快速了闲询,這里吐個槽,不理解為啥有這么多人覺得藍(lán)圖不好用浅辙。在這里扭弧,我們首先創(chuàng)建了一個Outgoing Spec,表示了作用的ASC以及所使用的GE和level记舆,然后向創(chuàng)建好的Spec中傳入我們需要的Caller鸽捻,最后向自己應(yīng)用我們所創(chuàng)建的GE Spec。GESpec的概念類似于創(chuàng)建一個GE類的實例泽腮。
我認(rèn)為Set By Caller這種計算方法在藍(lán)圖的使用中更為靈活御蒲,比如有一個GE用來對敵人造成傷害,傷害的大小可以在該項技能的Ability BP中通過Caller傳入诊赊。當(dāng)然C++中也可以使用厚满。
Source Tags和Target Tags
一個modifier中還有最后一個部分。這里的兩個Tags工作原理和Ability中的Application Tag Requirement一樣碧磅,他只在GE被應(yīng)用前被檢測碘箍,決定該GE是否會被Apply遵馆,因此Infinite和Duration的GE也只會在第一次apply前考慮這兩個Tags。
總結(jié)
這篇文章到這里就寫的差不多了丰榴,主要介紹了Modifier計算修改值的四種方法团搞,下一篇我會在C++中實現(xiàn)本次沒有介紹的Custom Class計算方法。還有實現(xiàn)Execution多艇,它是一種和Modifier并列的修改屬性值的方法,它的強(qiáng)大之處在于可以修改多個Attributes像吻。之后GE可能還有一期講解剩余的部分峻黍。
最后再提一下Github的這篇文章,對我?guī)椭艽蟛Υ遥兄x大佬姆涩。
https://github.com/tranek/GASDocumentation#concepts-ge