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