郭欣桐
摘? 要:該文講述了基于Unity的飛船大戰游戲的設計與開發過程,游戲以第三人稱視角控制主角躲避太空隕石進行游戲對戰。該系統以Unity為開發平臺,加載三大游戲場景,即游戲開始場景、游戲關卡場景以及游戲結束場景。使用C#編程語言實現主角以及隕石的移動、主角發射炮彈攻擊、主角與隕石碰撞以及炮彈傷害計算等游戲狀態控制以及游戲核心功能。該系統最終實現了整個游戲流程通過友好的人機交互界面以及相關操作,增強用戶的游戲樂趣,利用碎片化時間緩解壓力、休閑放松。
關鍵詞:游戲制作? Unity? C#? 飛機大戰
中圖分類號:TP311.5? ? ? ? ? ? ? ? ? ? ? 文獻標識碼: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
隨著電腦用戶的不斷增多,電腦游戲逐漸成為人們主要的休閑娛樂方式。根據現代人對電腦游戲的需求,設計開發一款游戲內容輕度、簡單易操作的飛船大戰游戲。Unity3D作為目前主流的3D游戲開發引擎,集圖形、音頻、物理和網絡等多功能為一體,可編輯地形、搭建3D場景、通過其強大的物理引擎,模擬更加逼真的場景,增強游戲的真實性[1-2]。故該游戲采用Unity平臺,搭建3D場景,選用Unity編程語言C#實現游戲基本流程以及核心功能。游戲類型定位為PUZ,即益智類游戲,采用第三人稱視角,游戲規則簡單,操作易上手,受眾面較廣。通過友好的人機交互界面以及玩家自身的游戲操作,達到增強用戶游戲樂趣,利用碎片化時間緩解壓力、休閑放松的目的[3]。
1? 游戲設計開發準備
1.1 開發工具以及編程語言
Unity3D是一款功能強大,一次性多平臺開發的交互式游戲引擎。Unity3D采用簡潔的圖形化界面。其內置的Nvidia公司的PhysX物理引擎可模擬剛體碰撞、粒子模擬、重力等物理效果,使對象物體具備質量、摩擦力等物理屬性[4]。Unity3D支持一次性多平臺且跨平臺對決,2018年該引擎已經擴展到支持超過25個平臺[5]。
Unity3D支持C#和JavaScript兩種腳本語言編寫unity項目程序,U3D官方團隊基于數據分析得出結論:目前,80.4%的Unity項目程序使用C#語言編寫,U3D文檔、示例等相關的支持重點在C#語言。故該游戲項目采用Unity平臺,C#語言開發。
1.2 游戲規則
該游戲共有兩個游戲角色:太空飛船以及太空隕石。其中太空隕石為隨機生成,游戲玩家不可控制,在游戲過程中,太空隕石生成后會自動尋找太空飛船,進行攻擊,隕石會隨著游戲的進度不斷變多,攻擊速度變快。游戲玩家可通過鍵盤上的方向鍵,操作飛船在上、下、左、右這4個方向進行移動,躲避太空隕石,也可發射炮彈消滅隕石保護自己,游戲剛開始玩家沒有炮彈,需按下鍵盤上的空格鍵方可觸發發射炮彈。若太空隕石碰撞至飛船,飛船護甲防御值降低10點,當護甲值為0時,飛船爆破,即游戲失敗。游戲采用回合制,10 min一回合,若在此期間,飛船護甲值一直大于0,則游戲勝利。
1.3 游戲素材設計
游戲的素材設計主要指的是游戲場景對象UI設計以及音頻。游戲場景對象包括游戲進入界面按鈕和背景、游戲結束界面按鈕和背景。設計結合“太空”主題,使用Photoshop圖像編輯軟件進行編輯處理,主要用到的功能工具有:“鋼筆”工具勾勒輪廓,“文字”工具繪制按鈕顯示文字,“斜面和浮雕”結合“高光和陰影”“線性漸變”,創建出立體感、滿足太空主題深邃的視覺感。所有UI設計素材導出格式為png格式,背景透明。
需要編輯的游戲音頻包括游戲背景音樂、點擊按鈕音效、游戲勝利、飛船發射子彈、子彈擊中隕石、隕石擊中飛船、護甲值降低、游戲失敗。搜索相關音頻資源后,使用會聲會影編輯工具對音頻資源進行剪輯,刪除多余的音頻部分,保留合適的時間長短音頻。所有音頻導出格式為mp3,保證音頻質量。
2? 游戲功能開發
2.1 游戲場景搭建
游戲的場景搭建主要包括游戲基本素材添加、UI界面。場景UI界面使用Unity的GUI工具進行創建[6]。
游戲開始場景所需的按鈕為“開始游戲”按鈕、“退出游戲”按鈕,玩家通過點擊“開始游戲”按鈕進入游戲關卡,開啟游戲過程,點擊“退出游戲”按鈕時直接關閉游戲應用程序。當“開始游戲”按鈕被觸發時,即鼠標點擊該按鈕時,程序執行unity內置OnMouseEnter函數,在該函數中添加unity內置Application.LoadLevel函數用于加載游戲關卡場景,但游戲關卡場景需添加至File菜單Build Settings的關卡列表中,使用索引數加載關卡。
游戲關卡為該游戲的重要場景,整個游戲核心功能都依托于此游戲場景。該場景涉及的游戲基本素材為玩家飛船、太空隕石、游戲背景、燈光、飛船子彈。將玩家飛船、太空隕石、游戲背景直接導入并拖拽至編輯環境并調整玩家飛船的旋轉角度,使其正常顯示在unity相機的區域中。為了模擬真實飛船的情況,增強用戶體驗度,在飛船尾部使用Unity預制件添加火焰噴射效果。但此時飛船紋理特性并不明顯,亮度過暗,需添加燈光,增強飛船亮度,突出飛船紋理。Unity共提供4種燈光效果:Directional(方向光源)、Point(點光源)、Spot(聚光燈)、Area(區域光)。4種燈光效果具有不同特性及應用場景。由于飛船對象在游戲過程中需要移動,位置不固定,故需要采用Directional(方向光源),方向光源由于沒有真正的光源坐標,放置在場景任何地點都不會影響光的效果,只有旋轉會影響定向光的照射結果,因此即使飛船改變位置,離方向光源較遠,都不會影響表面投影光照效果。新建object,創建長方形作為子彈,將子彈圖片拖拽至長方形材質球處,將Shader處設置為additive用以去除子彈的背景黑框。隕石的添加方式與子彈類似,在Unity中新建gameObject,將隕石拖拽至該gameObject處。
游戲結束場景所需的按鈕為“重新開始”按鈕、“退出游戲”按鈕。玩家通過點擊“重新開始”按鈕可重新進入游戲,點擊“退出游戲按鈕”可直接關閉游戲。兩個按鈕的實現過程與開始場景按鈕一致。
2.2 游戲基本功能
2.2.1 飛船控制
飛船控制主要包括飛船移動以及發射子彈。在游戲過程中,玩家可通過鍵盤上的4個方向鍵實現飛船在水平和垂直方向的運動。在Unity內置函數fixedUpdate中,通過Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")獲取玩家具體按下哪一個方向鍵,確定飛船的移動方向。將上述兩個函數返回值作為三維向量的x、z軸數值,與飛船移動速度進行相乘,計算移動距離,更新向量速度。未避免飛船移出屏幕區域,需對飛船移動范圍進行限制,使用Mathf.Clamp函數控制飛船位置。
飛船在移動的過程中可隨時發射子彈,故子彈發射點要隨著飛機位置的改變同時改變。在unity資源列表飛船游戲對象中添加空的object,作為子物體用于記錄子彈發射位置,由于子彈運動方向為飛船的前進方向,故使用transform.forward與子彈移動速度相乘,控制子彈發射。子彈應具有一定的生命周期,即當子彈飛出有效區域后自行銷毀以減少不必要的內存開銷。為游戲區域添加觸發器,當子彈飛出有效區域時,觸發事件調用Destroy函數銷毀子彈。
2.2.2 隕石控制
隕石控制主要包括隕石的隨機生成以及移動。在游戲過程中,隕石隨機生成,且按照隨機的角度旋轉。
隕石已在場景搭建時添加至場景中,為了讓隕石更加逼真,添加旋轉效果。旋轉效果通過使用Random.insideUnitSphere得到隨機的二維向量,為了讓旋轉效果更佳明顯,將該二維向量乘以5作為隕石的旋轉角度。
設置隕石為預制件,為增強游戲的趣味性,隕石成波(6個為一波)出現,設置兩波隕石的時間間隔,在規定的時間間隔內程序使用Instantiate函數隨機生成預制件隕石,但為了防止同一撥隕石距離較近,導致隕石之間相互碰撞銷毀,使用協程類函數WaitForSeconds,確保每個隕石對象生成的時間間隔。
隕石的運動與子彈的運動實現過程類似,只是運動方向相反,將運動速度設置為負值即可。
2.2.3 游戲對象碰撞
各個游戲對象之間執行不同的碰撞規則。當子彈與隕石相互碰撞時,隕石爆炸消失。當飛船與隕石相互碰撞時,飛船護甲值降低。且以上對象進行碰撞時,不能穿透對方。因此,需將子彈、隕石、飛船添加碰撞體組件,設置碰撞檢測。飛船因其形狀不規則,故添加Mesh Collider網格碰撞體,并勾選Convex和Is Trigger選項框,將Mesh Collider設置為觸發器。為避免飛船受重力影響,向下掉落,添加rigidbody剛體,使飛船自身重力失效。子彈以及隕石形狀較規則,因此添加Capsule Collider膠囊碰撞體,勾選Is Trigger設為觸發器,根據子彈和隕石的大小設置膠囊碰撞體的半徑與高度,使子彈和隕石包裹在碰撞體之間即可。方向為Z-Axis。
所有的游戲對象都通過OnTriggerEnter函數實現物體碰撞消息傳遞。在該函數中,使用if函數判斷碰撞物體的“Tag”標簽,判斷碰撞物是子彈、隕石、飛船具體哪一個。根據碰撞物物體進行積分計算、護甲計算。
2.2.4 積分、護甲顯示
積分與護甲的顯示通過unity中的Text組件實現。添加Text組件后,調整組件位置至屏幕左上角,方便玩家直觀查看積分以及護甲值。使用if語句判斷,當飛船發射子彈擊中隕石后,積分增加,分值增加后更新Unity中的Text組件顯示。當隕石擊中飛船時,護甲值較少,分值較少后更新Unity中的Text組件顯示,當護甲值為0時,游戲結束。
3? 結語
該文通過Unity實現了飛船大戰游戲的設計與開發。該游戲主要的游戲角色為飛船與隕石,玩家可操作飛船進行移動、攻擊,隨機生成移動的隕石。在游戲過程中,玩家可通過游戲程序內部游戲對象碰撞消息的傳遞,在屏幕左上角查看更新的積分、護甲值。經測試,游戲可在PC端流暢運行,游戲各項功能正常。該游戲操作簡單,適合各個年齡階段人群。
參考文獻
[1] 尹大偉,張熙若,李歡歡,等.基于Unity3D的虛擬校園漫游系統及其關鍵技術研究[J].軟件工程,2019,
22(9):17-19.
[2] 朱晴.Unity3D開發工具在3D游戲開發中的應用[J].電子技術與軟件工程,2019(22):58-59.
[3] 劉碩,王海森,李其偉,等.基于Funcode平臺的兒童益智類游戲設計與開發[J].軟件,2020,41(8):52-55.
[4] 吳可玉,莊建軍,徐琳玲.基于Unity3D的虛擬消防與安全教育系統[J].實驗技術與管理,2020,37(12):
237-240.
[5] 周雪薇.基于Unity3D的小學科學教育游戲的設計與開發[J].微型電腦應用,2021,37(1):44-46,51.
[6] 周正.基于Unity3D的冒險闖關類游戲的設計與實現[J].電腦知識與技術,2020,16(21):90-91.