胡杭
(溫州大學數理與電子信息工程學院,溫州 325035)
近年來,隨著移動設備的不斷發展,手機端游戲越來越受到大家的青睞。App Annie數據顯示,移動游戲市場2018年在全球的規模達到了700億美元,增長速度達到26%。
Unity3D游戲引擎是一款全球領先的專業游戲開發引擎,在游戲開發領域占有著極大的比重,具有簡單易上手、功能豐富等特點。Unity3D引擎中集成了大量的開發工具,利用這些工具可以大幅度縮短開發周期[1]。另外,Unity3D具有跨平臺開發的優點,開發人員只需要一次開發,就可以將項目部署到多個平臺,包括Windows、iOS和Android這些主流的平臺,大大縮短了游戲開發周期[2]。
塔防游戲作為一款經典游戲,被許多玩家所喜愛。塔防游戲中面對敵軍的入侵,玩家可以建造一系列的防守道具來抵御入侵,最終取得游戲的勝利。目前游戲市場上有諸多塔防類游戲,例如植物大戰僵尸、皇家守衛軍等。這幾款游戲在可玩性和策略性上占有著很大的優勢,也深受廣大玩家所喜愛。但由于許多這類游戲是基于2D平臺進行開發的,因此在游戲畫質,游戲代入感方面并不是很出色。
本文針對2D塔防游戲存在的一些局限性問題,使用3D引擎進行設計和開發。在保證可玩性與策略性的基礎上,使用3D模型代替2D模型,增加視野控制功能,優化游戲畫質,增強游戲的趣味性。
塔防游戲功能模塊劃分如圖1所示。

圖1 游戲總體模塊結構圖
加載模塊:加載模塊主要實現加載界面,游戲場景加載時的一個過渡效果,能夠顯示當前場景的加載進度,實現異步交互,提供給玩家一個反饋,能夠增強玩家的游戲體驗。
商城模塊:增加商城模塊可以增加游戲的策略性。商城用于購買各種游戲道具,購買道具需要一定量的鉆石,鉆石可從游戲中獲取,也可以通過充值操作進行充值。購買的道具可在游戲中進行使用,不同的道具有不同的效果,對于游戲的局勢可以產生一定的影響。
升級模塊:增加升級模塊是另一種增強游戲策略性的方式。升級模塊可以進行各類炮塔的升級,每種炮塔的升級都能對炮塔的屬性進行一定的加持,玩家可以定制自己的升級策略。升級需要消耗一定數量的星星,星星的獲得是視游戲通關的情況而定,例如每次關卡完美通關可獲得3個星星。升級模塊可以促使玩家通過不斷提升關卡等級來解鎖新的升級策略。
道具模塊:道具模塊主要用于商城購買道具的施放。商城模塊主要注重購買,而道具模塊注重道具施放。例如,萬箭齊發道具可以向指定區域發射大量弓箭,造成物理傷害;龍卷風道具可以在指定區域形成龍卷風,造成范圍魔法傷害。
魔法模塊:為了使游戲更具特色,增加了魔法模塊。例如,治療魔法可以恢復1點生命值;減速魔法可以使指定區域敵人行進速度降低一段時間。魔法不消耗物品,但是具有冷卻時間,只有冷卻時間完成之后,魔法才可以使用。因此,如何有效地運用魔法,需要從游戲整體策略上進行規劃與設計。
玩家進入游戲主界面后,會呈現出已經解鎖的關卡,玩家可以通過不斷地通關當前關卡來解鎖下一個關卡。在關卡選擇界面,玩家可以進入商城和升級模塊,商城模塊可以進行道具的購買,升級模塊可以指定相應的升級策略。每一次戰斗都需要建立不同的炮塔防線來阻止敵軍的進攻。可以通過加速按鈕加速游戲的進程,通過暫停按鈕暫停游戲進程。每當戰斗勝利,便會得到一定的游戲獎勵。
Unity3D引擎具有諸多模塊,這里列舉了一些使用比較頻繁的功能模塊。
后來,攝影家辦了展覽,她在圈中就小有名氣了。涂當偶爾也給她拍幾張發在微博上,但一直是半紅不黑的,直到那天陳小北找到她。陳小北把她的照片放到了某知名網站上,并想方設法做成頭條新聞。一夜之間,她紅了,三炒兩炒,有一些名不見經傳的牌子或網店找她代言。于是,街頭巷尾的婆婆媽媽也知道了,只除了她那個從不上網的爸爸葉之容。
碰撞器模塊:碰撞器是游戲開發中至關重要的一個組件,它不斷檢測著物體之間的碰撞,并調用相應的回調函數。開發者可以在Unity腳本中重寫這些回調函數來對碰撞做出相關的策略。碰撞的實質其實是碰撞盒的碰撞。在Unity引擎中,為開發者提供了多種碰撞器,常見的有盒型碰撞器(Box Collider)、球型碰撞器(Sphere Collider)、膠囊型碰撞器(Capsule Collider)和網格碰撞器(Mesh Collider)[3]。其中,前三者可以處理模型較為簡單的物體,碰撞器能夠較好地包裹在模型的周圍形成碰撞盒,這樣檢測碰撞而消耗的性能也會較小;但是對于一些比較復雜的模型或者對碰撞盒的精確度有著較高的要求的情況下,就可以使用網格碰撞器。
Unity Shader:Unity 提供了許多內置的 Shader,其中,Unity標準著色器(Standard Shader)集成了非常強大而全面的功能。我們可以通過設置十種常用的貼圖(反射率貼圖、法線貼圖等)來渲染模型;我們可以設置渲染模式為Opaque(不透明)、Cutout(鏤空)、Fade(隱現)和Transparent(透明)來呈現不同的模型效果。另外,我們可以通過調節參數面板上的相關參數來改變模型的平滑度和金屬度。
動畫系統:Unity的動畫系統由以下幾部分構成:Avatar(骨骼模型)、Animation(動畫片段)、Animator(動畫組件)、Animator Controller(動畫控制器)。圖2為一個人形的骨骼模型,圖3為該模型的骨骼節點映射情況,Unity可以通過Avatar檢視面板來調節骨骼模型的各個節點的映射。骨骼動畫不會改變對象的位置、旋轉和縮放等內容,但會在幀間對其內部組成進行移動或變形[4]。

