章國雁
(安徽工商職業(yè)學(xué)院 信息工程學(xué)院,安徽 合肥 231131)
隨著網(wǎng)絡(luò)的發(fā)展、計(jì)算機(jī)硬件性能的提升以及智能化系統(tǒng)的不斷完善,游戲產(chǎn)業(yè)的發(fā)展也日臻成熟,目前無論是網(wǎng)游還是手游都處在了發(fā)展的黃金時(shí)期,而射擊類游戲在游戲市場(chǎng)有著濃墨重彩的一筆。射擊類游戲具有競(jìng)技性強(qiáng)的特點(diǎn),但也兼顧了公平性,以知名游戲《絕地求生》為例,所有玩家在一張地圖上競(jìng)技,需要玩家自己收集槍械和補(bǔ)給品,玩家可以單人或者組隊(duì)進(jìn)行戰(zhàn)斗,保持了公平性的同時(shí)也加強(qiáng)了游戲的趣味性。游戲行業(yè)的發(fā)展帶動(dòng)了游戲開發(fā)技術(shù)的進(jìn)步,為了提高開發(fā)效率,業(yè)內(nèi)普遍采用各類型游戲引擎進(jìn)行開發(fā),其中主要以Unity3D引擎和Unreal虛幻引擎為主。Unity3D 引擎具有較好的跨平臺(tái)特性,開發(fā)完成后可以輕松部署到十幾種平臺(tái)上,對(duì)硬件性能要求低,因而在國內(nèi)擁有大量的開發(fā)者;Unreal虛幻引擎具有較好的畫面效果,但對(duì)硬件要求較高,普遍用于次世代游戲開發(fā),但隨著近些年硬件性能的提高,Unreal 引擎應(yīng)用越來越廣。
眾多學(xué)者對(duì)使用游戲引擎進(jìn)行游戲開發(fā)進(jìn)行了大量的研究,2018 年張策在文中講解了使用Unity3D 引擎開發(fā)的一款以戰(zhàn)車為主體的射擊類游戲開發(fā)研究與實(shí)現(xiàn);2019 年蔡國宇等人在文中講解基于Unity3D 引擎人工智能系統(tǒng)制作的一款第三人稱射擊類游戲;謝宏蘭在文中講解了使用Unity3D 引擎NetWork 組件開發(fā)的射擊類游戲,實(shí)現(xiàn)了局域網(wǎng)的多人對(duì)戰(zhàn)游戲,增強(qiáng)了游戲的視聽效果和樂趣性;2020 年黃岡對(duì)基于Unreal 虛幻引擎的FPS 第一人稱射擊游戲開發(fā)與設(shè)計(jì)進(jìn)行了研究;陳麗梅等人在文中講解了基于Unreal 虛幻引擎結(jié)合KBE 服務(wù)端引擎,使用C++語言與藍(lán)圖腳本做客戶端開發(fā),實(shí)現(xiàn)具有聯(lián)網(wǎng)功能的第三人稱射擊動(dòng)作類游戲。以上研究對(duì)于使用游戲引擎進(jìn)行游戲開發(fā)提供了很好的幫助。
本文以Unity3D 引擎官方案例“惡魔射手”為參照講解其制作過程,案例資源使用Unity官方提供的免費(fèi)資源,游戲人物主角和怪物模型為卡通風(fēng)格,游戲場(chǎng)景設(shè)置在一間夢(mèng)幻風(fēng)格的場(chǎng)所中,擺設(shè)有一間屋子、放大的抽屜、椅子、鬧鐘、玩具汽車以及一些兒童玩具等物件,游戲主角為一個(gè)小男孩拿著一把槍,可以做出射擊、奔跑、受到傷害、死亡等動(dòng)畫,游戲設(shè)置了3 個(gè)不同類型的怪物,每個(gè)怪物含有生命值、攻擊力等屬性,可以做出發(fā)動(dòng)攻擊、受到傷害、死亡等動(dòng)畫效果。
本案例采用Unity3D 游戲引擎和Visual Stu?dio 為開發(fā)平臺(tái),使用C#為開發(fā)語言,游戲主要功能包含以下方面:游戲資源的導(dǎo)入和場(chǎng)景搭建、游戲主角的設(shè)置、主角移動(dòng)功能、生命值、受到傷害及死亡功能、主角射擊功能、攝像機(jī)的跟隨、動(dòng)畫狀態(tài)機(jī)設(shè)置和播放、游戲怪物的設(shè)置、怪物AI、怪物生命值、受到傷害及死亡功能、背景音樂和音效、游戲界面UI制作等功能。
導(dǎo)入下載的官方免費(fèi)資源包SurvivalShooter,包含了游戲物體模型文件夾Models、音效文件夾Audio、圖片資源文件夾Textures、預(yù)制體文件夾Prefabs 等。在預(yù)制體文件夾Prefabs 中的拖動(dòng)En?vironment 環(huán)境預(yù)制體到Scene 窗口中,進(jìn)行游戲場(chǎng)景的搭建。
拖動(dòng)Models 模型文件夾中的Player 模型到Hierarchy 窗口中,給模型添加Rigidbody 剛體組件和CapsuleCollider 膠囊體組件,剛體組件鎖定Freeze Position Y 軸和Freeze Rotation X、Z 軸值,防止主角在Y 軸上產(chǎn)生位移,X 軸和Z 軸產(chǎn)生旋轉(zhuǎn)。
在FixedUpdate()函數(shù)中,根據(jù)玩家在A、D 按鍵和W、S 按鍵的操作,通過輸入管理器Input.Ge?tAxisRaw()函數(shù)獲取水平軸Horizontal 和垂直軸Vertical 的值,調(diào)用游戲主角剛體組件的MovePo?sition()函數(shù)實(shí)現(xiàn)移動(dòng)功能,其核心代碼如下所示:
當(dāng)玩家按下鼠標(biāo)左鍵時(shí),游戲主角發(fā)動(dòng)攻擊,實(shí)現(xiàn)思路為:在槍頭的位置向前發(fā)射一條射線,判斷射線與物體是否進(jìn)行碰撞,如果碰撞的物體為怪物,則怪物受到攻擊,減少怪物的生命值,如果碰撞的是其他沒有生命值的物體,則不做處理,其核心代碼如下所示:
當(dāng)游戲主角進(jìn)行移動(dòng)時(shí),為了方便玩家進(jìn)行游戲控制,攝像機(jī)需要保持跟隨狀態(tài)。攝像機(jī)實(shí)時(shí)跟隨主角移動(dòng),鏡頭畫面容易產(chǎn)生過度的晃動(dòng),造成玩家視覺上眩暈的問題,為了避免這一情況,我們通過使用插值函數(shù)來保障攝像機(jī)的平穩(wěn)位移,其核心代碼如下:
當(dāng)游戲物體進(jìn)行移動(dòng)、攻擊、受到傷害、死亡等動(dòng)作時(shí),需要同時(shí)播放相應(yīng)的動(dòng)畫效果,我們使用Unity3D引擎中的Mecanim 動(dòng)畫系統(tǒng)進(jìn)行制作,以游戲主角Player 為例,我們進(jìn)行動(dòng)畫狀態(tài)機(jī)的設(shè)置,其詳細(xì)步驟如下:(1)在Project 窗口中創(chuàng)建動(dòng)畫狀態(tài)機(jī)控制器PlayerAnimatorController;(2)在Animator 窗口中,創(chuàng)建游戲主角Player 物體的空閑狀態(tài)機(jī)Idle、移動(dòng)狀態(tài)機(jī)Move 和死亡狀態(tài)機(jī)Death;(3)創(chuàng)建狀態(tài)機(jī)的轉(zhuǎn)移條件參數(shù)Iswalking(是否移動(dòng))和Die(是否死亡),類型均為布爾值Bool;(4)連接狀態(tài)機(jī)之間的條件轉(zhuǎn)移,其轉(zhuǎn)移條件為:當(dāng)Iswalking 為真True 時(shí),Idle->Move 轉(zhuǎn)移;當(dāng)Iswalking 為假False 時(shí),Move->Idle 轉(zhuǎn)移;當(dāng)Die為真時(shí),Any State->Death 轉(zhuǎn)移。狀態(tài)機(jī)創(chuàng)建完成后,如圖1所示。
圖1 創(chuàng)建動(dòng)畫狀態(tài)機(jī)
怪物物體需要添加剛體、膠囊體碰撞器、球形觸發(fā)器、NavMeshAgent 導(dǎo)航網(wǎng)格、聲音來源等組件,剛體組件用于實(shí)現(xiàn)怪物的移動(dòng)功能,膠囊體碰撞器避免物體之間相互穿插,觸發(fā)器檢測(cè)玩家是否進(jìn)入攻擊范圍,NavMeshAgent 導(dǎo)航網(wǎng)格用于怪物自動(dòng)尋路,讓它具有一定的AI 功能,聲音來源組件用于播放怪物相關(guān)的音效。
游戲的功能開發(fā)完成后,還需要對(duì)游戲進(jìn)行發(fā)布和測(cè)試,根據(jù)測(cè)試結(jié)果進(jìn)行進(jìn)一步的優(yōu)化。我們對(duì)所制作的游戲進(jìn)行發(fā)布到PC平臺(tái)上,運(yùn)行后游戲畫面效果如圖2所示。
圖2 游戲畫面
本案例講解了Unity 官方第三人稱射擊類案例的制作過程,包含了主角攻擊和怪物攻擊、怪物AI 等核心功能,但目前為單機(jī)版本,游戲的趣味性有限,后期可以此為基礎(chǔ)進(jìn)一步擴(kuò)展功能,添加游戲服務(wù)端,制作多人在線聯(lián)網(wǎng)版本。本文針對(duì)第三人稱射擊類案例的制作解析,對(duì)于游戲開發(fā)研究具有較好地實(shí)用性。