如何用Unity和Cardboard做一款VR游戏
隨著Oculus宣布1月6日開啟預(yù)售,2016年很可能成為VR游戲元年,但很多的調(diào)研顯示,手游設(shè)備才是市場增長的關(guān)鍵,SuperData發(fā)布的報告顯示,2016年全球VR游戲市場規(guī)模預(yù)計在51億美元左右,消費(fèi)者設(shè)備安裝量在3890萬左右,憑借價格門檻的優(yōu)勢,以谷歌Cardboard和三星Gear VR為代表的移動VR設(shè)備很大可能成為用戶量最大的設(shè)備,可能占據(jù)2016年虛擬現(xiàn)實(shí)設(shè)備安裝量71%的份額,達(dá)到2700萬。
最近,一位從事VR游戲研發(fā)的開發(fā)者在自己的博客中展示了如何用Unity和Cardboard把一款3D游戲變成VR游戲的方法,他在文章最后還表示,你甚至可以用這種方法把游戲轉(zhuǎn)化為AR游戲,或者從頭開始做新的VR游戲:
很多的科幻電影都展示了用人類意志控制物體的能力,但到目前為止,這仍舊是一種幻想,目前還沒有技術(shù)可以實(shí)現(xiàn)這一點(diǎn)。在這份新手教學(xué)博客中,你可以學(xué)到如何用Unity做一款兼但的虛擬現(xiàn)實(shí)游戲,配合谷歌Cardboard創(chuàng)造比較簡單的VR體驗(yàn),本文主要講的是:
把Cardboard攝像頭集成到你的游戲中;調(diào)整UI元素以適應(yīng)VR模式;做VR模式下可以選擇的按鈕;在游戲運(yùn)行的時候程序化地把游戲在常規(guī)和VR模式下進(jìn)行切換。
什么是谷歌Cardboard?
理論上說,創(chuàng)造VR體驗(yàn)是非常直接的,你在屏幕上展示的并不是一個單獨(dú)的圖片,而是需要2個。因?yàn)樗鼈儊碜晕恢孟喔魩子⒋缇嚯x的兩個攝像頭,玩家們從左攝像頭看到的是左邊圖像,右邊看到的則是右邊圖像,這就創(chuàng)造了游戲景深。
此外,再加上一些不錯的動態(tài)傳感器,你可以探測到用戶面朝哪個方向。把這些和你所創(chuàng)造的3D世界結(jié)合起來的話,就可以獲得一個沉浸感很強(qiáng)的游戲體驗(yàn)。在實(shí)際情況中,在一個高分辨率的屏幕上展示兩個圖像需要非常復(fù)雜的硬件,還需要可以追蹤玩家的頭部運(yùn)動,把所有的功能集成到一個設(shè)備商,還要控制其重量,以免讓用戶戴起來太累。
然而,隨著谷歌Cardboard的出現(xiàn),每一臺智能機(jī)都有可能與Cardboard協(xié)作,可以用你手機(jī)的屏幕與傳感器,把它們變成VR設(shè)備的一種,而你所需要的,只是一些Cardboard和塑料鏡片。
開始準(zhǔn)備
需要注意的是,你可能大量用到Unity GUI,所以如果從來沒有嘗試過這個工具,那么最好是看看Unity GUI教程。想要用Google Cardboard做出自己的VR游戲,你需要以下工具:
Unity專業(yè)版,版本5以上;一部智能機(jī),可以是iPhone 5代以后的iOS設(shè)備,也可以是4.3以上版本的Android設(shè)備。需要說的是,本文假設(shè)你是在用iPhone獲得VR游戲體驗(yàn)。
如果你從來沒有用過Unity而且也不熟悉界面,那最好是去讀Unity教程介紹
可能會有人說,我如何獲得一個Cardboard硬件呢?
當(dāng)然,如果還沒有Cardboard設(shè)備的話,最好是從供應(yīng)商那里選購,價格加運(yùn)費(fèi)大約是20-30美元,如果你覺得自己非常善于DIY,也可以動手做自己的版本。在購買Cardboard的時候,要注意提到V2或者Cardboard 2.0的字樣,因?yàn)樗鼈冞m配大量的手機(jī),包括大屏幕的iPhone 6+在內(nèi),它們還支持用戶通過按鈕進(jìn)行輸入操作。
沒有Cardboard設(shè)備可以嗎?
從某種程度上說,是可以的,你仍然可以在自己的設(shè)備上運(yùn)行做出來的游戲,它看起來會是這樣的(下圖):
?
在玩游戲的時候,如果你用恰當(dāng)?shù)姆绞蕉⒅聊豢?#xff0c;也可以找到VR的感覺。如果你四處移動手機(jī),就可以進(jìn)行控制。雖然你也可以玩這款游戲,還能夠看到游戲的實(shí)際效果,但這種體驗(yàn)是比較有限的。
長話短說,如果你沒有足夠的耐心等待Cardboard到貨,你仍然可以從本文中學(xué)到東西,只是,如果有合適的設(shè)備,你能夠?qū)W的東西更多。
樣本游戲:Ninja Attack is Back!
投入一些時間嘗試這個樣本游戲,下載并解壓這個Unity新手項(xiàng)目。接下來就是運(yùn)行Unity,在歡迎界面,選擇打開(Open)-找到StarterNinja文件夾,打開NinjaAttack項(xiàng)目。
在項(xiàng)目瀏覽器(Project Browser)中,在Assets里雙擊MainScene按鈕,然后點(diǎn)擊Play嘗試一下這款游戲。在圖片中,你是左邊的忍者,隨著怪獸在屏幕中出現(xiàn),你可以在屏幕上點(diǎn)擊任何地方釋放一個忍者之星消滅怪獸,在擊殺20個怪獸之后,你就贏了,但是,如果怪獸到達(dá)了左邊的紅色區(qū)域,你就輸了。
?
這款游戲看起來很熟悉是嗎?熟悉的讀者可能會發(fā)現(xiàn),它其實(shí)就是我之前介紹SpriteKit以及Cocos2D教程用到的游戲,不過與之不同的是,這里的游戲是用3D渲染的。當(dāng)然,你并不一定能夠真正地看到非常酷炫的3D效果,這款游戲使用的是上帝視角,所以對所有的polygon進(jìn)行渲染總覺得浪費(fèi)時間,所以,你現(xiàn)在可以發(fā)現(xiàn)為什么這款游戲非常適合做成VR了。
開始使用Cardboard
你需要做的第一件事就是為Unity下載Cardboard SDK。接下來,把它導(dǎo)入到你的項(xiàng)目中。從Unity的主菜單,選擇Assets\Import Package\Custom Package,手機(jī)靚號轉(zhuǎn)讓然后選擇你剛剛下載的CardboardSDKForUnity.unitypackage。確保所有東西都被選中,反選Legacy文件夾,然后點(diǎn)擊Import按鈕。
為了讓你的游戲作為一個VR體驗(yàn),你需要用到一些技巧,在Project Browser中的Cardboard\Prefabs文件夾里,把CardboardMain Prefab拖拽到你的場景中,在Inspector中,給其賦予和你的忍者角色一樣的位置(5.53,1.13,0.122),并且要進(jìn)行90度Y Rotation。
你會發(fā)現(xiàn)的是,它比忍者的中心部位略高,這樣可以展現(xiàn)出你在看他的眼睛。
?
接下來,選擇主攝像頭(Main Camera)并且在Inspector中反選,做raccoon忍者對象的時候也需要同樣的操作。現(xiàn)在,把游戲在Unity編輯器中再次運(yùn)行,你就會看到一些類似于3D場景的東西。如果你在移動鼠標(biāo)的時候按住選擇鍵,你的攝像頭就會隨著頭部的運(yùn)動進(jìn)行旋轉(zhuǎn)。
?
在iOS設(shè)備上運(yùn)行你的游戲場景
在Unity編輯器中運(yùn)行你的游戲是非常不錯的,但最后一次檢查的時候,用VR頭盔配上電腦顯示器看起來會讓人很痛苦,所以我們需要適配到iPhone上。
選擇File\Build Settings,iOS應(yīng)該已經(jīng)被選為你的默認(rèn)平臺,點(diǎn)擊Click Player Settings然后轉(zhuǎn)換到Inspector。
在Resolution and Presentation菜單下,把Default Orientation設(shè)置成Landscape Left。
在其他設(shè)置(Other Settings)中,把Bundle Identifier改成你的公司所需要的東西,比如com.(你的公司名).NinjaAttackVR。
把目標(biāo)設(shè)備改為iPhone,把iPhone和電腦進(jìn)行連接,選擇Build和Run,然后給輸出文件夾命名,這個名字你可以隨意取。
?
這時候,Unity就會導(dǎo)出你的項(xiàng)目,然后它就會自動在Xcode中打開,如果沒有打開,啟動Xcode并且手動打開生成后的項(xiàng)目,運(yùn)行然后在手機(jī)上嘗試。首次運(yùn)行游戲的時候,你需要一系列的設(shè)置過程,比如可以在Cardboard硬件上掃描二維碼,這樣Cardboard SDK就可以根據(jù)你的設(shè)備、距離等進(jìn)行畫質(zhì)微調(diào)。
需要注意的是,如果設(shè)置過程中,你在掃描二維碼的時候出現(xiàn)了 網(wǎng)址打開錯誤,那就必須調(diào)整Xcode項(xiàng)目中的info.plist,蘋果開發(fā)者論壇中有說到這個問題,感興趣的童鞋可以親自查閱。
?
接著,把你的手機(jī)插入Cardboard當(dāng)中,來回轉(zhuǎn)頭以調(diào)整攝像頭視角,你就可以看到相對不錯的3D畫面了。
再一次把它做成游戲
能夠看到你的游戲世界是非常不錯的,但初次之外,你還需要把玩法加入到游戲中,特別是你需要從忍者面朝的方向扔出忍者之星,這是你將要做的第一個玩法。
對于UI來說,Cardboard支持一個按鈕,看起來可能是比較有限,但如果把它和頭部的動態(tài)追蹤相結(jié)合的話,它可以做出更為復(fù)雜的互動。在《Ninja Attack》中,你通過Cardboard.SDK.VRModeEnable資源偵測玩家是否開始了VR模式,檢查按鈕是否和Cardboard.SDK.Triggered資源同時按下去了,如果這些值都對,就可以在用戶面朝的方向扔出忍者之星。
打開你的NinjaStarLauncher.cs腳本,你會發(fā)現(xiàn)它在Inspector里是和GameLogic GameObject連在一起的。
創(chuàng)造一個新的private變量:
private Vector3 _vrShooterOffset;
把它在Start() method中初始化:
_vrShooterOffset = new Vector3(0.0f, -0.4f, 1.0f);
用以下代碼替換Update ():
?
這就可以運(yùn)行了,接下來我們看看Update()是做什么的:
你首先檢查游戲是否在VR模式,用戶是否按下了按鈕檢查Cardboard.SDK singleton object上的資源。
在此之后,你可以調(diào)用LaunchNinjaStarFrom()釋放一個忍者之星,你需要用到兩個parameter:
第一個是GameObject頭文件,Cardboard庫會為你調(diào)出來,所以它應(yīng)該是已經(jīng)指向了正確的位置;第二個是輕微偏移,這樣你面前的忍者之星就會看起來更真實(shí),否則的話你扔出去的忍者之星就像是在四只眼之間進(jìn)行運(yùn)動,雖然看起來很cool,但給人的感覺很奇怪。
由于你的Ninja Star GameObject已經(jīng)被設(shè)計飛往特定方向,所以它會朝著正確的方向進(jìn)攻。
再試一次,這時候,你可以轉(zhuǎn)頭扔向壞人,輸贏logic仍舊起作用。
?
解決Game Over菜單
你可能已經(jīng)注意到了,當(dāng)游戲結(jié)束的時候,用之前的Game Over按鈕,你的角色仍舊是在屏幕的左邊。這款游戲用到了Display Canvas來展示Game Over界面,Unity最新的GUI教程中有講到這一點(diǎn),它總是出現(xiàn)在游戲窗口的頂部。這個標(biāo)簽適用于大多數(shù)的游戲GUI,因?yàn)樗梢宰詣舆m應(yīng)到你屏幕的上方,不論你的攝像頭在做什么,而且它可以非常不錯地適應(yīng)不同屏幕尺寸。
?
但在這個案例中,你需要一個存在于游戲世界中的GUI canvas,有一部分原因是它可以在3D環(huán)境中更好渲染,但還因?yàn)椴幌M淹婕覑凼墙墟i定到攝像頭上。你的玩家們需要可以上下自由地看,這樣他們可以看到不同的UI元素,找到最活躍的然后點(diǎn)擊按鈕。
創(chuàng)造一個新的Canvas
在Hierarchy菜單下選擇GameOverCanvas,右擊并且選擇復(fù)制,重命名為VRGameOverCanvas,這樣可以使它與原來的進(jìn)行區(qū)別開來,把GameOverTxt重命名為VRGameOvertxt。
?
在VRGameOverCanvas組件中,把渲染模式改為World Space。
在Rect Transform組件中,把位置改為(-2.24,1.1,0.07),然后進(jìn)行90度Y Rotation
?
最后,把X和Y Scale改為0.009,當(dāng)所有一切完成的時候,VRGameOverCanvas看起來因該是這樣的:
你可以在Game View視角下看到兩個canvas是大致重疊的(當(dāng)游戲不運(yùn)行的時候):
?
這些值是哪里來的呢?坦白地說,我其實(shí)是調(diào)整到自己通過Cardboard攝像頭看起來比較不錯為止。有時候,編程更多的是一門藝術(shù)而不是學(xué)科。
支持兩個Canvase
接下來,你需要更改GameController.cs,這樣它才會發(fā)現(xiàn)兩個Canvas打開和GameLogic GameObject腳本,它也是和GameLogic GameObject聯(lián)系在一起的。把以下的兩個公共變量加入到你的class里:
在resetGame()的開始加入如下代碼:
?
用以下代碼取代Gameover():
?
這個展示了正確的Canvas和Text對象,取決于你是否在VR模式(開啟Cardboard.SDK.VRMode).
?
在你保存了腳本之后,你需要把正確的對象分配到新的公用變量。在Inspector里找到GameController,點(diǎn)擊每個新變量旁邊的目標(biāo),然后選擇VRGameOverCanvas對象作為你的VR游戲Over Over Canvas變量,把VRGameOverTxt對象選為你的VR Game Over Txt變量。
需要注意的是,可能你會奇怪,為什么是很麻煩地支持兩個Canvas而不是至改變現(xiàn)有的一個呢?原因是,你既需要支持上帝視角,還需要支持VR模式,所以一定要進(jìn)行優(yōu)化。
如果你準(zhǔn)備現(xiàn)在就運(yùn)行游戲,就可以發(fā)現(xiàn)VR模式里的游戲結(jié)束界面展示的很自然。你可以上下看界面的不同部分,現(xiàn)在所有缺少的東西就是再來一次的按鈕。
?
增加Gaze輸入方式
幸運(yùn)的是,Unity內(nèi)置了‘在使用world-space GUI Canvas的時候,攝像頭中心點(diǎn)可以作為鼠標(biāo)使用’,但你需要提供額外的腳本才能使它在VR界面中進(jìn)行使用。
?
首先,擴(kuò)展Cardboard Main\Head,找到主攝像頭并把它重命名為VR Main Camera。選中VRGameOverCanvas對象,你們應(yīng)該可以看到一個事件攝像頭,點(diǎn)擊Hierarchy里的EventSystem項(xiàng)目,點(diǎn)擊增加組件按鈕,并增加GazeInpute Module腳本。這個腳本可以確保Unity的GUI系統(tǒng)了解Cardboard攝像頭的工作方式。
檢查VR Mode Only,因?yàn)樵赩R模式下的時候,只需要這么運(yùn)行就可以了。最后,點(diǎn)擊你剛剛增加的Gaze Input Module Component,然后選擇Move Up,重復(fù)一次,確保它可以出現(xiàn)在觸屏輸入和獨(dú)立輸入模式中,這可以確保Gaze Input Module在游戲進(jìn)行的同時優(yōu)先選擇輸入方式。當(dāng)所有都做好的時候,它看起來應(yīng)該是這樣的:
?
現(xiàn)在,你就可以進(jìn)行嘗試了。這一次,當(dāng)你把視角放到Play Again按鈕的時候,它就會變綠,讓你重新開始一場新的游戲。
?
玩法微調(diào)
或許你會發(fā)現(xiàn)這個版本的游戲在VR模式下玩起來有點(diǎn)難,這是因?yàn)槟愕囊暯鞘强s水的,所以在你看著錯誤的方向時,敵人很容易從你身邊溜過去。而且,你無法迅速改變瞄準(zhǔn)方向,你會因?yàn)椴弊愚D(zhuǎn)速的限制而影響到游戲操作。你讓玩家體驗(yàn)VR模式并不是為了懲罰他們,所以,你該如何調(diào)整呢?當(dāng)然,可能會有人建議把敵人速度降低。
在Prefabs文件夾中選中EvilSlimeEnemy Prefab,然后打開EnemyMover.cs,把以下代碼增加到Start(),隨后設(shè)置速度:
這會讓你的游戲在VR模式下變得更簡單,所以玩家們不至于因?yàn)檫x擇了VR模式就獲得糟糕體驗(yàn)。
解決屏幕上的分?jǐn)?shù)顯示問題
你還需要解決的一個UI問題是屏幕上的分?jǐn)?shù),這個就需要不同的方式來處理了。雖然它仍然需要在VR模式中恰當(dāng)?shù)谋伙@示出來,但你更希望它在你看任何方向的時候都固定在攝像頭上。
選中Cardboard Main\Head,右擊并選擇UI\Canvas,重命名新的canvas為VRScoreCanvas,把渲染模式調(diào)整為World Space,為其賦予以下值:
位置(0,1,2.5)、寬度400、高度100、旋轉(zhuǎn)(0,0,0)、Scale(0.0115,0.0115,1)。當(dāng)完成之后,游戲看起來該是這樣的:
?
看起來可能你的文本很奇怪地放在了屏幕中央,但在VR模式里,你能夠看到的世界比正常情況下是少很多的,所以你在游戲中看到分?jǐn)?shù)的時候應(yīng)該是在邊緣部位的,你可以自由進(jìn)行位置調(diào)整,以使其適應(yīng)你的手機(jī)。
接下來,使用文本對象展示你的分?jǐn)?shù),這個過程和Game Over的做法類似。
打開GameController.cs并增加一個新的公用變量:
?
接下來,你每次更新scoreTxt的時候都需要更新VRScoreTxt,在ResetGame() method中,把以下代碼加在每次更新后的scoreTxt之后:
?
然后把這行代碼增加到GotOne(),也放在更新scoreTxt的后面:
?
保存你的腳本,回到Unity,然后你會發(fā)現(xiàn)GameLogic當(dāng)中的GameController Component如今可以輸入VR Score Txt變量了,點(diǎn)擊臨近的目標(biāo)然后選擇你的VRScoreTxt文本對象。
?
再次體驗(yàn)?zāi)愕挠螒?#xff0c;現(xiàn)在,你就可以看到分?jǐn)?shù)出現(xiàn)在左上角了,還可以允許你的頭部進(jìn)行運(yùn)動。
VR模式的切換
由于你的游戲同時支持上帝視角和VR模式,你應(yīng)該給用戶自由切換的選擇,UI做起來是很直觀的,你只需要在上帝視角模式中加入一個簡單的按鈕,讓玩家們來回切換模式即可。
首先,你需要增加切換的代碼,選擇Hierarchy里的GameLogic,點(diǎn)擊增加組件,選擇新腳本(New Script)然后把腳本命名為CardboardSwapper。
打開并用以下內(nèi)容替換class代碼:
?
這個class里最重要的method就是ActiveVRMode,它是用來激活Cardboard的VR模式的。其余的logic負(fù)責(zé)控制場景中的多個GameObject,取決于是否處于VR模式,你在上帝視角是看不到某些東西的。
你還可以發(fā)現(xiàn)的是,當(dāng)你偵測后面按鈕的時候調(diào)用了Switch(),這個功能非常適合測試。
你還需要為GameController腳本增加更多的logic,這樣它才能在切換模式的時候展示或者隱藏一些東西,打開GameController.cs,把這個method加進(jìn)去:
?
保存一切然后重新回到Unity界面,選擇GameLogic然后向下滾動到Cardboard Swapper組件,對于Cardboard Object數(shù)列,把它的大小賦值為1,然后放到場景中的CardboardMain GameObject中。這樣不僅可以禁用你的Cardboard Head讓你回到上帝視角攝像頭模式,還可以禁用VRScoreCanvas。
對于Mono Object數(shù)列,把它的大小賦值為3,然后為你的場景選擇Canvas、Main Camera和raccoon ninja,不要從Assets里選擇。
最后你需要在上帝視角canvas為用戶增加一個按鈕,為了節(jié)約時間,我已經(jīng)把它做好了,位于prefabs文件夾中。
從Assets\Prefabs中把CardboardButton推拽到Hierarchy,這樣它就成為了你的Canvas對象的子對象,確保其位置設(shè)定是(-50,50,0):
在你的按鈕對象底部,把它們連接起來,這樣點(diǎn)擊按鈕的時候就可以調(diào)用CardboardSwapper.Switch() method,你可以從這個動畫看看是如何做出來的:
?
再次嘗試你的游戲,點(diǎn)擊屏幕右下方的按鈕切換至VR模式,然后單機(jī)Cardboard界面背后的按鈕切換到上帝視角模式。做到這里,你的VR模式切換就已經(jīng)完成了。
?
現(xiàn)在,你可以把Unity中的任何3D游戲做成VR游戲了,而且只需要一個Cardboard和一些塑料鏡片,這是可以讓所有人都能夠體驗(yàn)的VR游戲。Android版本的做法和iOS大致相同,谷歌的Unity Developer指南還提供了更多的技術(shù)信息。最后,你甚至可以為你的VR游戲增加AR功能。
最后,你可以嘗試Unity里所有的3D游戲,看是否能夠順利地做成VR體驗(yàn),或者,這個教程也可以讓你做出全新的VR游戲。
總結(jié)
以上是生活随笔為你收集整理的如何用Unity和Cardboard做一款VR游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity自定义角色控制器(一):碰撞检
- 下一篇: 从技术角度谈游戏国际化的一些建议:版本管