重構(gòu)心得
????最近一直在做有關(guān)技能和戰(zhàn)斗相關(guān)的代碼整理,也史無前例血淚交加的進(jìn)行了3次重構(gòu),程序員果然是一群與眾不同的群體,如此的樂于推翻自己過往的工作,卻又樂此不疲。
????但是話說回來,每一次的重構(gòu)都帶來的意想不到的效果,雖然說中途會(huì)遇到一些小問題,但是大體上來說,重構(gòu)帶來的好處是非常多的,特別適合項(xiàng)目前期探索階段。
戰(zhàn)斗技能的腳本系統(tǒng)
????一般游戲都免不了需要接觸戰(zhàn)斗系統(tǒng),戰(zhàn)斗無非就是單位/技能/Buff/飛行物/事件這些模塊而已。而這其中的核心就是技能。 最開始做的一版架構(gòu)下,每一個(gè)技能都由腳本進(jìn)行處理,通過技能表直接映射到技能文件,新加一個(gè)技能新寫一個(gè)腳本文件,這樣的好處是,技能邏輯可以做的非常靈活,而且調(diào)試也比較方便,直接在相應(yīng)的技能中output或者斷點(diǎn)就好了。
第二次重構(gòu)
????不過上述做法缺點(diǎn)也是很明顯的,新加一個(gè)技能必須重新新一些一個(gè)腳本。雖然可以通過模版的方式減少后續(xù)的操作,但是追求完美的程序是不會(huì)止步于此(閑的蛋疼)的,考慮到多數(shù)技能可能只是中途的某些元素不一樣,其實(shí)多數(shù)流程大體上都差不多(造成傷害,搜索單位,移動(dòng)目標(biāo),顯示特效,播放動(dòng)作,等等),那么我們是不是可以將這些元素獨(dú)立出來,并提供一個(gè)可以配置的機(jī)制,這樣任何一個(gè)技能只是基礎(chǔ)元素的組合,程序只需要維護(hù)一個(gè)個(gè)的基礎(chǔ)元素就好。這樣就形成了第二次重構(gòu)的思路基礎(chǔ)。具體設(shè)計(jì)上,我們獨(dú)立出來了一個(gè)效果的概念,技能可以擁有多個(gè)效果,效果可以主動(dòng)施放的時(shí)候觸發(fā),也可以被動(dòng)監(jiān)聽事件的時(shí)候觸發(fā),效果內(nèi)部是一個(gè)個(gè)的基礎(chǔ)元素,我們稱之為操作,操作附帶條件,這樣一個(gè)效果內(nèi)就形成了一個(gè)簡(jiǎn)單的邏輯,技能施放本質(zhì)上就是走效果內(nèi)部的邏輯流程。工作中實(shí)際情況是,重構(gòu)結(jié)束后技能應(yīng)用配置上也確實(shí)達(dá)到了預(yù)期的效果,程序員不用再維護(hù)一個(gè)個(gè)的技能了,確實(shí)蠻爽的,但是需要著重注意的一點(diǎn)是,對(duì)基礎(chǔ)元素的設(shè)計(jì)一定要慎重,我們現(xiàn)在光是傷害就有5種基礎(chǔ)的操作,沒辦法,需求就是要支持不同類型。所以基礎(chǔ)元素的設(shè)計(jì)一定要根據(jù)具體的游戲需求來。
第三次重構(gòu)
????最開始的設(shè)計(jì)上,邏輯和顯示是一一對(duì)應(yīng)的,完全的所見即所得,游戲中進(jìn)行到了什么步驟,比如回合制中等待玩家操作,單位A移動(dòng)中這些情況下,邏輯也是完全處于這個(gè)狀態(tài)的,這種設(shè)計(jì)的好處是在于,所見即所得,調(diào)試清晰,缺點(diǎn)也非常的明顯,就是邏輯和顯示存在耦合。舉個(gè)例子就是施放技能,當(dāng)顯示復(fù)雜一些的時(shí)候,邏輯甚至需要去讀取某一個(gè)模型的執(zhí)行時(shí)間來決定邏輯自身需要協(xié)程式的卡住多久,這種設(shè)計(jì)下實(shí)現(xiàn)邏輯會(huì)非常復(fù)雜,特別是邏輯存在各種各樣事件的時(shí)候。這個(gè)需求促使了我們進(jìn)行了第三次重構(gòu)。首先我們分析,由于我們自己是一個(gè)回合制游戲,游戲中并不存在過多的玩家操作,甚至可以非常簡(jiǎn)化,即輪到玩家的操作,施放一下技能,后續(xù)的邏輯(直到下一輪之前)都是確定的。那么我們可以這樣設(shè)計(jì):玩家操作后(主要是技能施放),邏輯就開始進(jìn)行運(yùn)算,在一幀之內(nèi)將所有的結(jié)果都計(jì)算完畢,亦即邏輯已經(jīng)停留在了下一回合階段,在這個(gè)過程中邏輯會(huì)輸出一系列的顯示流,通知顯示進(jìn)行處理。顯示層根據(jù)顯示流來進(jìn)行一個(gè)個(gè)具體表現(xiàn)的處理,諸如顯示單位,播放動(dòng)作,播放特效等等。這樣的好處是,將復(fù)雜的表現(xiàn)和清晰的邏輯分開,表現(xiàn)層只關(guān)心自己的表現(xiàn),而邏輯可以更清晰的處理自己最終輸出數(shù)據(jù)的結(jié)果,分離的算是比較完美。這種設(shè)計(jì)的復(fù)雜度會(huì)更多的交給表現(xiàn),甚至是表現(xiàn)需要負(fù)責(zé)進(jìn)行表現(xiàn)的排序處理等等。不過這種設(shè)計(jì)帶來的好處實(shí)在是太多了,過往我們需要做諸如游戲開始后整個(gè)邏輯屏幕抖動(dòng)一下/播放各種特效后游戲才真正開始這樣的效果,是需要修改邏輯的,現(xiàn)在邏輯已經(jīng)完全不關(guān)心這個(gè)了,全部交給表現(xiàn)來處理,可以做很多豐富的效果。
總結(jié)
????總而言之,對(duì)于產(chǎn)品來說,好的游戲都是磨出來的,而對(duì)于程序來說,好的設(shè)計(jì)也都是重構(gòu)出來的。 與君共勉?。。?/p>