1. 程式人生 > >淺談Unity與VR產業,用Unity開發第一款VR應用

淺談Unity與VR產業,用Unity開發第一款VR應用

VR(Virtual Reality的縮寫,中文翻譯—虛擬現實)概念早在80年代初就被提出來的,其具體是指藉助計算機及最新感測器技術創造的一種嶄新的人機互動手段。

中國VR產業仍在摸索階段,亟缺複合型專業人才。據領英的全球人才庫資料顯示,正在起步期的中國VR產業,單以絕對人數來看,並不缺乏VR從業者。但高質量、專業的VR人才的儲備不完善,當前很多VR人才都是為了業務發展需求而從企業其他部門抽調而來的,同時,產業生態建設和產業鏈部分環節的缺失,成了限制產業發展的一大重要因素。前段時期,小米CEO雷軍接受《日本經濟新聞》專訪,雷軍表示小米已經成立研發中心開發VR產品,未來5年才能成熟。3月18日下午,阿里巴巴宣佈成立VR實驗室,4月1日下午,淘寶推出全新購物方式Buy+,利用計算機圖形系統和輔助感測器,生成可互動的三維購物環境。 
三維購物環境

 
這樣炫酷的三維視覺技術,不僅是可以讓你隨時隨地的身臨其境的購物,更是可以隨意切換場景,對比買回家之後的效果。據阿里巴巴透露,該計劃將於四月後上線。是不是很期待?

VR發展的障礙仍然是如何加入其它的感知,比如嗅覺、味覺、觸覺。為了達到這一目的,計算機必須能夠實現和人腦的互動,這是技術上的最大的難點。中國的VR產業迅速爆發,在短期內資本大量注入,商業展示、線下體驗店等多種形式的商業化程序遍地開花,但一方面又缺乏足夠成熟的產業生態體系支援長期發展。眾多的VR 線下體驗店基本主打單一內容體驗,盈利來源於消費者對於VR的好奇心。但單一化的內容體驗能夠持續多久,或許是商家最難預判的難題。因此,商家更需要的是內容提供商在內容差異化上做出更多創新,才能讓其商業模式得到可持續發展。

2016年,虛擬現實迎來井噴式發展,資料顯示,預計到2018年,VR使用者將達到675.2萬,2020年將近3000萬。而最近除了國美與暴風魔鏡在北京國美馬甸店正式揭幕號稱國內最大移動VR線下體驗館——“暴風魔鏡國美移動VR體驗館”。隨後,蘇寧控股董事長張近東在2016中國電子商務大會上表示,未來3個月將在全國建設300個VR體驗館,打造中國最大的VR體驗平臺。如今,不少一二線城市各種VR體驗店猶如雨後春筍,成為VR線下體驗的急先鋒。如萬達院線、IMAX,也相繼宣佈加入VR線下體驗的陣營。據此,距離中國VR市場成熟已經不遠了,很快VR將進入人們的生活中。

還有一個大家關心的問題,就目前而言,虛擬現實技術還屬於新生事物,由於使用了各種的高科技配置,因此成本較高。去年Facebook的執行長馬克·扎克伯格展示的Oculus Rift頭盔,預售價格為399美元(約合人民幣3920元),這對普通使用者來說是一筆不小的金額,所以,這也是阻礙VR市場成熟的阻力。 
這裡寫圖片描述

淺談Unity與VR

