胡靜,胡欣宇
(1.山西農(nóng)業(yè)大學(xué)軟件學(xué)院,山西 太谷 030801;2.山西財(cái)經(jīng)大學(xué),管理科學(xué)與工程學(xué)院,山西 太原 030006)
近年來隨著計(jì)算機(jī)物理硬件的提升以及社會(huì)經(jīng)濟(jì)的進(jìn)步,游戲技術(shù)也得到了空前的發(fā)展。無論是游戲引擎還是玩法,都得到了長足的進(jìn)步。Unity是一款由Unity科技公司所設(shè)計(jì)的可跨平臺(tái)的2D與3D游戲引擎,其支持開發(fā)Windows等電腦平臺(tái)、任天堂Switch等主機(jī)平臺(tái)以及 Android等移動(dòng)設(shè)備的各種游戲,以及基于WebGL技術(shù)的網(wǎng)頁平臺(tái)以及TVOS等多媒體平臺(tái)。塔防是指通過在地圖上建造各種各樣的炮塔來阻止游戲中的敵人抵達(dá)指定位置的實(shí)時(shí)戰(zhàn)略計(jì)算機(jī)游戲,此類游戲的目標(biāo)是生存若干時(shí)間或盡可能生存下去。玩家一般有生命值,生命值以敵人數(shù)量為基準(zhǔn),如果敵人在到達(dá)指定地點(diǎn)之前沒有被消滅,玩家就會(huì)減少生命。隨著怪物波次的增加和炮塔屬性的逐漸提升,怪物的數(shù)量、屬性以及各種特殊能力也會(huì)提升[1-4]。
目前國內(nèi)外許多專家在Unity平臺(tái)研發(fā)了多種游戲,如伍傳敏等人基于Unity3D完成了第一人稱射擊游戲的設(shè)計(jì)與開發(fā)[5]。張典華等人基于Unity3D實(shí)現(xiàn)了多平臺(tái)兼容的三維空戰(zhàn)游戲[6]。劉晉鋼等人則研究了Unity3D與Kinect整合數(shù)據(jù)技術(shù)在體感游戲中的應(yīng)用價(jià)值[7]。
本文通過C++設(shè)計(jì)并實(shí)現(xiàn)了一款基于Unity3D引擎的TowerDefence游戲,實(shí)現(xiàn)了怪物AI設(shè)置,攻擊檢測(cè)算法的設(shè)計(jì)以及游戲特效和渲染管道等關(guān)鍵技術(shù)。游戲運(yùn)行流暢,畫面精良,操作簡(jiǎn)單,體驗(yàn)豐富,上線后收獲大量好評(píng)。
本文的塔防游戲玩法設(shè)計(jì)遵循以下原則:(1)玩家放置的障礙物可以在障礙物摧毀基地之前傷害或殺死敵方攻擊者。(2)修復(fù)障礙物的能力。(3)升級(jí)障礙物的能力。(4)能夠修復(fù)障礙物的升級(jí)。(5)用于購買升級(jí)和維修的某種貨幣(可以是時(shí)間,游戲內(nèi)貨幣或經(jīng)驗(yàn)值,例如通過擊敗攻擊單位而獲得的貨幣)。(6)能夠一次穿越多條路徑的敵人。(7)每波通常有固定數(shù)量和類型的敵人。(8)許多現(xiàn)代的塔防游戲都從實(shí)時(shí)游戲發(fā)展到回合游戲,其中存在不同的階段,例如構(gòu)建,防御,修復(fù)和慶祝。許多游戲(例如Flash Element Tower Defence)的敵人都經(jīng)過“迷宮”,使玩家能夠戰(zhàn)略性地放置“塔”以獲得最佳效果。但是,某些類型的游戲類型迫使用戶從自己的“塔”中創(chuàng)建“迷宮”,例如Desktop Tower Defense。該類型的某些版本是這兩種類型的混合形式,其預(yù)設(shè)路徑可以通過放置塔來進(jìn)行某種程度的修改,或者可以通過放置路徑來進(jìn)行修改,或者可以通過放置路徑來進(jìn)行更改。通常,一項(xiàng)必不可少的策略是“驚人”,這是創(chuàng)建長而曲折的塔樓(或“迷宮”)以延長敵人經(jīng)過防御所必須經(jīng)過的距離的策略。有時(shí)可以通過在一側(cè)設(shè)置出口然后在另一側(cè)設(shè)置出口以使敵人來回移動(dòng)直到被擊敗之間交替進(jìn)行“雜耍”。一些游戲還允許玩家修改塔樓使用的攻擊策略,以便以更誘人的合理價(jià)格進(jìn)行防御[8]。
本游戲的開發(fā)環(huán)境是基于Unity 2017.1.0f3 (64-bit)版本,使用LitJSON技術(shù)處理JSON字符串之間的轉(zhuǎn)換,結(jié)合DOTween技術(shù)進(jìn)行實(shí)現(xiàn)。
本游戲系統(tǒng)設(shè)計(jì)如圖1所示,主要包含五個(gè)模塊:工廠管理模塊、游戲管理模塊、UI模塊、場(chǎng)景管理模塊、游戲邏輯模塊。
工廠管理模塊:用于管理各種資源工廠以及游戲物體工廠。
游戲管理模塊:用于管理各種管理者。
UI模塊:用于控制所有UI相關(guān)組件,包括UI面板、UI按鈕、UI滑動(dòng)等。
游戲邏輯模塊:用于處理各種游戲邏輯如塔的攻擊等。
場(chǎng)景管理模塊:用于管理各種場(chǎng)景的轉(zhuǎn)換、加載以及退出。
圖1 系統(tǒng)模塊圖
以物體工廠為例,本游戲系統(tǒng)的資源管控方法基于游戲物體工廠管理UI、UI面板與游戲物體的激活與失活[9-14]。游戲物體工廠擁有一個(gè)工廠基類BaseFactory,實(shí)現(xiàn)接口IBaseFactory并在該基類中使用對(duì)象池技術(shù),使子彈、怪物、塔在生成時(shí)不必反復(fù)創(chuàng)建和銷毀對(duì)象,只需要從對(duì)象池中取出與放回對(duì)象便可節(jié)省系統(tǒng)資源。對(duì)象池流程如圖2所示。
游戲物體工廠擁有一個(gè)枚舉類型FactoryType,用于區(qū)分不同種類的游戲物體工廠。游戲物體工廠擁有三個(gè)工廠類GameFactory、UIFactory和UIPanelFactory繼承至工廠基類,它們之間的區(qū)別是修改了在對(duì)象池獲取資源時(shí)的資源路徑[15]。
怪物生成:由于怪物的種類、屬性都不完全一致,因此怪物的生成采用責(zé)任鏈模式與建造者模式。該責(zé)任鏈模式有兩個(gè)節(jié)點(diǎn):Level與Round,其中Level控制Round。
責(zé)任鏈模式中由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來形成一條鏈,請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求,發(fā)出這個(gè)請(qǐng)求的客戶端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任。責(zé)任鏈模式設(shè)計(jì)如圖3所示。
圖3 責(zé)任鏈模式設(shè)計(jì)圖
塔防游戲中的攻擊檢測(cè)主要是圍繞塔展開的,塔遇到以下三種情況會(huì)發(fā)生攻擊:(1)怪物進(jìn)入攻擊范圍;(2)怪物停留在攻擊范圍;(3)怪物離開攻擊范圍。當(dāng)怪物進(jìn)入攻擊范圍時(shí),有集火目標(biāo)但是沒有找到集火目標(biāo),判斷找到游戲物體的Tag,當(dāng)找到的是物品且是集火目標(biāo),鎖定當(dāng)前第一個(gè)進(jìn)入檢測(cè)區(qū)域的物品為攻擊目標(biāo)。當(dāng)找到的是怪物,判斷該怪物是不是集火目標(biāo)。當(dāng)怪物是集火目標(biāo)時(shí),鎖定當(dāng)前第一個(gè)進(jìn)入檢測(cè)區(qū)域的怪物為攻擊目標(biāo)。當(dāng)怪物不是集火目標(biāo)時(shí),鎖定當(dāng)前第一個(gè)進(jìn)入檢測(cè)區(qū)域的怪物為攻擊目標(biāo)。當(dāng)前沒有集火目標(biāo)且當(dāng)前沒有攻擊目標(biāo),鎖定當(dāng)前第一個(gè)進(jìn)入檢測(cè)區(qū)域的怪物為攻擊目標(biāo)。怪物停留攻擊范圍的判斷方法與怪物進(jìn)入攻擊范圍的判斷方法一致。當(dāng)怪物離開攻擊范圍時(shí),判斷怪物是不是塔的攻擊目標(biāo),如果是,則將塔設(shè)置為無集火目標(biāo)、無攻擊目標(biāo)狀態(tài)。攻擊檢測(cè)算法流程圖如圖4所示。
圖4 塔攻擊檢測(cè)算法流程圖
游戲中的圖像特效是基于Shader算法編程實(shí)現(xiàn)的渲染管線完成的。Shader是一種著色器,主要負(fù)責(zé)將輸入的網(wǎng)格(Mesh)通過編程的方式按照用戶需求進(jìn)行著色和貼圖,然后渲染輸出。在Unity3D中,Shader可以分為表明著色器、固定功能著色器和頂點(diǎn)/片段著色器三種[16],Shader編程是計(jì)算機(jī)圖形學(xué)的重要部分,其主要是通過針對(duì)GPU的渲染管線(也即GPU繪圖流程,包括頂點(diǎn)繪制、面繪制、光柵處理、像素著色等過程)的具體操作變更來實(shí)現(xiàn)的。也就是說,用戶可以通過在GPU渲染管線的某個(gè)或者多個(gè)過程中注入自己編輯的程序來實(shí)現(xiàn)想要的圖形特效效果。
具體的一個(gè)Shader程序要做的內(nèi)容如下:第一步,從內(nèi)存中讀取圖形對(duì)象的數(shù)據(jù)(頂點(diǎn)等),并通過三角形網(wǎng)格對(duì)其進(jìn)行近似,然后將每個(gè)對(duì)象以其自身的方向和大小放入局部坐標(biāo)系中,再通過應(yīng)用幾何變換將所有對(duì)象組合到一個(gè)全局坐標(biāo)系中。第二步,處理攝影機(jī)視角,即以虛擬攝像機(jī)為世界空間的原點(diǎn)的坐標(biāo)系統(tǒng)處理。由于相機(jī)看不到背面,因此會(huì)剔除所有背面多邊形。第三步,照明步驟。光源是在游戲世界空間中定義的簡(jiǎn)單對(duì)象,是顏色,強(qiáng)度,方向,焦點(diǎn)和位置的組合,然后執(zhí)行剔除步驟,在視錐體內(nèi)部(相對(duì)于外部)的對(duì)象被保留在場(chǎng)景中(視其完全被剔除),而在視錐內(nèi)部和外部之間的對(duì)象被部分剔除。最終,渲染場(chǎng)景。光柵化將這些像素轉(zhuǎn)換為形成一系列三角形的屏幕坐標(biāo),應(yīng)該對(duì)其進(jìn)行檢查和著色。
接下來介紹本文設(shè)計(jì)的消融算法,消融是光影漸變消失的一種特效,而消融算法從某種程度上可以理解為一種插值,實(shí)際上就是通過構(gòu)造噪聲圖來實(shí)現(xiàn)顏色侵蝕過渡的效果,然后逐漸增加透明度從而實(shí)現(xiàn)漸變消失。通常是應(yīng)用于火焰和消失特效。下面給出本游戲系統(tǒng)中使用的消融特效算法:
其原理是通過點(diǎn)積的形式,操作frag處的像素顏色值與一個(gè)float3的值,然后得到消融RGB權(quán)重,該權(quán)重越小則表示其像素越快消失。而消失速率_Time.x每幀自增1/8s,discard是消除像素。
本游戲的測(cè)試主要是圍繞游戲性能(游戲平衡性、游戲順暢度等維度)、游戲壓力測(cè)試、游戲功能測(cè)試等方面展開。打開游戲后其怪物界面如圖5所示。
圖5 怪物界面顯示
接下來轉(zhuǎn)入游戲關(guān)卡,地圖和怪物正常加載,圖6是獎(jiǎng)勵(lì)系統(tǒng)測(cè)試圖。
圖6 獎(jiǎng)勵(lì)系統(tǒng)測(cè)試圖
本游戲提供了地圖編輯器。當(dāng)Unity編輯器處于Tool模式時(shí)可以正常使用地圖編輯器工具讀取關(guān)卡列表,編輯怪物種類數(shù)量,恢復(fù)地圖編輯器默認(rèn)狀態(tài),清除怪物路點(diǎn),保存當(dāng)前關(guān)卡數(shù)據(jù)文件。地圖編輯器如圖7所示。
圖7 地圖編輯器
本文針對(duì)基于Unity3D引擎技術(shù)設(shè)計(jì)和實(shí)現(xiàn)了一款塔防游戲。游戲基于工廠模式設(shè)計(jì)并實(shí)現(xiàn)了對(duì)象資源的池化管理,提出了基于責(zé)任鏈的怪物AI,對(duì)于攻擊檢測(cè)算法也提供了有效的解決方案。針對(duì)游戲特效,本文以消融為例介紹了本游戲的特效算法,可以有效的提供良好的渲染效果。