重構(gòu)心得
????最近一直在做有關(guān)技能和戰(zhàn)斗相關(guān)的代碼整理奏瞬,也史無前例血淚交加的進(jìn)行了3次重構(gòu)侄刽,程序員果然是一群與眾不同的群體,如此的樂于推翻自己過往的工作,卻又樂此不疲蒲赂。
????但是話說回來阱冶,每一次的重構(gòu)都帶來的意想不到的效果,雖然說中途會遇到一些小問題滥嘴,但是大體上來說木蹬,重構(gòu)帶來的好處是非常多的,特別適合項(xiàng)目前期探索階段若皱。
戰(zhàn)斗技能的腳本系統(tǒng)
????一般游戲都免不了需要接觸戰(zhàn)斗系統(tǒng)镊叁,戰(zhàn)斗無非就是單位/技能/Buff/飛行物/事件這些模塊而已。而這其中的核心就是技能走触。 最開始做的一版架構(gòu)下晦譬,每一個技能都由腳本進(jìn)行處理,通過技能表直接映射到技能文件互广,新加一個技能新寫一個腳本文件敛腌,這樣的好處是,技能邏輯可以做的非常靈活惫皱,而且調(diào)試也比較方便像樊,直接在相應(yīng)的技能中output或者斷點(diǎn)就好了。
第二次重構(gòu)
????不過上述做法缺點(diǎn)也是很明顯的逸吵,新加一個技能必須重新新一些一個腳本凶硅。雖然可以通過模版的方式減少后續(xù)的操作,但是追求完美的程序是不會止步于此(閑的蛋疼)的扫皱,考慮到多數(shù)技能可能只是中途的某些元素不一樣足绅,其實(shí)多數(shù)流程大體上都差不多(造成傷害,搜索單位韩脑,移動目標(biāo)氢妈,顯示特效,播放動作段多,等等)首量,那么我們是不是可以將這些元素獨(dú)立出來,并提供一個可以配置的機(jī)制进苍,這樣任何一個技能只是基礎(chǔ)元素的組合加缘,程序只需要維護(hù)一個個的基礎(chǔ)元素就好。這樣就形成了第二次重構(gòu)的思路基礎(chǔ)觉啊。具體設(shè)計上拣宏,我們獨(dú)立出來了一個效果的概念,技能可以擁有多個效果杠人,效果可以主動施放的時候觸發(fā)勋乾,也可以被動監(jiān)聽事件的時候觸發(fā)宋下,效果內(nèi)部是一個個的基礎(chǔ)元素,我們稱之為操作辑莫,操作附帶條件学歧,這樣一個效果內(nèi)就形成了一個簡單的邏輯,技能施放本質(zhì)上就是走效果內(nèi)部的邏輯流程各吨。工作中實(shí)際情況是枝笨,重構(gòu)結(jié)束后技能應(yīng)用配置上也確實(shí)達(dá)到了預(yù)期的效果,程序員不用再維護(hù)一個個的技能了绅你,確實(shí)蠻爽的伺帘,但是需要著重注意的一點(diǎn)是,對基礎(chǔ)元素的設(shè)計一定要慎重忌锯,我們現(xiàn)在光是傷害就有5種基礎(chǔ)的操作伪嫁,沒辦法,需求就是要支持不同類型偶垮。所以基礎(chǔ)元素的設(shè)計一定要根據(jù)具體的游戲需求來张咳。
第三次重構(gòu)
????最開始的設(shè)計上,邏輯和顯示是一一對應(yīng)的似舵,完全的所見即所得脚猾,游戲中進(jìn)行到了什么步驟,比如回合制中等待玩家操作砚哗,單位A移動中這些情況下龙助,邏輯也是完全處于這個狀態(tài)的,這種設(shè)計的好處是在于蛛芥,所見即所得提鸟,調(diào)試清晰,缺點(diǎn)也非常的明顯仅淑,就是邏輯和顯示存在耦合称勋。舉個例子就是施放技能,當(dāng)顯示復(fù)雜一些的時候涯竟,邏輯甚至需要去讀取某一個模型的執(zhí)行時間來決定邏輯自身需要協(xié)程式的卡住多久赡鲜,這種設(shè)計下實(shí)現(xiàn)邏輯會非常復(fù)雜,特別是邏輯存在各種各樣事件的時候庐船。這個需求促使了我們進(jìn)行了第三次重構(gòu)银酬。首先我們分析,由于我們自己是一個回合制游戲筐钟,游戲中并不存在過多的玩家操作揩瞪,甚至可以非常簡化,即輪到玩家的操作盗棵,施放一下技能壮韭,后續(xù)的邏輯(直到下一輪之前)都是確定的。那么我們可以這樣設(shè)計:玩家操作后(主要是技能施放)纹因,邏輯就開始進(jìn)行運(yùn)算喷屋,在一幀之內(nèi)將所有的結(jié)果都計算完畢,亦即邏輯已經(jīng)停留在了下一回合階段瞭恰,在這個過程中邏輯會輸出一系列的顯示流屯曹,通知顯示進(jìn)行處理。顯示層根據(jù)顯示流來進(jìn)行一個個具體表現(xiàn)的處理惊畏,諸如顯示單位恶耽,播放動作,播放特效等等颜启。這樣的好處是偷俭,將復(fù)雜的表現(xiàn)和清晰的邏輯分開,表現(xiàn)層只關(guān)心自己的表現(xiàn)缰盏,而邏輯可以更清晰的處理自己最終輸出數(shù)據(jù)的結(jié)果涌萤,分離的算是比較完美。這種設(shè)計的復(fù)雜度會更多的交給表現(xiàn)口猜,甚至是表現(xiàn)需要負(fù)責(zé)進(jìn)行表現(xiàn)的排序處理等等负溪。不過這種設(shè)計帶來的好處實(shí)在是太多了,過往我們需要做諸如游戲開始后整個邏輯屏幕抖動一下/播放各種特效后游戲才真正開始這樣的效果济炎,是需要修改邏輯的川抡,現(xiàn)在邏輯已經(jīng)完全不關(guān)心這個了,全部交給表現(xiàn)來處理须尚,可以做很多豐富的效果崖堤。
總結(jié)
????總而言之,對于產(chǎn)品來說恨闪,好的游戲都是磨出來的倘感,而對于程序來說,好的設(shè)計也都是重構(gòu)出來的咙咽。 與君共勉@下辍!钧敞!