郭欣桐
摘? 要:該文講述了基于Unity的飛船大戰(zhàn)游戲的設(shè)計與開發(fā)過程,游戲以第三人稱視角控制主角躲避太空隕石進(jìn)行游戲?qū)?zhàn)。該系統(tǒng)以Unity為開發(fā)平臺,加載三大游戲場景,即游戲開始場景、游戲關(guān)卡場景以及游戲結(jié)束場景。使用C#編程語言實(shí)現(xiàn)主角以及隕石的移動、主角發(fā)射炮彈攻擊、主角與隕石碰撞以及炮彈傷害計算等游戲狀態(tài)控制以及游戲核心功能。該系統(tǒng)最終實(shí)現(xiàn)了整個游戲流程通過友好的人機(jī)交互界面以及相關(guān)操作,增強(qiáng)用戶的游戲樂趣,利用碎片化時間緩解壓力、休閑放松。
關(guān)鍵詞:游戲制作? Unity? C#? 飛機(jī)大戰(zhàn)
中圖分類號:TP311.5? ? ? ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A文章編號:1672-3791(2021)04(b)-0067-03
Design and Development of Ship War Game Bsed on Unity
GUO Xintong
(Heilongjiang college of business and technology, Harbin, Heilongjiang Province, 150025? China)
Abstract: This paper describes the design and development process of the spacecraft war game based on Unity. The game controls the protagonist to avoid the meteorite from the third person perspective for game to battle. The system takes Unity as the development platform, loading three major game scenes, the game start scene, the game level scene and the end of the game. The game state control and core functions of the game, such as the movement of the main character and meteorite, the attack of the main body launching shell, the collision between the protagonist and meteorite, and the shell damage calculation, are realized by using C # programming language. The system finally realizes the whole game flow through friendly human-computer interaction interface and related operations, enhance the user's game fun, and use fragmented time to relieve pressure and relax leisure.
Key Words: Game making; Unity; C#; Aircraft war
隨著電腦用戶的不斷增多,電腦游戲逐漸成為人們主要的休閑娛樂方式。根據(jù)現(xiàn)代人對電腦游戲的需求,設(shè)計開發(fā)一款游戲內(nèi)容輕度、簡單易操作的飛船大戰(zhàn)游戲。Unity3D作為目前主流的3D游戲開發(fā)引擎,集圖形、音頻、物理和網(wǎng)絡(luò)等多功能為一體,可編輯地形、搭建3D場景、通過其強(qiáng)大的物理引擎,模擬更加逼真的場景,增強(qiáng)游戲的真實(shí)性[1-2]。故該游戲采用Unity平臺,搭建3D場景,選用Unity編程語言C#實(shí)現(xiàn)游戲基本流程以及核心功能。游戲類型定位為PUZ,即益智類游戲,采用第三人稱視角,游戲規(guī)則簡單,操作易上手,受眾面較廣。通過友好的人機(jī)交互界面以及玩家自身的游戲操作,達(dá)到增強(qiáng)用戶游戲樂趣,利用碎片化時間緩解壓力、休閑放松的目的[3]。
1? 游戲設(shè)計開發(fā)準(zhǔn)備
1.1 開發(fā)工具以及編程語言
Unity3D是一款功能強(qiáng)大,一次性多平臺開發(fā)的交互式游戲引擎。Unity3D采用簡潔的圖形化界面。其內(nèi)置的Nvidia公司的PhysX物理引擎可模擬剛體碰撞、粒子模擬、重力等物理效果,使對象物體具備質(zhì)量、摩擦力等物理屬性[4]。Unity3D支持一次性多平臺且跨平臺對決,2018年該引擎已經(jīng)擴(kuò)展到支持超過25個平臺[5]。
Unity3D支持C#和JavaScript兩種腳本語言編寫unity項目程序,U3D官方團(tuán)隊基于數(shù)據(jù)分析得出結(jié)論:目前,80.4%的Unity項目程序使用C#語言編寫,U3D文檔、示例等相關(guān)的支持重點(diǎn)在C#語言。故該游戲項目采用Unity平臺,C#語言開發(fā)。
1.2 游戲規(guī)則
該游戲共有兩個游戲角色:太空飛船以及太空隕石。其中太空隕石為隨機(jī)生成,游戲玩家不可控制,在游戲過程中,太空隕石生成后會自動尋找太空飛船,進(jìn)行攻擊,隕石會隨著游戲的進(jìn)度不斷變多,攻擊速度變快。游戲玩家可通過鍵盤上的方向鍵,操作飛船在上、下、左、右這4個方向進(jìn)行移動,躲避太空隕石,也可發(fā)射炮彈消滅隕石保護(hù)自己,游戲剛開始玩家沒有炮彈,需按下鍵盤上的空格鍵方可觸發(fā)發(fā)射炮彈。若太空隕石碰撞至飛船,飛船護(hù)甲防御值降低10點(diǎn),當(dāng)護(hù)甲值為0時,飛船爆破,即游戲失敗。游戲采用回合制,10 min一回合,若在此期間,飛船護(hù)甲值一直大于0,則游戲勝利。
1.3 游戲素材設(shè)計
游戲的素材設(shè)計主要指的是游戲場景對象UI設(shè)計以及音頻。游戲場景對象包括游戲進(jìn)入界面按鈕和背景、游戲結(jié)束界面按鈕和背景。設(shè)計結(jié)合“太空”主題,使用Photoshop圖像編輯軟件進(jìn)行編輯處理,主要用到的功能工具有:“鋼筆”工具勾勒輪廓,“文字”工具繪制按鈕顯示文字,“斜面和浮雕”結(jié)合“高光和陰影”“線性漸變”,創(chuàng)建出立體感、滿足太空主題深邃的視覺感。所有UI設(shè)計素材導(dǎo)出格式為png格式,背景透明。
需要編輯的游戲音頻包括游戲背景音樂、點(diǎn)擊按鈕音效、游戲勝利、飛船發(fā)射子彈、子彈擊中隕石、隕石擊中飛船、護(hù)甲值降低、游戲失敗。搜索相關(guān)音頻資源后,使用會聲會影編輯工具對音頻資源進(jìn)行剪輯,刪除多余的音頻部分,保留合適的時間長短音頻。所有音頻導(dǎo)出格式為mp3,保證音頻質(zhì)量。
2? 游戲功能開發(fā)
2.1 游戲場景搭建
游戲的場景搭建主要包括游戲基本素材添加、UI界面。場景UI界面使用Unity的GUI工具進(jìn)行創(chuàng)建[6]。
游戲開始場景所需的按鈕為“開始游戲”按鈕、“退出游戲”按鈕,玩家通過點(diǎn)擊“開始游戲”按鈕進(jìn)入游戲關(guān)卡,開啟游戲過程,點(diǎn)擊“退出游戲”按鈕時直接關(guān)閉游戲應(yīng)用程序。當(dāng)“開始游戲”按鈕被觸發(fā)時,即鼠標(biāo)點(diǎn)擊該按鈕時,程序執(zhí)行unity內(nèi)置OnMouseEnter函數(shù),在該函數(shù)中添加unity內(nèi)置Application.LoadLevel函數(shù)用于加載游戲關(guān)卡場景,但游戲關(guān)卡場景需添加至File菜單Build Settings的關(guān)卡列表中,使用索引數(shù)加載關(guān)卡。
游戲關(guān)卡為該游戲的重要場景,整個游戲核心功能都依托于此游戲場景。該場景涉及的游戲基本素材為玩家飛船、太空隕石、游戲背景、燈光、飛船子彈。將玩家飛船、太空隕石、游戲背景直接導(dǎo)入并拖拽至編輯環(huán)境并調(diào)整玩家飛船的旋轉(zhuǎn)角度,使其正常顯示在unity相機(jī)的區(qū)域中。為了模擬真實(shí)飛船的情況,增強(qiáng)用戶體驗度,在飛船尾部使用Unity預(yù)制件添加火焰噴射效果。但此時飛船紋理特性并不明顯,亮度過暗,需添加燈光,增強(qiáng)飛船亮度,突出飛船紋理。Unity共提供4種燈光效果:Directional(方向光源)、Point(點(diǎn)光源)、Spot(聚光燈)、Area(區(qū)域光)。4種燈光效果具有不同特性及應(yīng)用場景。由于飛船對象在游戲過程中需要移動,位置不固定,故需要采用Directional(方向光源),方向光源由于沒有真正的光源坐標(biāo),放置在場景任何地點(diǎn)都不會影響光的效果,只有旋轉(zhuǎn)會影響定向光的照射結(jié)果,因此即使飛船改變位置,離方向光源較遠(yuǎn),都不會影響表面投影光照效果。新建object,創(chuàng)建長方形作為子彈,將子彈圖片拖拽至長方形材質(zhì)球處,將Shader處設(shè)置為additive用以去除子彈的背景黑框。隕石的添加方式與子彈類似,在Unity中新建gameObject,將隕石拖拽至該gameObject處。
游戲結(jié)束場景所需的按鈕為“重新開始”按鈕、“退出游戲”按鈕。玩家通過點(diǎn)擊“重新開始”按鈕可重新進(jìn)入游戲,點(diǎn)擊“退出游戲按鈕”可直接關(guān)閉游戲。兩個按鈕的實(shí)現(xiàn)過程與開始場景按鈕一致。
2.2 游戲基本功能
2.2.1 飛船控制
飛船控制主要包括飛船移動以及發(fā)射子彈。在游戲過程中,玩家可通過鍵盤上的4個方向鍵實(shí)現(xiàn)飛船在水平和垂直方向的運(yùn)動。在Unity內(nèi)置函數(shù)fixedUpdate中,通過Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")獲取玩家具體按下哪一個方向鍵,確定飛船的移動方向。將上述兩個函數(shù)返回值作為三維向量的x、z軸數(shù)值,與飛船移動速度進(jìn)行相乘,計算移動距離,更新向量速度。未避免飛船移出屏幕區(qū)域,需對飛船移動范圍進(jìn)行限制,使用Mathf.Clamp函數(shù)控制飛船位置。
飛船在移動的過程中可隨時發(fā)射子彈,故子彈發(fā)射點(diǎn)要隨著飛機(jī)位置的改變同時改變。在unity資源列表飛船游戲?qū)ο笾刑砑涌盏膐bject,作為子物體用于記錄子彈發(fā)射位置,由于子彈運(yùn)動方向為飛船的前進(jìn)方向,故使用transform.forward與子彈移動速度相乘,控制子彈發(fā)射。子彈應(yīng)具有一定的生命周期,即當(dāng)子彈飛出有效區(qū)域后自行銷毀以減少不必要的內(nèi)存開銷。為游戲區(qū)域添加觸發(fā)器,當(dāng)子彈飛出有效區(qū)域時,觸發(fā)事件調(diào)用Destroy函數(shù)銷毀子彈。
2.2.2 隕石控制
隕石控制主要包括隕石的隨機(jī)生成以及移動。在游戲過程中,隕石隨機(jī)生成,且按照隨機(jī)的角度旋轉(zhuǎn)。
隕石已在場景搭建時添加至場景中,為了讓隕石更加逼真,添加旋轉(zhuǎn)效果。旋轉(zhuǎn)效果通過使用Random.insideUnitSphere得到隨機(jī)的二維向量,為了讓旋轉(zhuǎn)效果更佳明顯,將該二維向量乘以5作為隕石的旋轉(zhuǎn)角度。
設(shè)置隕石為預(yù)制件,為增強(qiáng)游戲的趣味性,隕石成波(6個為一波)出現(xiàn),設(shè)置兩波隕石的時間間隔,在規(guī)定的時間間隔內(nèi)程序使用Instantiate函數(shù)隨機(jī)生成預(yù)制件隕石,但為了防止同一撥隕石距離較近,導(dǎo)致隕石之間相互碰撞銷毀,使用協(xié)程類函數(shù)WaitForSeconds,確保每個隕石對象生成的時間間隔。
隕石的運(yùn)動與子彈的運(yùn)動實(shí)現(xiàn)過程類似,只是運(yùn)動方向相反,將運(yùn)動速度設(shè)置為負(fù)值即可。
2.2.3 游戲?qū)ο笈鲎?/p>
各個游戲?qū)ο笾g執(zhí)行不同的碰撞規(guī)則。當(dāng)子彈與隕石相互碰撞時,隕石爆炸消失。當(dāng)飛船與隕石相互碰撞時,飛船護(hù)甲值降低。且以上對象進(jìn)行碰撞時,不能穿透對方。因此,需將子彈、隕石、飛船添加碰撞體組件,設(shè)置碰撞檢測。飛船因其形狀不規(guī)則,故添加Mesh Collider網(wǎng)格碰撞體,并勾選Convex和Is Trigger選項框,將Mesh Collider設(shè)置為觸發(fā)器。為避免飛船受重力影響,向下掉落,添加rigidbody剛體,使飛船自身重力失效。子彈以及隕石形狀較規(guī)則,因此添加Capsule Collider膠囊碰撞體,勾選Is Trigger設(shè)為觸發(fā)器,根據(jù)子彈和隕石的大小設(shè)置膠囊碰撞體的半徑與高度,使子彈和隕石包裹在碰撞體之間即可。方向為Z-Axis。
所有的游戲?qū)ο蠖纪ㄟ^OnTriggerEnter函數(shù)實(shí)現(xiàn)物體碰撞消息傳遞。在該函數(shù)中,使用if函數(shù)判斷碰撞物體的“Tag”標(biāo)簽,判斷碰撞物是子彈、隕石、飛船具體哪一個。根據(jù)碰撞物物體進(jìn)行積分計算、護(hù)甲計算。
2.2.4 積分、護(hù)甲顯示
積分與護(hù)甲的顯示通過unity中的Text組件實(shí)現(xiàn)。添加Text組件后,調(diào)整組件位置至屏幕左上角,方便玩家直觀查看積分以及護(hù)甲值。使用if語句判斷,當(dāng)飛船發(fā)射子彈擊中隕石后,積分增加,分值增加后更新Unity中的Text組件顯示。當(dāng)隕石擊中飛船時,護(hù)甲值較少,分值較少后更新Unity中的Text組件顯示,當(dāng)護(hù)甲值為0時,游戲結(jié)束。
3? 結(jié)語
該文通過Unity實(shí)現(xiàn)了飛船大戰(zhàn)游戲的設(shè)計與開發(fā)。該游戲主要的游戲角色為飛船與隕石,玩家可操作飛船進(jìn)行移動、攻擊,隨機(jī)生成移動的隕石。在游戲過程中,玩家可通過游戲程序內(nèi)部游戲?qū)ο笈鲎蚕⒌膫鬟f,在屏幕左上角查看更新的積分、護(hù)甲值。經(jīng)測試,游戲可在PC端流暢運(yùn)行,游戲各項功能正常。該游戲操作簡單,適合各個年齡階段人群。
參考文獻(xiàn)
[1] 尹大偉,張熙若,李歡歡,等.基于Unity3D的虛擬校園漫游系統(tǒng)及其關(guān)鍵技術(shù)研究[J].軟件工程,2019,
22(9):17-19.
[2] 朱晴.Unity3D開發(fā)工具在3D游戲開發(fā)中的應(yīng)用[J].電子技術(shù)與軟件工程,2019(22):58-59.
[3] 劉碩,王海森,李其偉,等.基于Funcode平臺的兒童益智類游戲設(shè)計與開發(fā)[J].軟件,2020,41(8):52-55.
[4] 吳可玉,莊建軍,徐琳玲.基于Unity3D的虛擬消防與安全教育系統(tǒng)[J].實(shí)驗技術(shù)與管理,2020,37(12):
237-240.
[5] 周雪薇.基于Unity3D的小學(xué)科學(xué)教育游戲的設(shè)計與開發(fā)[J].微型電腦應(yīng)用,2021,37(1):44-46,51.
[6] 周正.基于Unity3D的冒險闖關(guān)類游戲的設(shè)計與實(shí)現(xiàn)[J].電腦知識與技術(shù),2020,16(21):90-91.