基于Unity的VR迷宫游戏项目技术分享
一、項目重述
項目重述如下:
三、項目核心技術與亮點
四、系統架構概述
4.1 設備與開發環境
4.2 系統架構
4.2.1 系統架構簡述
4.2.2 系統架構圖
-主要功能模塊圖示:
??
五、項目需求與可行性分析
5.1 移動端需求與可行性分析
5.1.1 用戶界面設計
在界面設計中,我們希望設計的界面符合課上講述的各類 GUI 設計原則的要求:
5.1.2 圖像獲取方式
在實驗中,我們需要獲取場景中已經標記好的迷宮,需要通過拍照實現。除此以外,我們還希望可以上傳圖片的方式進行處理,從而應對實驗環境中沒有已標記迷宮的問題。
5.1.3 圖像處理流程
我們希望能使用OpenCV完成圖像的處理,識別圖像中的迷宮,并生成格式化的迷宮數據。OpenCV是一個用于計算機視覺和機器學習的庫,可以用來進行文件掃描和圖像處理。下面是使用OpenCV進行處理的主要流程:
5.1.4 數據約定與數據傳輸
由于需要將迷宮識別的結果發送給服務器,我們在開發前約定了傳輸的數據格式:通過40位長的01字符串,按照行優先的順序對應到迷宮的每一條邊上,以此表示迷宮的結構。
5.2 VR與服務器端需求與可行性分析
5.2.1 控制平臺設計及三維虛擬場景呈現
5.2.2 雙人體驗系統設計及虛擬迷宮轉換
5.2.3 使用的開發工具和設備選擇及兼容性問題
六、系統工作流程概述
在進一步介紹系統的具體開發方案之前,我們認為讀者對系統的工作流程有進一步的了解,可以更清晰地閱讀和理解之后的內容。出于此,本部分將對系統的工作流程做進一步的解釋。
6.1 移動端二維地圖識別
在移動端設計可以對二維地圖識別的軟件,首先可以使用手機攝像頭對物理空間中的地圖進行拍攝采樣,通過圖像進行預處理、圖像進行分析、圖像透視變換與直線識別、模糊處理等一系列處理過程,準確識別物理環境中迷宮的結構。
此后,將迷宮顯示在用戶可直接操作的GUI上供用戶手動修改不完善的部分,最終按照約定組織數據并提交。
用戶界面的展示如下:
????
????
6.2 服務器端接流,設置地圖信息
服務器端首先接收來自移動端收集的迷宮布局數據,將封裝的信息解碼后獲得地圖信息,并按照該信息,在web界面上的4*4的地圖區域還原出物理空間中的二維地圖。設置完成之后首先向手機VR端發送轉發地圖信息,便于VR端在第一時間構建出三維迷宮地圖的墻壁。接著管理員可以在服務器端的web界面上設置金幣、TNT炸彈、寶箱的位置信息,設置完成之后發送給VR端。服務器與VR端之間使用Socket通信。當有多人進行游戲的時候,服務器會將設置的信息平等的發送給兩個VR端,保證信息的統一性,同時也增加了游戲的競爭性、可玩性,多個用戶競爭同一個寶箱。
6.3 VR端接流,進行游戲,返回游戲信息
VR端首先接收一個來自服務器端的封裝后的地圖信息,將該信息解碼后,依據該信息利用Unity3D技術構建出三維迷宮的基本墻體,用戶此時便可以觀察到迷宮的樣貌,也可以進行走動,體驗動作識別的靈敏度等。準備完成之后VR端開始接受來自服務器端設置的地圖信息,比如:金幣、TNT、寶箱等。根據這些道具的位置信息,VR端在三維迷宮之中增加這些道具。當用戶贏得金幣,或者觸碰到炸彈之后,獲得相應的獎懲,VR端要取消設置在該位置上的金幣或炸彈,并將迷宮中的游戲信息:用戶位置、用戶數量、地圖上的道具信息等返回給服務器端。
6.4 服務器端接收VR端返回信息
服務器端隨時接收VR端返回的游戲的信息,包括有游戲玩家的數量、游戲玩家的位置信息、當前游戲世界中金幣的數量以及位置信息、TNT炸彈的數量以及位置信息、最終寶箱的數量以及位置信息。服務器要將這些信息展示在服務器的web頁面上。并且服務器可以隨時添加或刪除金幣等游戲道具的信息。
七、系統具體實現與成果展示
7.1 移動端具體實現
7.1.1 界面設計
7.1.1.1 界面展示
為了更好的解釋界面的設計原理,先展示最終的界面,分別是初始的狀態以及工作下的狀態:
????
????
7.1.1.2功能介紹
簡要介紹一下各部分:
7.1.1.3 設計準則與原理
在進行設計的過程中,盡可能的應用了課上所學習的GUI設計理論,具體闡述如下。
桌面隱喻:
直接操縱:
所見即所得:
7.1.2 手動確定迷宮格式
7.1.2.1設計目的
出于一下三個目的,在進行圖片識別處理之前,我首先設計了可以點擊處理,即手動確定迷宮組成的部分。
7.1.2.2 構建方式
根據實驗的要求,如“3.2.1”中的展示的圖片,迷宮由4 * 4的正方形組成,邊緣以Button的形式組成,以行優先的模式處理,每行有四個或者五個按鈕,即 4 + 5 + 4 + 5 + 4 + 5 + 4 + 5 + 4 = 40 個按鈕,組成了整個迷宮。每個按鈕彼此獨立,表示迷宮中的“一堵墻”是否存在。
迷宮的存儲由一個二維數組完成,以行優先的結構存儲,共有九行。數組中的每一位只能取0或者1,表示當前位置的“墻壁”是否“存在”。
通過點擊按鈕,可以改變按鈕的顏色,同時更新數組中對應位置的數值,即改變一個墻壁的狀態。
7.1.2.3 迷宮快速操作按鍵
在實際開發與測試的過程中,我們發現有一些手動的操作是重復的,比如,我們常常希望可以為迷宮添加四周的邊緣,以保證迷宮內的用戶有沉浸式的體驗。而每次通過點擊輸入迷宮的四周,是一個令人感到厭倦的工作。
因此,在迷宮的下方,添加了三個按鈕,用于直接完成三個常用的操作,分別是:
開發及測試中的過程與體驗證明,這三個按鈕的設計是十分有必要的。
7.1.3 圖像獲取
作為系統的輸入,圖像獲取流程是十分關鍵的一部分。根據上文的需求分析,我們希望可以通過上傳圖片或拍照的兩種方式完成圖像的輸入操作。
7.1.3.1 通過拍照獲得圖片
其主要步驟如下:
7.1.3.2在相冊上傳圖片
這部分的處理流程相對較為簡單:
7.1.4圖像處理
圖像的處理以及在其中識別出迷宮是項目的關鍵部分,在這部分中,我們期望可以在輸入的圖片中提取出最大矩形的信息,并通過透視變換轉換為正方形,還需要一些額外的圖像處理的步驟,以便于下一部分中迷宮的識別。
7.1.4.1 處理步驟
7.1.4.2 結果展示
原始圖像:
?
處理結果:
?
7.1.5 迷宮識別
完成了上述的圖像處理之后,我們得到了一個正方向的迷宮,其中黑色的部分標識了迷宮的“墻體”,接下來的工作是識別出迷宮中的直線,并對應地映射到迷宮的每個墻壁上,最終更改設置好的迷宮。
7.1.5.1 具體步驟
識別過程主要分為以下幾個步驟:
7.1.5.2 結果展示
輸入迷宮圖像:
?
處理結果:
?
7.1.6 數據提交
經過組內協商,我們使用HTTP協議中的 GET 請求進行數據的發送,數組組織在URL中,以一個40位的字符串發送。
7.2 VR端開發具體實現
7.2.1 總體預覽圖
?
7.2.2 動捕數據處理
首先,我們設定了一個計數器,每接收到10次數據執行一次更新,這么做的目的是為了更新玩家坐標的操作不能太頻繁,實驗證明能夠稍微提高一些VR的性能,尤其是在設備硬件條件不是很好的情況下。
然后我們寫了一個統一分割函數:parseOneComponentPosition()。這個函數是項目的早期階段寫的,里面是對于各個部位做了一下字符串到index的映射,以后調用的時候就比較方便。
實際上在之后的開發過程中,對我們有用的數據也就是頭部和手部數據。分割之后,我們把這個頭部數據作為人體坐標的依據(頭部一般不會抖動,比較穩定),并且存到一個public static的變量中。
7.2.3 實體組件的邏輯
實體組件主要有地板、墻壁、寶箱、金幣、TNT炸藥桶這四個部分。其中,地板作為整個地圖的托舉部分,上面承擔了一些額外的通訊功能(把一些C# Scripts 綁定在了上面)。例如TCPClient,還有movement腳本。這些腳本是作為全局狀態存儲器或者行動控制器運行的,主要作用是控制全局狀態。
墻壁,TNT炸藥桶,金幣,寶箱都是作為prefab事先存到項目里面。
墻壁是不具有rigidbody的剛體組件,不受重力影響,但碰撞時會妨礙玩家移動。
?
金幣是不受重力影響的剛體組件,會每秒旋轉,以吸引玩家過來拾取。當玩家離金幣距離為 3 以內,并且右手舉過頭頂的時候,金幣就會被拾取。金幣被撿到之后+10分。
?
TNT如果距離玩家為2以內就會爆炸,并且-20分。可以看到,它有一個爆炸效果的成員變量。如果靠近,就會爆炸并且消失。
?
7.2.4 人物行走
對于一條數據,由工具集系統可知:一條信息可能包含多個玩家的位置信息。所以如果是單人游戲,我們直接舍棄其他人物的信息,保留第一個玩家的動作捕捉數據。如果是雙人游戲,則需要明確自己究竟是第幾個玩家,并且根據玩家號對應的數據來更新自己或者他人的位置。
那么,如何才能確定一個唯一的玩家號呢?我們在服務端設定了一個這樣的服務:
?
它返回的報文格式如下:
?
也就是說,我們所有的數據最終都在服務端,并且VR在開機的時候就向服務端發送一個HTTP報文,以請求自己的玩家號和初始迷宮布局信息。
關于地圖的墻壁編號和地塊編號,我們是這樣規約解釋的:
?
?
這樣就能用一個字符來唯一描述一個組件的位置。
7.2.5 墻壁和物品的實時更新
我們使用springboot+vue搭建了服務端的平臺。這一部分是薛文博同學制作、我略加修改的,這里僅僅展示一下效果。如圖,可以直接修改并且實時反映到所有的VR端。這一效果達成的方法是:VR端每1秒發送一個HTTP請求到服務端,然后根據其回復來更新VR地圖。在服務端前端熱更新地圖之后,會傳到后端并且更改相應的文件。這個文件就是一切數據的最終依據來源。
?
?
7.2.6 計分系統
我們在游戲中引入了積分系統,金幣+10分,TNT-20分,最終寶箱+100分,規定時間內贏得分數較高的玩家界定為勝利。
游戲結束界面如下:
?
7.3 服務端開發具體實現
7.3.1 接收移動端地圖識別端的信息并處理
服務器端與前端使用socket進行通信,接收到數據轉化為JSON的格式,讀取之后儲存到walls的文件當中,后續所有關于迷宮墻壁的操作都是根據對walls文件的操作。
7.3.2 web界面展示地圖信息
?
前端使用Get方法從后端調用walls的信息,讀取之后對應到web界面的地圖中,對應的墻壁塊變為黑色,從而實現了物理空間地圖信息到web界面平面信息的轉化。
7.3.3 web界面上更改地圖信息,設置游戲道具等操作
7.3.3.1 更改地圖墻壁信息
通過點擊對應的墻壁的位置,實現對墻壁的增加或刪除。
?
此時我將全部的內部墻壁都取消了。
7.3.3.2 增加金幣、TNT炸彈、最終寶箱等道具
管理員操作:先點擊右側的增加各種類型道具的按鈕,然后再點擊左邊地圖中每個方格中間的位置,從而實現出對道具的增加,設置完成之后對應位置會出現有相應的圖標,所有道具設置完成之后,點擊提交便可以提交到兩個VR端。
? ? ? ? {
設置完成之后點擊右側提交按鈕,若提交成功則會出現相應提示
?
7.3.3.3 自動刷新/暫停刷新
點擊自動刷新之后,前端web界面每隔5s接收一次后端發過來的數據,并將其顯示在對應的位置上,其目的是為了實現實時更新VR端用戶的位置,是否獲取了金幣等游戲信息。便于管理員進行上帝視角的查看。暫停刷新之后,管理員可以實時對游戲內道具的信息進行修改。
?
7.3.4 向VR端發送管理員設置好的地圖信息以及游戲道具
服務器與VR端使用Socket進行通信,當建立好連接之后,服務器立即發送一個json數據包,該數據包中只包含walls墻壁信息與player_id用戶id兩個信息,便于VR端在第一時間構建出三維迷宮地圖的墻壁。之后每隔5s管理員每點擊一次提交便會向VR端發送一個完整的json數據包,包含有道具數量以及位置信息,墻壁信息,用戶id等數據。使得VR端能夠在虛擬三維迷宮中構建出各種各樣的道具。
?
??????
7.3.5 接收VR端發送的游戲進行中的各種游戲信息并展示
VR端會實時發送游戲中的信息,包括用戶位置、用戶數量、地圖上的道具信息等,服務器接收之后展示在web界面,便于管理員了解游戲的情況。并作出對應的操作以增加游戲的趣味性。
?
八、總結
本實驗目的是通過對物理空間的二維地圖識別,依據此信息構建出虛擬三維迷宮,并通過設置一系列的獎懲道具,使用戶在VR眼鏡的幫助下,實現用戶在虛擬迷宮中的漫游和交互。
主要完成以下五個方面:
8.1 系統設計亮點
8.1.1 高精度的物理迷宮識別
我們所開發的系統在物理環境迷宮識別的任務中表現相當出色。通過圖像進行預處理、圖像進行分析、圖像透視變換與直線識別、模糊處理等一系列嚴謹的算法設計,實現了“手繪迷宮識別錯誤率趨近0%,實際應用環境迷宮識別錯誤率約5%”的出色識別結果。
8.1.2 實時控制,實時更改地圖信息
在服務器端,管理員可以在上帝視角隨時更改游戲世界中的道具數量或位置,當用戶很長一段時間找不到金幣時,可以在用戶的周圍設置一枚金幣,讓用戶有種柳暗花明的感覺,增加對游戲的興趣,同時引導用戶前往最終寶箱。或者在用戶前往最終寶箱的必經之路上放置一枚TNT,用戶需要及時進行躲避,才能不被懲罰,大大增加了游戲的可玩性,刺激性。
8.1.3 多人游玩,良好的競爭體驗
該游戲系統支持多人同時進行游玩,用戶可以選擇協作去找最終寶箱,也可以去競爭同一個寶箱,不管怎樣都給了用戶可選擇的權利。多人游玩也給了用戶與其他用戶交互的機會,,增加了游戲的可玩性。
8.1.4 豐富的道具以及獎懲機制
該游戲系統設置了豐富的道具體系,具體的道具類型有:金幣、TNT炸彈、最終寶箱。其中道具的規則:用戶走到金幣位置之后,Kinect檢測到用戶觸摸金幣的信息之后,該用戶將獲得獎勵分。TNT炸彈同理,當用戶觸碰到TNT炸彈之后,將獲得懲罰,積分減少。最終寶箱,設置數量只有一個,當某個用戶找到最終的寶箱之后,該用戶取得勝利,游戲結束。VR端還需要將游戲世界中的信息發送給服務器端,比如當用戶找到一枚金幣之后,該位置上便不會再有金幣了,金幣的數量減一。
8.1.5 道具位置的隨機性,游戲局勢隨機改變的趣味性
服務器端在設置好金幣、TNT炸彈等道具的位置信息之后,只會返回給VR大體的位置,并不會返回具體的位置。VR端在接收了服務器的信息之后,根據在大體位置的范圍內,隨機選擇一個具體位置進行道具的放置,極大的增加了游戲的隨機性,游戲局勢可能隨機發生變化,增加了游戲的刺激感、提高了游戲的可玩性。
8.2 系統測試
除了出色地完成整個系統的設計與開發工作,為了驗證系統在“人機交互”等方面的合理與完善,我們還對系統進行了一系列單元測試、集成測試、系統測試以及用戶測試等,測試的具體執行方案以及測試結果請見《用戶評估報告》。
總結
以上是生活随笔為你收集整理的基于Unity的VR迷宫游戏项目技术分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑开机黑屏错误代码U盘重装系统教学
- 下一篇: 今天跟好朋友的一段超长爆笑聊天记录(Sp