圖2 骨骼模型

圖3 骨骼映射
3D游戲開發過程中,3D建模是必不可少的步驟。玩家首先會通過模型去觀察整個游戲世界,進而去體驗游戲的其他內容。優秀的游戲模型能夠帶來游戲畫面的直觀感受,增加游戲的吸引力。諸如3Ds MAX、Maya、Rhino等軟件都能實現快速建模。通過采集模型,利用3Ds MAX軟件進行模型細節調整,能過完成游戲開發的初期建模工作。
MVC(Model-View-Controller)框架主要運用于軟件的分層開發,合理利用MVC框架能夠達到很好的解耦效果。MVC框架在軟件開發中能夠對軟件的可靠性、規范性和可擴展性起到極大的促進作用[5]。在游戲開發中,Model進行游戲數據的讀出和寫入,View層進行UI視圖層的控制,Controller層進行游戲核心邏輯的控制,并且對Model層和View層起到了一定調控作用。
如何平衡游戲畫質和游戲性能兩個方面一直以來是本文研究的重點。本文總結了如下幾點優化措施:
(1)使用對象池實現對象的預加載以及回收。游戲對象在創建過程中需要消耗大量的資源,導致設備卡頓。使用對象池能夠對游戲對象進行重復利用,減少資源的消耗,提高游戲性能。
(2)在保證圖像質量的前提下對圖像進行壓縮,并減少冗余資源和重復資源。這樣做的好處是能夠減少安裝包的體積,降低內存要求。
(3)使用靜態貼圖烘焙代替動態燈光效果。動態燈光效果所消耗的性能非常巨大,一般適用于動態的物體。對于靜態游戲資源,采用靜態貼圖烘焙能夠有效減少渲染所消耗的性能。
(4)為常用的物體添加Tag或Layer,而不是每次都使用Find查找。在開發中經常涉及到游戲對象的查找,遍歷查找所消耗的CPU資源是比較多的,通過添加Tag或Layer的方式查找能夠減小CPU的壓力。

圖4 導彈追蹤示意圖
如圖4所示,假設導彈的位置為(x1,y1,z1),目標的位置為(x2,y2,z2),連接導彈和目標的坐標,得到一條線段,線段和導彈初始發射方向所構成的夾角a就是要旋轉的角度,即在導彈飛向目標的過程中,角a不斷趨向于0。假設d為初始位置導彈和目標的距離,s為飛行過程中某一時刻導彈和目標的距離,a為線段和導彈初始發射方向所構成的夾角,則某一時刻線段和導彈方向所構成的夾角angle可以表示為s/d*a。因此,在導彈不斷飛行的過程中,角度逐漸的縮小,當距離為0時,導彈的正前方就是目標。算法實現核心思想如下:
(1)獲取目標的位置坐標;
(2)獲取導彈發射方向與目標位置連線的夾角;
(3)計算本幀內導彈移動的距離以及需要偏移的角度,并對導彈角度進行調整;
(4)循環步驟(3)直至導彈到達目標位置。
圖5為關卡模塊實現的效果圖,通過選擇不同的關卡來進行挑戰,并解鎖后續的關卡。關卡上的星星表示當前關卡的評級。在該界面可以點擊商店按鈕進入商店,點擊建造按鈕進入升級界面。圖6為道具商店界面,可以根據自身的金幣購買所需的道具,增強戰斗力。

圖5 游戲關卡選擇界面

圖6 道具商店界面
圖7為游戲戰斗畫面,玩家可以通過建造不同的炮塔來防御敵人的入侵,殺死敵人能夠獲得金幣,金幣可用來建造升級炮塔。當消滅所有的敵人時,就獲得勝利,游戲勝利畫面如圖8所示。

圖7 游戲戰斗畫面

圖8 游戲勝利畫面
本文介紹了一個移動塔防游戲的設計和實現過程。本游戲使用3Ds MAX進行游戲建模,使用碰撞系統來進行碰撞檢測,使用動畫系統進行動畫控制,使用Unity Shader進行渲染,使用MVC框架進行更好地代碼維護。并且,運用游戲優化手段來平衡畫質和性能,使用恰當的算法來實現游戲邏輯。本文對塔防3D游戲設計與實現進行了詳盡的闡述,完成了3D休閑類游戲的設計與開發。