《高等元素論》 從程序?qū)崿F(xiàn)的角度分析和復(fù)刻原神的元素反應(yīng)系統(tǒng)
最近用了一周時(shí)間仔細(xì)學(xué)習(xí)了各個(gè)版本的高等元素論文字和視頻教材,感覺(jué)目前的教材都是從玩家的角度描述現(xiàn)象和嘗試用玩家容易認(rèn)知的方式去歸納里面的原理,還充斥著各種科研名詞,讓這個(gè)系統(tǒng)可能變得比它實(shí)際的樣子更復(fù)雜。
所以我有興趣從代碼實(shí)現(xiàn)的角度去分析什么樣的系統(tǒng)框架可以更優(yōu)雅的實(shí)現(xiàn)現(xiàn)有的表現(xiàn),同時(shí)希望能拋磚引玉,讓各位玩家有機(jī)會(huì)換一個(gè)角度穿過(guò)現(xiàn)象看本質(zhì)。
注意,這篇文章需要一定的游戲制作知識(shí),不然可能稍微難懂(蛋定,我不是專業(yè)程序,會(huì)盡可能用一般概念描述邏輯)

先說(shuō)結(jié)論:我目前構(gòu)造出的系統(tǒng)因?yàn)楣ぷ髁吭驎簳r(shí)只實(shí)現(xiàn)了冰火雷水四個(gè)元素的相互反應(yīng),但目測(cè)是可以實(shí)現(xiàn)所有元素的反應(yīng)的,而且和原版效果相差無(wú)幾。
代碼和可運(yùn)行的DEMO:https://github.com/realamex/GenshinElement

核心思路
1、元素本質(zhì)應(yīng)該是一種BUFF(不像一般BUFF,元素沒(méi)有固定結(jié)束時(shí)間,而是通過(guò)元素量什么時(shí)候衰減到0決定結(jié)束附著),那么如果有一個(gè)成熟的BUFF系統(tǒng)再做元素會(huì)方便很多,但我手上沒(méi)有,所以只能隨便寫(xiě)個(gè)勉強(qiáng)夠用的湊合
2、反應(yīng)是兩兩元素觸發(fā)時(shí)生成的對(duì)象,在這個(gè)對(duì)象里定義什么元素組合(包括先后手順序)可以觸發(fā)這個(gè)反應(yīng),以及觸發(fā)反應(yīng)時(shí)有什么事情發(fā)生(也可以套娃,在反應(yīng)時(shí)生成新元素)
3、可附著對(duì)象暫時(shí)用一個(gè)unity組件實(shí)現(xiàn),具體項(xiàng)目則不一定,這跟實(shí)際項(xiàng)目有關(guān)。但總之這本質(zhì)是一個(gè)buff的生命周期和觸發(fā)邏輯管理器。這個(gè)管理器決定了元素如何附著如何反應(yīng)如何殘留。
4、CD管理器,在可附著對(duì)象中管理自身不同來(lái)源對(duì)象以及元素的附著和反應(yīng)CD(工作量關(guān)系這部分沒(méi)做,而且不影響大體效果)

規(guī)則要點(diǎn)
反應(yīng)與附著:遵守先反應(yīng)后附著的原則,每幀判斷——當(dāng)元素A嘗試向某個(gè)對(duì)象附著時(shí),在A元素中定義了這個(gè)元素會(huì)按什么順序去目標(biāo)對(duì)象已附著的元素中尋找能觸發(fā)反應(yīng)的元素,如果所有共存中的附著元素都判斷過(guò)了,且沒(méi)有反應(yīng)完畢,則A元素殘留的部分會(huì)附著在對(duì)象上。當(dāng)附著發(fā)生時(shí),觸發(fā)A元素的附著邏輯。
新舊元素刷新:同款元素新的會(huì)刷新舊的,刷新時(shí)只觸發(fā)A元素的刷新邏輯,不觸發(fā)附著邏輯
DOT元素:如果某個(gè)元素是DOT,會(huì)在附著期間按指定頻率觸發(fā)DOT邏輯(比如感電就是個(gè)隱藏圖標(biāo)的DOT元素,雷水反應(yīng)的結(jié)果只是生成這個(gè)元素且0消耗,后面的每次扣元素量+傷害+削韌是感電元素在DOT時(shí)做的)
先手后手與克制關(guān)系:用一張表或者類似表的數(shù)據(jù)結(jié)構(gòu)管理反應(yīng)元素的指向性與消耗比例等參數(shù)的關(guān)系

已知問(wèn)題以及一些疑問(wèn)
只做了4個(gè)元素
感電的傳導(dǎo)傷害沒(méi)做
各種反應(yīng)和附著CD沒(méi)做
原神中不符合此邏輯框架的特例,不確定是故意這樣的還是某種bug——凍結(jié)和水共存時(shí),火會(huì)先打凍,但即便過(guò)量也不會(huì)和剩下的水反應(yīng),消耗完凍之后火的元素量會(huì)被直接清零(注意火是可以和水反應(yīng)的,但為何會(huì)提前結(jié)束?);而凍結(jié)和冰或水共存時(shí),風(fēng)會(huì)先擴(kuò)散水或冰,過(guò)量的風(fēng)會(huì)繼續(xù)消耗凍擴(kuò)散冰(這就又符合先反應(yīng)后附著的原則了)
疑問(wèn)1:上述特例在當(dāng)前框架內(nèi)可以加補(bǔ)丁實(shí)現(xiàn),但感覺(jué)這個(gè)設(shè)定其實(shí)沒(méi)啥必要?過(guò)量火會(huì)繼續(xù)反應(yīng)水會(huì)有什么問(wèn)題呢?尤其是凍下藏冰時(shí)又不會(huì)這樣,會(huì)繼續(xù)反應(yīng)掉。所以懷疑是bug
疑問(wèn)2:附著CD常見(jiàn)的3次或2.5s原則實(shí)際本質(zhì)是削弱高頻攻擊的傷害增益,頻率越高削弱程度越接近2/3
疑問(wèn)3:擴(kuò)散水元素的時(shí)候不會(huì)傳遞傷害只會(huì)傳遞元素量,這是什么考慮?這么明顯的東西一定不是BUG,也一定不是邏輯不好寫(xiě),肯定是故意的。冰火都可以被擴(kuò)散出傷害,冰火反應(yīng)傷害加成也很高啊?這樣到底是要限制什么呢?
我的代碼歡迎拿去用,或者在評(píng)論區(qū)提出自己的看法??

附錄-核心代碼(詳見(jiàn)開(kāi)頭的github鏈接)






