虛幻四Gameplay Ability System入門(6)-Gameplay Effect詳解(1)Modifier

在之前的五篇文章中军俊,我們已經(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拦盹。

Untitled.png

GE Duration

GE本身有三種持續(xù)時間的方式鹃祖。分別是Instant,Infinite掌敬,Has a Duration惯豆。

Untitled 1.png
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。

Untitled 2.png

Modifier

Modifier可以被理解為修改一個屬性Attribute的方法扳碍,一個GE可以擁有0或者多個modifier提岔。

Untitled 3.png

在一個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星瘾。

Untitled 4.png

計算Magnitude的方法有四種: Scalable Float, Attribute Based, Custom Calculation Class, Set By Caller。

Scalable Float

Scalable Float可以直接輸入一個值惧辈,以這個值作為最終的Magnitude去修改所選Attribute琳状,之前我們所有的GE使用的都是這種方法。

Untitled 5.png

當(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ù)。

Untitled 6.png

AttackDamage對應(yīng)的數(shù)據(jù)如下

Untitled 7.png

我們可以通過導(dǎo)入CSV文件來生成自己的數(shù)據(jù)表啊胶。原始數(shù)據(jù)如下甸各。注意,我自己在測試的時候用EXCEL轉(zhuǎn)csv焰坪,需要設(shè)置全部的數(shù)據(jù)類型為float趣倾,否則無法導(dǎo)入。

Untitled 8.png

導(dǎo)入和導(dǎo)入結(jié)果

Untitled 9.png
Untitled 10.png

我覺得還是通過例子來實驗一下最好某饰。創(chuàng)建一個GE命名為GE_ScalableFloat_Test

Untitled 11.png

測試的方法如下儒恋,直接向自己應(yīng)用測試GE。首先輸入level為1

Untitled 12.png

第一張圖里level=1露乏,可以看到造成的傷害為10碧浊。第二張圖里的level=4,造成的傷害為40瘟仿。和我們在表中定義的一致箱锐。

但是這里的Magnitude有些奇怪,無論我如何修改返回的都是-1劳较,不知道有沒有大佬知道原理可以幫我解釋一下驹止。

Untitled 13.png
Untitled 14.png

Attribute Based

第一種計算方式講完了,進(jìn)入第二種观蜗。顧名思義臊恋,第二種方法就是根據(jù)Attribute來計算Magnitude。

Untitled 15.png

它可以從GE的Source或者Target處獲取一個Attribute墓捻,然后獲取這個ttribute的BaseValue或者CurrentValue用來計算修改量Magnitude抖仅。

Untitled 16.png

獲取Attribute Value后,還需要計算最終的Magnitude,這里的計算流程為撤卢。這里的三個選項同樣可以使用DataTable环凿,然后根據(jù)level進(jìn)行調(diào)整。

Untitled 17.png
Untitled 18.png

和剛才一樣放吩,還是做一個測試智听。

Untitled 19.png

可以看到造成的傷害為-0.5*(20+100)=-60

Untitled 20.png

調(diào)整一下。

Untitled 21.png

這一次造成的傷害為-0.5*100+20=-30

Untitled 22.png

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ù)制代碼
Untitled 23.png

Set By Caller

最后一種計算方式欣喧。

Untitled 24.png

它的實現(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類的實例泽腮。

Untitled 25.png

我認(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。

Untitled 26.png

總結(jié)

這篇文章到這里就寫的差不多了丰榴,主要介紹了Modifier計算修改值的四種方法团搞,下一篇我會在C++中實現(xiàn)本次沒有介紹的Custom Class計算方法。還有實現(xiàn)Execution多艇,它是一種和Modifier并列的修改屬性值的方法,它的強(qiáng)大之處在于可以修改多個Attributes像吻。之后GE可能還有一期講解剩余的部分峻黍。

Untitled 27.png

最后再提一下Github的這篇文章,對我?guī)椭艽蟛Υ遥兄x大佬姆涩。
https://github.com/tranek/GASDocumentation#concepts-ge

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惭每,隨后出現(xiàn)的幾起案子骨饿,更是在濱河造成了極大的恐慌,老刑警劉巖台腥,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏赘,死亡現(xiàn)場離奇詭異,居然都是意外死亡黎侈,警方通過查閱死者的電腦和手機(jī)察署,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峻汉,“玉大人贴汪,你說我怎么就攤上這事⌒莘停” “怎么了扳埂?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘤礁。 經(jīng)常有香客問我阳懂,道長,這世上最難降的妖魔是什么蔚携? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任希太,我火速辦了婚禮,結(jié)果婚禮上酝蜒,老公的妹妹穿的比我還像新娘誊辉。我一直安慰自己,他們只是感情好亡脑,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布堕澄。 她就那樣靜靜地躺著邀跃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛙紫。 梳的紋絲不亂的頭發(fā)上拍屑,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音坑傅,去河邊找鬼僵驰。 笑死,一個胖子當(dāng)著我的面吹牛唁毒,可吹牛的內(nèi)容都是我干的蒜茴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼浆西,長吁一口氣:“原來是場噩夢啊……” “哼粉私!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起近零,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诺核,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后久信,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窖杀,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年裙士,在試婚紗的時候發(fā)現(xiàn)自己被綠了陈瘦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡潮售,死狀恐怖痊项,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酥诽,我是刑警寧澤鞍泉,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站肮帐,受9級特大地震影響咖驮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜训枢,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一托修、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恒界,春花似錦睦刃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽际长。三九已至,卻和暖如春兴泥,著一層夾襖步出監(jiān)牢的瞬間工育,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工搓彻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留如绸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓旭贬,卻偏偏與公主長得像竭沫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骑篙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容