劉雨嘉 楊鍵 馮夢(mèng)雨 四川大學(xué)錦城學(xué)院 計(jì)算機(jī)與軟件學(xué)院
近年來,隨著計(jì)算機(jī)圖形學(xué)、多媒體信息技術(shù)和計(jì)算機(jī)軟硬件的快速發(fā)展,虛擬現(xiàn)實(shí)技術(shù)逐漸在軍事、教育、游戲、建筑、醫(yī)療、工業(yè)設(shè)計(jì)等多個(gè)領(lǐng)域廣泛應(yīng)用,越來越多的人們?cè)敢鈳蟅R設(shè)備來體驗(yàn)虛擬現(xiàn)實(shí)帶來的全新體驗(yàn)。本文介紹了利用unity3d游戲引擎開發(fā)的一款休閑射擊類游戲。
此款射擊游戲的玩法規(guī)則是羊群從地圖的一端向著地圖的另一端的羊圈慢慢運(yùn)動(dòng),期間會(huì)有狼從山中跑出來攻擊羊群,牧羊人(第一視角)則會(huì)對(duì)攻擊羊群的狼進(jìn)行設(shè)計(jì),一次射擊未將狼擊倒,狼則會(huì)轉(zhuǎn)向攻擊牧羊人,牧羊人可通過瞬移進(jìn)行躲避。羊群在進(jìn)入羊圈之
前被狼全部吃掉或牧羊人被狼擊中或者游戲倒計(jì)時(shí)為零則游戲結(jié)束。要達(dá)到以上內(nèi)容,需從這幾方面著手:1.地形;2.羊群;3.狼群;4.第一游戲視角(牧羊人)。下面分別介紹:
地形:游戲設(shè)計(jì)要控制狼從出生點(diǎn)開始,狼群會(huì)向著羊群的方向運(yùn)動(dòng),這就要求狼群在尋路的過程中需要改變狼群原有的最短路線最好經(jīng)過牧羊人的初始位置,牧羊人看見狼群從而進(jìn)行射擊,從而達(dá)到消滅狼群的目的。
羊群:在草原的一定范圍內(nèi)隨機(jī)生成,先在草地上逗留一會(huì)或吃草或環(huán)顧四周后向著羊圈運(yùn)動(dòng),這期間就可能會(huì)受到狼群攻擊。
狼群:在山中的三個(gè)隨機(jī)位置生成,生成后會(huì)向著羊群追趕,并攻擊。
第一游戲視角(即牧羊人):通過手柄控制槍支進(jìn)行射擊,保護(hù)羊群,驅(qū)趕狼群。
本次設(shè)計(jì)主要體現(xiàn)在牧羊人、狼追趕羊、羊群、牧羊人與狼群的交互以及UI 界面包括倒計(jì)時(shí)以及重新開始的設(shè)計(jì)上。 游戲開始便進(jìn)入游戲場景,牧羊人為第一視角,倒計(jì)時(shí)開始,游戲時(shí)長可以選擇。
倒計(jì)時(shí)結(jié)束后,所有狼群和羊群停止動(dòng)作,羊圈處出現(xiàn)重新開始字樣,可槍擊中間的小羊圖案進(jìn)行重新開始。游戲過程中,羊群向著羊圈慢慢移動(dòng),狼群從山中三處隨機(jī)產(chǎn)生并向著狼群運(yùn)動(dòng),在距離羊群一定距離時(shí)發(fā)起攻擊。牧羊人可在發(fā)現(xiàn)狼群時(shí)向狼群發(fā)起攻擊。羊群中的所有羊死亡即游戲結(jié)束并游戲任務(wù)失敗或者倒計(jì)時(shí)結(jié)束也即游戲結(jié)束。
整個(gè)游戲分為牧羊人,羊群,狼群三大模塊。
游戲的場景設(shè)定是在一個(gè)四面環(huán)山的草原上。在場景搭建中包括牧羊人居住的帳篷,帳篷中取暖的火焰,羊圈的柵欄, 望塔等場景中的基本建筑。其中火焰是采用unity中的粒子效果實(shí)現(xiàn)的,柵欄通過3dsmax建模完成。
狼群在整個(gè)游戲中的主要任務(wù)是向羊群發(fā)起攻擊;
首先涉及到尋找羊的過程:
1.選中地形Terrain,在Inspector視圖中名稱右側(cè)的Static處選擇Navigation Static;
2.烘培地形:(unity for Mac)Window->Navigation,進(jìn)入Navigation界面中的Object選項(xiàng),勾選Navigation Static。在進(jìn)入Bake選項(xiàng),點(diǎn)擊Bake,現(xiàn)在開始烘培地形。
3.在狼的預(yù)制體拖入Hierarchy視圖中,選中狼的預(yù)制體添加Nav Mesh Agent組件;
4.需要為狼添加動(dòng)畫控制器:
5.創(chuàng)建一個(gè)動(dòng)畫控制器命名為WolfMoving;
6.雙擊進(jìn)入動(dòng)畫控制器,找到動(dòng)畫“run”,拖入動(dòng)畫控制器編輯區(qū)中,自動(dòng)Entry會(huì)指向“idle1”,表示狼的初始動(dòng)作為奔跑的“run”,即狼群一開始生成就回開始跑向羊群。
7.狼群如果在奔跑過程當(dāng)中遇到羊群,會(huì)發(fā)起攻擊。所以需要將動(dòng)畫“runBite”拖入動(dòng)畫控制器編輯區(qū)。
8.狼群也不總是在奔跑,也可以速度變慢停下來四處走動(dòng)。所以需要將動(dòng)畫“walk”拖入動(dòng)畫控制器編輯區(qū)。
9.狼群還會(huì)停下來觀察四周,查看是否適合進(jìn)攻,將動(dòng)畫“idleLookAround”拖入動(dòng)畫控制器編輯區(qū)。
10.狼群收到牧羊人的槍擊會(huì)死亡,所以需要將動(dòng)畫“death”,拖入動(dòng)畫控制器編輯區(qū)。
11.設(shè)置不同的狀態(tài)之間的轉(zhuǎn)換條件:
從“run”到“runBite”:控制bool變量Attack為真,取消勾選Has Exit Time選項(xiàng);從“runBite”回到“run”:bool變量Attack為假,取消勾選Has Exit Time選項(xiàng);
從“Any State”到“death”:設(shè)置Trriger條件Death,不勾選Has Exit Time選項(xiàng);
12.編寫腳本:
其中主要的部分
一是在Start()函數(shù)中獲取游戲?qū)ο笊婕暗挠螒蚪M件:
nav = GetComponent<NavMeshAgent>();// 獲取尋路組件
ani = GetComponent<Animator>();// 獲取動(dòng)畫控制器組件
以及獲取狼群尋路的目標(biāo)的位置:
target = GameObject.FindGameObjectWithTag("Sheep").transform;//狼尋路的目標(biāo)為標(biāo)簽為“Sheep”的游戲?qū)ο?/p>
設(shè)置Update (),開始尋路,尋路目標(biāo)為target的位置即羊群的位置:
nav.SetDestination(target.position);
Unity中設(shè)置:
1.因?yàn)樾枰趲讉€(gè)不同的位置生成狼群,先創(chuàng)建一個(gè)Perfabs文件夾,將Hierarchy視圖中的狼拖入該文件夾再刪除Hierarchy視圖中的狼;
2.創(chuàng)建三個(gè)空物體分別命名為WolfManager、Wolf1、Wolf2;
3.編寫腳本
實(shí)現(xiàn)邏輯為:使用一個(gè)函數(shù)由于生成狼的預(yù)制體,然后每隔一段時(shí)間重復(fù)調(diào)用這個(gè)函數(shù)
public float spawnTime = 3f;// 延遲時(shí)間
public GameObject wolf;// 狼的預(yù)制體
public Transform[] spawnPoints;
在Start()函數(shù)中實(shí)現(xiàn)重復(fù)調(diào)用生成函數(shù):
InvokeRepeating("Spawn",2f, spawnTime);//2 秒后開始調(diào)用Spawn()函數(shù),每spawnTime即3秒后再次調(diào)用
編寫Spawn()函數(shù)即生成函數(shù):
intspawnPointIndex = Random.Range(0, spawnPoints.Length);
Instantiate(wolf, spawnPoints[spawnPointIndex].position,spawnPoints[spawnPointIndex].rotation);
4.有兩個(gè)生成點(diǎn),需要拖入兩個(gè)腳本進(jìn)入WolfManager中,每個(gè)腳本需要拖入,狼的預(yù)制體以及設(shè)置延遲時(shí)間,將Spawn Points數(shù)值設(shè)為1之后拖入生成位置(transform)即之前設(shè)置的Wolf1或Wolf2。
牧羊人在整個(gè)游戲里的作用是保護(hù)羊群擊殺狼群。牧羊人為游戲的第一視角利用的是SteamVR中的CameraRig實(shí)現(xiàn)的。在CameraRig中的Controller(right)下用槍的模型替換Model;
大多數(shù)時(shí)間牧羊人不會(huì)受到狼群攻擊,因?yàn)槟裂蛉丝梢栽谡麄€(gè)場景中瞬移,速度較快。關(guān)于在場景中的瞬移需要用到SteamVR和VRTK的集成。
羊群在這個(gè)游戲中屬于被牧羊人保護(hù),受到狼群追趕,最終目的是回到羊圈里。為了游戲的真實(shí)性,實(shí)現(xiàn)在草原上會(huì)放置十幾個(gè)羊的預(yù)制體,讓玩家能看到羊在草原上吃草的情形,
首先需要為其添加動(dòng)畫控制器,其設(shè)置動(dòng)畫控制器過程與狼類似,這里不再贅述。
這一部分即時(shí)游戲的UI部分,是關(guān)于游戲結(jié)束與游戲重新開始的設(shè)置:
1.在Unity中的Hierarchy視圖中創(chuàng)建一個(gè)空物體重命名為GameManager,用于管理整個(gè)UI;
2.選中需要顯示倒計(jì)時(shí)的位置( 望塔),右鍵單擊->UI->Canvas,在UI下創(chuàng)建一個(gè)空物體命名為restartPos即重新開始圖樣出現(xiàn)的位置,重置其transform。在Canvas下分別創(chuàng)建time、timetext、score、scoretext并設(shè)置;
3.在GameManager腳本中:
設(shè)置Unity初始值:包括分?jǐn)?shù),記錄剩余的時(shí)間,重啟游戲圖標(biāo)產(chǎn)生的位置,判斷游戲是否結(jié)束等參數(shù)。
在Start()中調(diào)用ini()函數(shù)
編寫包括增加分?jǐn)?shù)函數(shù),初始化游戲函數(shù),游戲結(jié)束函數(shù),重新計(jì)數(shù)函數(shù),重新開始游戲函數(shù)。
最后設(shè)置FixedUpdate()中通過判斷IsGameOver是否為真,如果為真直接跳出函數(shù),如果為假,調(diào)用onGameOver()函數(shù)。
4.將GameManager腳 本 拖 入Hierarchy視 圖 中 的GameManager上,將 time、timetext、score、scoretext拖入對(duì)應(yīng)的文件框中。
VR技術(shù)是仿真技術(shù)的一個(gè)重要方向,是仿真技術(shù)與計(jì)算機(jī)圖形學(xué)人機(jī)接口技術(shù)多媒體技術(shù)傳感技術(shù)網(wǎng)絡(luò)技術(shù)等多種技術(shù)的集合,是一門富有挑戰(zhàn)性的交叉技術(shù)前沿學(xué)科和研究領(lǐng)域。本文介紹了基于Unity3D的VR射擊游戲的研究與開發(fā)過程,包括基于Unity的場景設(shè)置和腳本的掛載。感知是指理想的VR應(yīng)該具有一切人所具有的感知。此射擊游戲利用了人的視覺的、運(yùn)動(dòng)等感知,是游戲更具真實(shí)感。但是這款游戲還有待改進(jìn),未來工作是優(yōu)化游戲代碼和模型,希望能給玩家?guī)砀诱鎸?shí)的游戲體驗(yàn)。