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