對於大多數人來說,可能不知道Unity3D是什麼,但是卻知道VR虛擬現實是什麼,更不會把VR虛擬現實和Unity3D聯絡在一起,外行的人根本不知道這兩者之間有什麼關係。那麼,今天奇酷學院(www.qikuedu.com)Unity3D培訓老師來給你講解一下Unity3D與VR虛擬現實之間的區別和聯絡分別是什麼?

  瞭解Unity3D與VR虛擬現實之間的區別和聯絡之前,我們首先要弄明白,什麼是Unity3D?什麼是VR虛擬現實?搞清楚這兩個名詞的含義,有助於幫助我們接下來對這兩者之間的區別和聯絡的理解。

  

  什麼是Unity3D?Unity3D是一軟專業3D遊戲引攀,其具備跨平臺釋出、離效能優化、高性價比,AAA級遊戲畫面演染效果等特點。目前Unity3D應用範圍廣泛,從手機遊戲到聯網的大型遊戲,從嚴肅遊戲到電子商務,再到VR虛擬現實均可完美呈現。

  什麼是VR虛擬現實?虛擬現實(VirtualReality,簡稱VR),是由美國VPL公司建立人拉尼爾(JaronLanier)在20世紀80年代初提出的。具體內涵是:綜合利用計算機圖形系統和各種現實及控制等介面裝置,在計算機上生成的、可互動的三維環境中提供沉浸感覺的技術。

  

  通過什麼是Unity3D?什麼是VR虛擬現實?這兩個名詞的解釋,不難發現,VR虛擬現實是通過Unity3D開發引擎,結合其他語言基礎做出來的效果,也就是說,學會Unity3D開發引擎,可以從事VR虛擬現實的相關工作。簡單來說Unity3D開發引擎是工具,VR虛擬現實是結果。

  目前全球已超過九十萬名開發者使用Unity3D,而且作品數量不斷與日俱增,尤其目前在AppStore內有超過1500種移動平臺遊戲以及橫跨許多國家上百個網頁遊戲都是以Unity3D為平臺所開發的。這些開發者也包含許多國際知名廠商,例如法國育碧Ubisoft,美商藝電ElectronicArts,德國遊戲巨頭Bigpoint公司、迪斯尼Disney、樂高LEGO等。

  Unity3D開發引擎的產品特點

  1.支援多種格式匯入:

  整合多種DCC檔案格式,包含3dsMax,Maya,Lightwave,Collade等文件,可直接拖拽到Unity中,除原有內容外,還包含Mesh、多UVs,Vertex,Colors、骨骼動畫等功能,提升7遊戲製作的資源應用。

  2.AAA級影象渲染引擎:

  Unity渲染底層支援DirectX和OpenGL。內建的100組Shader系統,結合了簡單易用,靈活,高效等特點,開發者也可以使用ShaderLab,建立自己的Shader。先進的遮擋剔除(OcclusionCulling)技術以及細節層級顯示技術(LOD),可支援大型遊戲所需的執行效能。

  3.高效能的燈光照明系統:

  Unity為開發者提供高效能的燈光系統,動態實時陰影、HDR技術、光羽&鏡頭特效等。多執行緒渲染管道技術將渲染速度大大提升,並提供先進的全域性照明技術(GI),可自動進行場景光線計算,獲得逼真細膩的影象效果。

  4.NVIDIA專業的物理引擎:

  Unity支援NVIDIAPhysX物理引擎,可模擬包含剛體&柔體、關節物理、車輛物理等。

  5.高效率的路徑尋找與人群模擬系統:

  Unity可快速烘焙三維場景導航模型(NavMesh),用來標定導航空間的分界線。目前在Unity的編輯器中即可直接進行烘焙,設定完成後即可大幅提高路徑找尋(Path-finding)及人群模擬(CrowdSimulation)的效率。

  6.友善的專業開發工具:

  包括GPU事件探查器、可插入的社交API應用介面,以實現社交遊戲的開發;專業級音訊處理API、為建立豐富通真的音效效果提供混音介面。引擎指令碼編輯支援Java,C#,Boo三種指令碼語言,可快速上手、並自由的創造豐宮多彩、功能強大的互動內容。

  7.逼真的粒子系統:

  Unity開發的遊戲可以達到難以皿信的執行速度,在良好硬體裝置下,每秒可以運算數百萬面以上的多邊形。高質量的粒子系統,內建的Shuriken粒子系統.可以控制粒子顏色、大小及粒子運動軌跡,可以快速建立下雨、火焰、灰塵、爆炸、煙花等效果!

  8.強大的地形編輯器:

  開發者可以在場景中快速建立數以千計的樹木,百萬的地表岩層,以及數十億的青青草地。開發者只鑄完成75%左右的地貌場景,引擎可自動填充優化完成其餘的部分。

  9.智慧介面設計,細節凸顯專業:

  Unity以創新的視覺化模式讓使用者輕鬆建構互動體驗,提供直觀的圖形化程式介面,開發者可以玩遊戲的形式開發遊戲,當遊戲執行時,可以實時修改數值、資源甚至是程式,高效率開發,拖拽即可。

  10.市場空間:

  iOS,Android,Wii,Xbox360,PS3多平臺的遊戲釋出。僅需購買iOSPro或AndroidPro釋出模組就可以在iPhone或iPodTouch或Android系統等移動終端上建立任何酷炫的二維三維、多點觸控、體感遊戲,隨後可將遊戲免費釋出到自己的移動裝置上測試執行,增添修改的方便性。

  11.單機及線上遊戲釋出:

  Unity3D支援從單機遊戲到大型聯網遊戲的開發,結合Legion開發包和Photon伺服器的完美解決方案,輕鬆即可建立MMO大型多人網路遊戲。而且在開發過程中,Unity3D提供本地客戶《NativeClient)的釋出形式,使得開發者可以直接在本地機器進行測試修改.帶助開發團隊編寫更強大的多人連線應用。

  12.TeamLicense協同開發系統:

  TeamLicense可以安裝在任何Unity裡,新增的介面可以方便用來進行團隊協同開發。避免不同人員重複不停的傳送同樣版本的資源至伺服器,維持共用資源的穩定與快速反應其中的變化,過長的反應更新時間將會影響團隊協同開發的正確性與效率。

  13.視覺化指令碼語言u:

  視覺化指令碼編輯語言u,具有高度的友好介面、整合性高、功能強大、修改容易等特點。開發者只禱將整合的功能模組用連線的方式,通過邏輯關係將模組連線,即可快速建立所鑄指令碼功能,非常適合非程式設計人員與專案製作使用。

  14.Substance高寫真動態材質模組:

  Substance是一個功能強大的工具,通過任何的普通點陣圖影象,直接生成高品質的次時代遊戲設計專用材質(法線圖,高度圖,反射貼圖等》,為DCC工具或遊戲引擎(如Unity3D)提供高階的渲染效果。

  在Unity3D這麼強大的技術支援下,VR虛擬現實的效果是可以輕而易舉的實現,其中人機互動技術是密不可分的組成部分,人機互動技術主要研究方向有兩個方面,分別是:人如何命令系統;系統如何向用戶提供資訊。眾所周知,人在使用計算機方面的感受(即人機互動部分的友好度)直接影響到人對系統的接受程度,而這兩個方面直接決定了人機互動部分的友好度,這是Unity3D與VR虛擬現實之間的主要關聯。

  虛擬現實在各個行業和領域應用得越來越廣泛,而同時也暴露出了一些不可忽視的問題,如對現實世界的隔離,與人類感知外部世界的方式有衝突等等。這些問題,都需要Unity3D開發引擎進行調整和研發,Unity3D開發引擎將計算機生成的虛擬物體或關於真實物體的非幾何資訊疊加到真實世界的場景之上,實現了對真實世界的增強,同時,由於用於與真實世界的聯絡並未被切斷,互動方式也就顯得更加自然,這就是兩者之間親密結合的成果,也是目前最熱門的VR虛擬現實受大家喜歡的根本所在。


用Unity開發第一款VR應用

隨著Oculus宣佈1月6日開啟預售,2016年很可能成為VR遊戲元年,但很多的調研顯示,手遊裝置才是市場增長的關鍵,SuperData釋出的報告顯示,2016年全球VR遊戲市場規模預計在51億美元左右,消費者裝置安裝量在3890萬左右,憑藉價格門檻的優勢,以谷歌Cardboard和三星Gear VR為代表的移動VR裝置很大可能成為使用者量最大的裝置,可能佔據2016年虛擬現實裝置安裝量71%的份額,達到2700萬。


最近,一位從事VR遊戲研發的開發者在自己的部落格中展示瞭如何用Unity和Cardboard把一款3D遊戲變成VR遊戲的方法,他在文章最後還表示,你甚至可以用這種方法把遊戲轉化為AR遊戲,或者從頭開始做新的VR遊戲,以下是Gamelook編譯的博文:

很多的科幻電影都展示了用人類意志控制物體的能力,但到目前為止,這仍舊是一種幻想,目前還沒有技術可以實現這一點。在這份新手教學部落格中,你可以學到如何用Unity做一款兼但的虛擬現實遊戲,配合谷歌Cardboard創造比較簡單的VR體驗,本文主要講的是:

把Cardboard攝像頭整合到你的遊戲中;調整UI元素以適應VR模式;做VR模式下可以選擇的按鈕;在遊戲執行的時候程式化地把遊戲在常規和VR模式下進行切換。

什麼是谷歌Cardboard?

理論上說,創造VR體驗是非常直接的,你在螢幕上展示的並不是一個單獨的圖片,而是需要2個。因為它們來自位置相隔幾英寸距離的兩個攝像頭,玩家們從左攝像頭看到的是左邊影象,右邊看到的則是右邊影象,這就創造了遊戲景深。

此外,再加上一些不錯的動態感測器,你可以探測到使用者面朝哪個方向。把這些和你所創造的3D世界結合起來的話,就可以獲得一個沉浸感很強的遊戲體驗。在實際情況中,在一個高解析度的螢幕上展示兩個影象需要非常複雜的硬體,還需要可以追蹤玩家的頭部運動,把所有的功能整合到一個裝置商,還要控制其重量,以免讓使用者戴起來太累。

然而,隨著谷歌Cardboard的出現,每一臺智慧機都有可能與Cardboard協作,可以用你手機的螢幕與感測器,把它們變成VR裝置的一種,而你所需要的,只是一些Cardboard和塑料鏡片。

開始準備

需要注意的是,你可能大量用到Unity GUI,所以如果從來沒有嘗試過這個工具,那麼最好是看看Unity GUI教程。想要用Google Cardboard做出自己的VR遊戲,你需要以下工具:

Unity專業版,版本5以上;一部智慧機,可以是iPhone 5代以後的iOS裝置,也可以是4.3以上版本的Android裝置。需要說的是,本文假設你是在用iPhone獲得VR遊戲體驗。

如果你從來沒有用過Unity而且也不熟悉介面,那最好是去讀Unity教程介紹

可能會有人說,我如何獲得一個Cardboard硬體呢?

當然,如果還沒有Cardboard裝置的話,最好是從供應商那裡選購,價格加運費大約是20-30美元,如果你覺得自己非常善於DIY,也可以動手做自己的版本。在購買Cardboard的時候,要注意提到V2或者Cardboard 2.0的字樣,因為它們適配大量的手機,包括大螢幕的iPhone 6+在內,它們還支援使用者通過按鈕進行輸入操作。

沒有Cardboard裝置可以嗎?

從某種程度上說,是可以的,你仍然可以在自己的裝置上執行做出來的遊戲,它看起來會是這樣的(下圖):

在玩遊戲的時候,如果你用恰當的方式盯著螢幕看,也可以找到VR的感覺。如果你四處移動手機,就可以進行控制。雖然你也可以玩這款遊戲,還能夠看到遊戲的實際效果,但這種體驗是比較有限的。

長話短說,如果你沒有足夠的耐心等待Cardboard到貨,你仍然可以從本文中學到東西,只是,如果有合適的裝置,你能夠學的東西更多。

樣本遊戲:Ninja Attack is Back!

投入一些時間嘗試這個樣本遊戲,下載並解壓這個Unity新手專案。接下來就是執行Unity,在歡迎介面,選擇開啟(Open)-找到StarterNinja資料夾,開啟NinjaAttack專案。

在專案瀏覽器(Project Browser)中,在Assets裡雙擊MainScene按鈕,然後點選Play嘗試一下這款遊戲。在圖片中,你是左邊的忍者,隨著怪獸在螢幕中出現,你可以在螢幕上點選任何地方釋放一個忍者之星消滅怪獸,在擊殺20個怪獸之後,你就贏了,但是,如果怪獸到達了左邊的紅色區域,你就輸了。

這款遊戲看起來很熟悉是嗎?熟悉的讀者可能會發現,它其實就是我之前介紹SpriteKit以及Cocos2D教程用到的遊戲,不過與之不同的是,這裡的遊戲是用3D渲染的。當然,你並不一定能夠真正地看到非常酷炫的3D效果,這款遊戲使用的是上帝視角,所以對所有的polygon進行渲染總覺得浪費時間,所以,你現在可以發現為什麼這款遊戲非常適合做成VR了。

開始使用Cardboard

你需要做的第一件事就是為Unity下載Cardboard SDK。接下來,把它匯入到你的專案中。從Unity的主選單,選擇Assets\Import Package\Custom Package,然後選擇你剛剛下載的CardboardSDKForUnity.unitypackage。確保所有東西都被選中,反選Legacy資料夾,然後點選Import按鈕。

為了讓你的遊戲作為一個VR體驗,你需要用到一些技巧,在Project Browser中的Cardboard\Prefabs資料夾裡,把CardboardMain Prefab拖拽到你的場景中,在Inspector中,給其賦予和你的忍者角色一樣的位置(5.53,1.13,0.122),並且要進行90度Y Rotation。

你會發現的是,它比忍者的中心部位略高,這樣可以展現出你在看他的眼睛。

接下來,選擇主攝像頭(Main Camera)並且在Inspector中反選,做raccoon忍者物件的時候也需要同樣的操作。現在,把遊戲在Unity編輯器中再次執行,你就會看到一些類似於3D場景的東西。如果你在移動滑鼠的時候按住選擇鍵,你的攝像頭就會隨著頭部的運動進行旋轉。

在iOS裝置上執行你的遊戲場景

在Unity編輯器中執行你的遊戲是非常不錯的,但最後一次檢查的時候,用VR頭盔配上電腦顯示器看起來會讓人很痛苦,所以我們需要適配到iPhone上。

選擇File\Build Settings,iOS應該已經被選為你的預設平臺,點選Click Player Settings然後轉換到Inspector。

在Resolution and Presentation選單下,把Default Orientation設定成Landscape Left。

在其他設定(Other Settings)中,把Bundle Identifier改成你的公司所需要的東西,比如com.(你的公司名).NinjaAttackVR。

把目標裝置改為iPhone,把iPhone和電腦進行連線,選擇Build和Run,然後給輸出資料夾命名,這個名字你可以隨意取。

這時候,Unity就會匯出你的專案,然後它就會自動在Xcode中開啟,如果沒有開啟,啟動Xcode並且手動開啟生成後的專案,執行然後在手機上嘗試。首次運行遊戲的時候,你需要一系列的設定過程,比如可以在Cardboard硬體上掃描二維碼,這樣Cardboard SDK就可以根據你的裝置、距離等進行畫質微調。

需要注意的是,如果設定過程中,你在掃描二維碼的時候出現了 網址開啟錯誤,那就必須調整Xcode專案中的info.plist,蘋果開發者論壇中有說到這個問題,感興趣的童鞋可以親自查閱。

接著,把你的手機插入Cardboard當中,來回轉頭以調整攝像頭視角,你就可以看到相對不錯的3D畫面了。

再一次把它做成遊戲

能夠看到你的遊戲世界是非常不錯的,但初次之外,你還需要把玩法加入到遊戲中,特別是你需要從忍者面朝的方向扔出忍者之星,這是你將要做的第一個玩法。

對於UI來說,Cardboard支援一個按鈕,看起來可能是比較有限,但如果把它和頭部的動態追蹤相結合的話,它可以做出更為複雜的互動。在《Ninja Attack》中,你通過Cardboard.SDK.VRModeEnable資源偵測玩家是否開始了VR模式,檢查按鈕是否和Cardboard.SDK.Triggered資源同時按下去了,如果這些值都對,就可以在使用者面朝的方向扔出忍者之星。

開啟你的NinjaStarLauncher.cs指令碼,你會發現它在Inspector裡是和GameLogic GameObject連在一起的。

創造一個新的private變數:

private Vector3 _vrShooterOffset;

把它在Start() method中初始化:

_vrShooterOffset = new Vector3(0.0f, -0.4f, 1.0f);

用以下程式碼替換Update ():

這就可以運行了,接下來我們看看Update()是做什麼的:

你首先檢查遊戲是否在VR模式,使用者是否按下了按鈕檢查Cardboard.SDK singleton object上的資源。

在此之後,你可以呼叫LaunchNinjaStarFrom()釋放一個忍者之星,你需要用到兩個parameter:

第一個是GameObject標頭檔案,Cardboard庫會為你調出來,所以它應該是已經指向了正確的位置;第二個是輕微偏移,這樣你面前的忍者之星就會看起來更真實,否則的話你扔出去的忍者之星就像是在四隻眼之間進行運動,雖然看起來很cool,但給人的感覺很奇怪。

由於你的Ninja Star GameObject已經被設計飛往特定方向,所以它會朝著正確的方向進攻。

再試一次,這時候,你可以轉頭扔向壞人,輸贏logic仍舊起作用。

解決Game Over選單

你可能已經注意到了,當遊戲結束的時候,用之前的Game Over按鈕,你的角色仍舊是在螢幕的左邊。這款遊戲用到了Display Canvas來展示Game Over介面,Unity最新的GUI教程中有講到這一點,它總是出現在遊戲視窗的頂部。這個標籤適用於大多數的遊戲GUI,因為它可以自動適應到你螢幕的上方,不論你的攝像頭在做什麼,而且它可以非常不錯地適應不同螢幕尺寸。

但在這個案例中,你需要一個存在於遊戲世界中的GUI canvas,有一部分原因是它可以在3D環境中更好渲染,但還因為不希望把玩家愛是叫鎖定到攝像頭上。你的玩家們需要可以上下自由地看,這樣他們可以看到不同的UI元素,找到最活躍的然後點選按鈕。

創造一個新的Canvas

在Hierarchy選單下選擇GameOverCanvas,右擊並且選擇複製,重新命名為VRGameOverCanvas,這樣可以使它與原來的進行區別開來,把GameOverTxt重新命名為VRGameOvertxt。

在VRGameOverCanvas元件中,把渲染模式改為World Space。

在Rect Transform元件中,把位置改為(-2.24,1.1,0.07),然後進行90度Y Rotation

最後,把X和Y Scale改為0.009,當所有一切完成的時候,VRGameOverCanvas看起來因該是這樣的:

你可以在Game View視角下看到兩個canvas是大致重疊的(當遊戲不執行的時候):

這些值是哪裡來的呢?坦白地說,我其實是調整到自己通過Cardboard攝像頭看起來比較不錯為止。有時候,程式設計更多的是一門藝術而不是學科。

支援兩個Canvas

接下來,你需要更改GameController.cs,這樣它才會發現兩個Canvas開啟和GameLogic GameObject指令碼,它也是和GameLogic GameObject聯絡在一起的。把以下的兩個公共變數加入到你的class裡:

public Canvas VRGameOverCanvas;
public Text VRGameOverTxt;

在resetGame()的開始加入如下程式碼:

VRGameOverCanvas.enabled = false;

用以下程式碼取代Gameover():

public void GameOver(bool didIWin) {
isGameOver = true;
_didIWin = didIWin;
string finalTxt = (_didIWin) ? “You won!” : “Too bad”;
if (Cardboard.SDK.VRModeEnabled) {
VRGameOverCanvas.enabled = true;
VRGameOverTxt.text = finalTxt;
} else {
gameOverCanvas.enabled = true;
gameOverTxt.text = finalTxt;
}
}

這個展示了正確的Canvas和Text物件,取決於你是否在VR模式(開啟Cardboard.SDK.VRMode).

在你儲存了指令碼之後,你需要把正確的物件分配到新的公用變數。在Inspector裡找到GameController,點選每個新變數旁邊的目標,然後選擇VRGameOverCanvas物件作為你的VR遊戲Over Over Canvas變數,把VRGameOverTxt物件選為你的VR Game Over Txt變數。

需要注意的是,可能你會奇怪,為什麼是很麻煩地支援兩個Canvas而不是至改變現有的一個呢?原因是,你既需要支援上帝視角,還需要支援VR模式,所以一定要進行優化。

如果你準備現在就運行遊戲,就可以發現VR模式裡的遊戲結束介面展示的很自然。你可以上下看介面的不同部分,現在所有缺少的東西就是再來一次的按鈕。

增加Gaze輸入方式

幸運的是,Unity內建了‘在使用world-space GUI Canvas的時候,攝像頭中心點可以作為滑鼠使用’,但你需要提供額外的指令碼才能使它在VR介面中進行使用。

首先,擴充套件Cardboard Main\Head,找到主攝像頭並把它重新命名為VR Main Camera。選中VRGameOverCanvas物件,你們應該可以看到一個事件攝像頭,點選Hierarchy裡的EventSystem專案,點選增加元件按鈕,並增加GazeInpute Module指令碼。這個指令碼可以確保Unity的GUI系統瞭解Cardboard攝像頭的工作方式。

檢查VR Mode Only,因為在VR模式下的時候,只需要這麼執行就可以了。最後,點選你剛剛增加的Gaze Input Module Component,然後選擇Move Up,重複一次,確保它可以出現在觸屏輸入和獨立輸入模式中,這可以確保Gaze Input Module在遊戲進行的同時優先選擇輸入方式。當所有都做好的時候,它看起來應該是這樣的:

現在,你就可以進行嘗試了。這一次,當你把視角放到Play Again按鈕的時候,它就會變綠,讓你重新開始一場新的遊戲。

玩法微調

或許你會發現這個版本的遊戲在VR模式下玩起來有點難,這是因為你的視角是縮水的,所以在你看著錯誤的方向時,敵人很容易從你身邊溜過去。而且,你無法迅速改變瞄準方向,你會因為脖子轉速的限制而影響到遊戲操作。你讓玩家體驗VR模式並不是為了懲罰他們,所以,你該如何調整呢?當然,可能會有人建議把敵人速度降低。

在Prefabs資料夾中選中EvilSlimeEnemy Prefab,然後開啟EnemyMover.cs,把以下程式碼增加到Start(),隨後設定速度:

這會讓你的遊戲在VR模式下變得更簡單,所以玩家們不至於因為選擇了VR模式就獲得糟糕體驗。

解決螢幕上的分數顯示問題

你還需要解決的一個UI問題是螢幕上的分數,這個就需要不同的方式來處理了。雖然它仍然需要在VR模式中恰當的被顯示出來,但你更希望它在你看任何方向的時候都固定在攝像頭上。

選中Cardboard Main\Head,右擊並選擇UI\Canvas,重新命名新的canvas為VRScoreCanvas,把渲染模式調整為World Space,為其賦予以下值:

位置(0,1,2.5)、寬度400、高度100、旋轉(0,0,0)、Scale(0.0115,0.0115,1)。當完成之後,遊戲看起來該是這樣的:

看起來可能你的文字很奇怪地放在了螢幕中央,但在VR模式裡,你能夠看到的世界比正常情況下是少很多的,所以你在遊戲中看到分數的時候應該是在邊緣部位的,你可以自由進行位置調整,以使其適應你的手機。

接下來,使用文字物件展示你的分數,這個過程和Game Over的做法類似。

開啟GameController.cs並增加一個新的公用變數:

public Text VRScoreTxt;

接下來,你每次更新scoreTxt的時候都需要更新VRScoreTxt,在ResetGame() method中,把以下程式碼加在每次更新後的scoreTxt之後:

VRScoreTxt.text = “–“;

然後把這行程式碼增加到GotOne(),也放在更新scoreTxt的後面:

VRScoreTxt.text = “” + _currScore;

儲存你的指令碼,回到Unity,然後你會發現GameLogic當中的GameController Component如今可以輸入VR Score Txt變量了,點選臨近的目標然後選擇你的VRScoreTxt文字物件。

再次體驗你的遊戲,現在,你就可以看到分數出現在左上角了,還可以允許你的頭部進行運動。

VR模式的切換

由於你的遊戲同時支援上帝視角和VR模式,你應該給使用者自由切換的選擇,UI做起來是很直觀的,你只需要在上帝視角模式中加入一個簡單的按鈕,讓玩家們來回切換模式即可。

首先,你需要增加切換的程式碼,選擇Hierarchy裡的GameLogic,點選增加元件,選擇新指令碼(New Script)然後把指令碼命名為CardboardSwapper。
開啟並用以下內容替換class程式碼:

這個class裡最重要的method就是ActiveVRMode,它是用來啟用Cardboard的VR模式的。其餘的logic負責控制場景中的多個GameObject,取決於是否處於VR模式,你在上帝視角是看不到某些東西的。

你還可以發現的是,當你偵測後面按鈕的時候呼叫了Switch(),這個功能非常適合測試。

你還需要為GameController指令碼增加更多的logic,這樣它才能在切換模式的時候展示或者隱藏一些東西,開啟GameController.cs,把這個method加進去:

public void RefreshGameOver() {
gameOverCanvas.enabled = false;
VRGameOverCanvas.enabled = false;
if (isGameOver) {
GameOver(_didIWin);
}
}

儲存一切然後重新回到Unity介面,選擇GameLogic然後向下滾動到Cardboard Swapper元件,對於Cardboard Object數列,把它的大小賦值為1,然後放到場景中的CardboardMain GameObject中。這樣不僅可以禁用你的Cardboard Head讓你回到上帝視角攝像頭模式,還可以禁用VRScoreCanvas。

對於Mono Object數列,把它的大小賦值為3,然後為你的場景選擇Canvas、Main Camera和raccoon ninja,不要從Assets裡選擇。

最後你需要在上帝視角canvas為使用者增加一個按鈕,為了節約時間,我已經把它做好了,位於prefabs資料夾中。

從Assets\Prefabs中把CardboardButton推拽到Hierarchy,這樣它就成為了你的Canvas物件的子物件,確保其位置設定是(-50,50,0):

在你的按鈕物件底部,把它們連線起來,這樣點選按鈕的時候就可以呼叫CardboardSwapper.Switch() method,你可以從這個動畫看看是如何做出來的:

再次嘗試你的遊戲,點選螢幕右下方的按鈕切換至VR模式,然後單機Cardboard介面背後的按鈕切換到上帝視角模式。做到這裡,你的VR模式切換就已經完成了。

現在,你可以把Unity中的任何3D遊戲做成VR遊戲了,而且只需要一個Cardboard和一些塑料鏡片,這是可以讓所有人都能夠體驗的VR遊戲。Android版本的做法和iOS大致相同,谷歌的Unity Developer指南還提供了更多的技術資訊。最後,你甚至可以為你的VR遊戲增加AR功能。

最後,你可以嘗試Unity裡所有的3D遊戲,看是否能夠順利地做成VR體驗,或者,這個教程也可以讓你做出全新的VR遊戲。


--------------------------------------------------------------------------------------------------------------------
【轉】Unity3D關於VR的Demo: -------------------------------------------------------------------------------------------------------------------- Unity3D官方VR的Demo: --------------------------------------------------------------------------------------------------------------------

宣告