胡杭
(溫州大學(xué)數(shù)理與電子信息工程學(xué)院,溫州 325035)
近年來(lái),隨著移動(dòng)設(shè)備的不斷發(fā)展,手機(jī)端游戲越來(lái)越受到大家的青睞。App Annie數(shù)據(jù)顯示,移動(dòng)游戲市場(chǎng)2018年在全球的規(guī)模達(dá)到了700億美元,增長(zhǎng)速度達(dá)到26%。
Unity3D游戲引擎是一款全球領(lǐng)先的專(zhuān)業(yè)游戲開(kāi)發(fā)引擎,在游戲開(kāi)發(fā)領(lǐng)域占有著極大的比重,具有簡(jiǎn)單易上手、功能豐富等特點(diǎn)。Unity3D引擎中集成了大量的開(kāi)發(fā)工具,利用這些工具可以大幅度縮短開(kāi)發(fā)周期[1]。另外,Unity3D具有跨平臺(tái)開(kāi)發(fā)的優(yōu)點(diǎn),開(kāi)發(fā)人員只需要一次開(kāi)發(fā),就可以將項(xiàng)目部署到多個(gè)平臺(tái),包括Windows、iOS和Android這些主流的平臺(tái),大大縮短了游戲開(kāi)發(fā)周期[2]。
塔防游戲作為一款經(jīng)典游戲,被許多玩家所喜愛(ài)。塔防游戲中面對(duì)敵軍的入侵,玩家可以建造一系列的防守道具來(lái)抵御入侵,最終取得游戲的勝利。目前游戲市場(chǎng)上有諸多塔防類(lèi)游戲,例如植物大戰(zhàn)僵尸、皇家守衛(wèi)軍等。這幾款游戲在可玩性和策略性上占有著很大的優(yōu)勢(shì),也深受廣大玩家所喜愛(ài)。但由于許多這類(lèi)游戲是基于2D平臺(tái)進(jìn)行開(kāi)發(fā)的,因此在游戲畫(huà)質(zhì),游戲代入感方面并不是很出色。
本文針對(duì)2D塔防游戲存在的一些局限性問(wèn)題,使用3D引擎進(jìn)行設(shè)計(jì)和開(kāi)發(fā)。在保證可玩性與策略性的基礎(chǔ)上,使用3D模型代替2D模型,增加視野控制功能,優(yōu)化游戲畫(huà)質(zhì),增強(qiáng)游戲的趣味性。
塔防游戲功能模塊劃分如圖1所示。
圖1 游戲總體模塊結(jié)構(gòu)圖
加載模塊:加載模塊主要實(shí)現(xiàn)加載界面,游戲場(chǎng)景加載時(shí)的一個(gè)過(guò)渡效果,能夠顯示當(dāng)前場(chǎng)景的加載進(jìn)度,實(shí)現(xiàn)異步交互,提供給玩家一個(gè)反饋,能夠增強(qiáng)玩家的游戲體驗(yàn)。
商城模塊:增加商城模塊可以增加游戲的策略性。商城用于購(gòu)買(mǎi)各種游戲道具,購(gòu)買(mǎi)道具需要一定量的鉆石,鉆石可從游戲中獲取,也可以通過(guò)充值操作進(jìn)行充值。購(gòu)買(mǎi)的道具可在游戲中進(jìn)行使用,不同的道具有不同的效果,對(duì)于游戲的局勢(shì)可以產(chǎn)生一定的影響。
升級(jí)模塊:增加升級(jí)模塊是另一種增強(qiáng)游戲策略性的方式。升級(jí)模塊可以進(jìn)行各類(lèi)炮塔的升級(jí),每種炮塔的升級(jí)都能對(duì)炮塔的屬性進(jìn)行一定的加持,玩家可以定制自己的升級(jí)策略。升級(jí)需要消耗一定數(shù)量的星星,星星的獲得是視游戲通關(guān)的情況而定,例如每次關(guān)卡完美通關(guān)可獲得3個(gè)星星。升級(jí)模塊可以促使玩家通過(guò)不斷提升關(guān)卡等級(jí)來(lái)解鎖新的升級(jí)策略。
道具模塊:道具模塊主要用于商城購(gòu)買(mǎi)道具的施放。商城模塊主要注重購(gòu)買(mǎi),而道具模塊注重道具施放。例如,萬(wàn)箭齊發(fā)道具可以向指定區(qū)域發(fā)射大量弓箭,造成物理傷害;龍卷風(fēng)道具可以在指定區(qū)域形成龍卷風(fēng),造成范圍魔法傷害。
魔法模塊:為了使游戲更具特色,增加了魔法模塊。例如,治療魔法可以恢復(fù)1點(diǎn)生命值;減速魔法可以使指定區(qū)域敵人行進(jìn)速度降低一段時(shí)間。魔法不消耗物品,但是具有冷卻時(shí)間,只有冷卻時(shí)間完成之后,魔法才可以使用。因此,如何有效地運(yùn)用魔法,需要從游戲整體策略上進(jìn)行規(guī)劃與設(shè)計(jì)。
玩家進(jìn)入游戲主界面后,會(huì)呈現(xiàn)出已經(jīng)解鎖的關(guān)卡,玩家可以通過(guò)不斷地通關(guān)當(dāng)前關(guān)卡來(lái)解鎖下一個(gè)關(guān)卡。在關(guān)卡選擇界面,玩家可以進(jìn)入商城和升級(jí)模塊,商城模塊可以進(jìn)行道具的購(gòu)買(mǎi),升級(jí)模塊可以指定相應(yīng)的升級(jí)策略。每一次戰(zhàn)斗都需要建立不同的炮塔防線來(lái)阻止敵軍的進(jìn)攻??梢酝ㄟ^(guò)加速按鈕加速游戲的進(jìn)程,通過(guò)暫停按鈕暫停游戲進(jìn)程。每當(dāng)戰(zhàn)斗勝利,便會(huì)得到一定的游戲獎(jiǎng)勵(lì)。
Unity3D引擎具有諸多模塊,這里列舉了一些使用比較頻繁的功能模塊。
后來(lái),攝影家辦了展覽,她在圈中就小有名氣了。涂當(dāng)偶爾也給她拍幾張發(fā)在微博上,但一直是半紅不黑的,直到那天陳小北找到她。陳小北把她的照片放到了某知名網(wǎng)站上,并想方設(shè)法做成頭條新聞。一夜之間,她紅了,三炒兩炒,有一些名不見(jiàn)經(jīng)傳的牌子或網(wǎng)店找她代言。于是,街頭巷尾的婆婆媽媽也知道了,只除了她那個(gè)從不上網(wǎng)的爸爸葉之容。
碰撞器模塊:碰撞器是游戲開(kāi)發(fā)中至關(guān)重要的一個(gè)組件,它不斷檢測(cè)著物體之間的碰撞,并調(diào)用相應(yīng)的回調(diào)函數(shù)。開(kāi)發(fā)者可以在Unity腳本中重寫(xiě)這些回調(diào)函數(shù)來(lái)對(duì)碰撞做出相關(guān)的策略。碰撞的實(shí)質(zhì)其實(shí)是碰撞盒的碰撞。在Unity引擎中,為開(kāi)發(fā)者提供了多種碰撞器,常見(jiàn)的有盒型碰撞器(Box Collider)、球型碰撞器(Sphere Collider)、膠囊型碰撞器(Capsule Collider)和網(wǎng)格碰撞器(Mesh Collider)[3]。其中,前三者可以處理模型較為簡(jiǎn)單的物體,碰撞器能夠較好地包裹在模型的周?chē)纬膳鲎埠?,這樣檢測(cè)碰撞而消耗的性能也會(huì)較小;但是對(duì)于一些比較復(fù)雜的模型或者對(duì)碰撞盒的精確度有著較高的要求的情況下,就可以使用網(wǎng)格碰撞器。
Unity Shader:Unity 提供了許多內(nèi)置的 Shader,其中,Unity標(biāo)準(zhǔn)著色器(Standard Shader)集成了非常強(qiáng)大而全面的功能。我們可以通過(guò)設(shè)置十種常用的貼圖(反射率貼圖、法線貼圖等)來(lái)渲染模型;我們可以設(shè)置渲染模式為Opaque(不透明)、Cutout(鏤空)、Fade(隱現(xiàn))和Transparent(透明)來(lái)呈現(xiàn)不同的模型效果。另外,我們可以通過(guò)調(diào)節(jié)參數(shù)面板上的相關(guān)參數(shù)來(lái)改變模型的平滑度和金屬度。
動(dòng)畫(huà)系統(tǒng):Unity的動(dòng)畫(huà)系統(tǒng)由以下幾部分構(gòu)成:Avatar(骨骼模型)、Animation(動(dòng)畫(huà)片段)、Animator(動(dòng)畫(huà)組件)、Animator Controller(動(dòng)畫(huà)控制器)。圖2為一個(gè)人形的骨骼模型,圖3為該模型的骨骼節(jié)點(diǎn)映射情況,Unity可以通過(guò)Avatar檢視面板來(lái)調(diào)節(jié)骨骼模型的各個(gè)節(jié)點(diǎn)的映射。骨骼動(dòng)畫(huà)不會(huì)改變對(duì)象的位置、旋轉(zhuǎn)和縮放等內(nèi)容,但會(huì)在幀間對(duì)其內(nèi)部組成進(jìn)行移動(dòng)或變形[4]。
圖2 骨骼模型
圖3 骨骼映射
3D游戲開(kāi)發(fā)過(guò)程中,3D建模是必不可少的步驟。玩家首先會(huì)通過(guò)模型去觀察整個(gè)游戲世界,進(jìn)而去體驗(yàn)游戲的其他內(nèi)容。優(yōu)秀的游戲模型能夠帶來(lái)游戲畫(huà)面的直觀感受,增加游戲的吸引力。諸如3Ds MAX、Maya、Rhino等軟件都能實(shí)現(xiàn)快速建模。通過(guò)采集模型,利用3Ds MAX軟件進(jìn)行模型細(xì)節(jié)調(diào)整,能過(guò)完成游戲開(kāi)發(fā)的初期建模工作。
MVC(Model-View-Controller)框架主要運(yùn)用于軟件的分層開(kāi)發(fā),合理利用MVC框架能夠達(dá)到很好的解耦效果。MVC框架在軟件開(kāi)發(fā)中能夠?qū)浖目煽啃?、?guī)范性和可擴(kuò)展性起到極大的促進(jìn)作用[5]。在游戲開(kāi)發(fā)中,Model進(jìn)行游戲數(shù)據(jù)的讀出和寫(xiě)入,View層進(jìn)行UI視圖層的控制,Controller層進(jìn)行游戲核心邏輯的控制,并且對(duì)Model層和View層起到了一定調(diào)控作用。
如何平衡游戲畫(huà)質(zhì)和游戲性能兩個(gè)方面一直以來(lái)是本文研究的重點(diǎn)。本文總結(jié)了如下幾點(diǎn)優(yōu)化措施:
(1)使用對(duì)象池實(shí)現(xiàn)對(duì)象的預(yù)加載以及回收。游戲?qū)ο笤趧?chuàng)建過(guò)程中需要消耗大量的資源,導(dǎo)致設(shè)備卡頓。使用對(duì)象池能夠?qū)τ螒驅(qū)ο筮M(jìn)行重復(fù)利用,減少資源的消耗,提高游戲性能。
(2)在保證圖像質(zhì)量的前提下對(duì)圖像進(jìn)行壓縮,并減少冗余資源和重復(fù)資源。這樣做的好處是能夠減少安裝包的體積,降低內(nèi)存要求。
(3)使用靜態(tài)貼圖烘焙代替動(dòng)態(tài)燈光效果。動(dòng)態(tài)燈光效果所消耗的性能非常巨大,一般適用于動(dòng)態(tài)的物體。對(duì)于靜態(tài)游戲資源,采用靜態(tài)貼圖烘焙能夠有效減少渲染所消耗的性能。
(4)為常用的物體添加Tag或Layer,而不是每次都使用Find查找。在開(kāi)發(fā)中經(jīng)常涉及到游戲?qū)ο蟮牟檎?,遍歷查找所消耗的CPU資源是比較多的,通過(guò)添加Tag或Layer的方式查找能夠減小CPU的壓力。
圖4 導(dǎo)彈追蹤示意圖
如圖4所示,假設(shè)導(dǎo)彈的位置為(x1,y1,z1),目標(biāo)的位置為(x2,y2,z2),連接導(dǎo)彈和目標(biāo)的坐標(biāo),得到一條線段,線段和導(dǎo)彈初始發(fā)射方向所構(gòu)成的夾角a就是要旋轉(zhuǎn)的角度,即在導(dǎo)彈飛向目標(biāo)的過(guò)程中,角a不斷趨向于0。假設(shè)d為初始位置導(dǎo)彈和目標(biāo)的距離,s為飛行過(guò)程中某一時(shí)刻導(dǎo)彈和目標(biāo)的距離,a為線段和導(dǎo)彈初始發(fā)射方向所構(gòu)成的夾角,則某一時(shí)刻線段和導(dǎo)彈方向所構(gòu)成的夾角angle可以表示為s/d*a。因此,在導(dǎo)彈不斷飛行的過(guò)程中,角度逐漸的縮小,當(dāng)距離為0時(shí),導(dǎo)彈的正前方就是目標(biāo)。算法實(shí)現(xiàn)核心思想如下:
(1)獲取目標(biāo)的位置坐標(biāo);
(2)獲取導(dǎo)彈發(fā)射方向與目標(biāo)位置連線的夾角;
(3)計(jì)算本幀內(nèi)導(dǎo)彈移動(dòng)的距離以及需要偏移的角度,并對(duì)導(dǎo)彈角度進(jìn)行調(diào)整;
(4)循環(huán)步驟(3)直至導(dǎo)彈到達(dá)目標(biāo)位置。
圖5為關(guān)卡模塊實(shí)現(xiàn)的效果圖,通過(guò)選擇不同的關(guān)卡來(lái)進(jìn)行挑戰(zhàn),并解鎖后續(xù)的關(guān)卡。關(guān)卡上的星星表示當(dāng)前關(guān)卡的評(píng)級(jí)。在該界面可以點(diǎn)擊商店按鈕進(jìn)入商店,點(diǎn)擊建造按鈕進(jìn)入升級(jí)界面。圖6為道具商店界面,可以根據(jù)自身的金幣購(gòu)買(mǎi)所需的道具,增強(qiáng)戰(zhàn)斗力。
圖5 游戲關(guān)卡選擇界面
圖6 道具商店界面
圖7為游戲戰(zhàn)斗畫(huà)面,玩家可以通過(guò)建造不同的炮塔來(lái)防御敵人的入侵,殺死敵人能夠獲得金幣,金幣可用來(lái)建造升級(jí)炮塔。當(dāng)消滅所有的敵人時(shí),就獲得勝利,游戲勝利畫(huà)面如圖8所示。
圖7 游戲戰(zhàn)斗畫(huà)面
圖8 游戲勝利畫(huà)面
本文介紹了一個(gè)移動(dòng)塔防游戲的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程。本游戲使用3Ds MAX進(jìn)行游戲建模,使用碰撞系統(tǒng)來(lái)進(jìn)行碰撞檢測(cè),使用動(dòng)畫(huà)系統(tǒng)進(jìn)行動(dòng)畫(huà)控制,使用Unity Shader進(jìn)行渲染,使用MVC框架進(jìn)行更好地代碼維護(hù)。并且,運(yùn)用游戲優(yōu)化手段來(lái)平衡畫(huà)質(zhì)和性能,使用恰當(dāng)?shù)乃惴▉?lái)實(shí)現(xiàn)游戲邏輯。本文對(duì)塔防3D游戲設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行了詳盡的闡述,完成了3D休閑類(lèi)游戲的設(shè)計(jì)與開(kāi)發(fā)。