全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏
隨著Oculus宣布1月6日開啟預售,2016年很可能成為VR游戲元年,但很多的調研顯示,手游設備才是市場增長的關鍵,SuperData發布的報告顯示,2016年全球VR游戲市場規模預計在51億美元左右,消費者設備安裝量在3890萬左右,憑借價格門檻的優勢,以谷歌Cardboard和三星Gear VR為代表的移動VR設備很大可能成為用戶量最大的設備,可能占據2016年虛擬現實設備安裝量71%的份額,達到2700萬。
我們的老朋友Ray在自己的博客中展示了如何用Unity和Cardboard把一款3D游戲變成VR游戲的方法,他在文章最后還表示,你甚至可以用這種方法把游戲轉化為AR游戲,或者從頭開始做新的VR游戲。
很多的科幻電影都展示了用人類意志控制物體的能力,但到目前為止,這仍舊是一種幻想,目前還沒有技術可以實現這一點。在這份新手教學博客中,你可以學到如何用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.0以上;一部智能機,可以是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到貨,你仍然可以從本文中學到東西,只是,如果有合適的設備,你能夠學的東西更多。
游戲Demo:Ninja Attack
投入一些時間嘗試這個Demo,下載并解壓這個Unity新手項目。接下來就是運行Unity,在歡迎界面,選擇打開(Open)-找到StarterNinja文件夾,打開NinjaAttack項目。
項目瀏覽器(Project Browser)中,在Assets里雙擊MainScene按鈕,然后點擊Play嘗試一下這款游戲。在圖片中,你是左邊的忍者,隨著怪獸在屏幕中出現,你可以在屏幕上點擊任何地方釋放一個忍者之星消滅怪獸,在擊殺20個怪獸之后,你就贏了,但是,如果怪獸到達了左邊的紅色區域,你就輸了。
這款游戲看起來很熟悉是嗎?熟悉的讀者可能會發現,它其實就是我之前介紹SpriteKit以及Cocos2D教程用到的游戲,不過與之不同的是,這里的游戲是用3D渲染的。當然,你并不一定能夠真正地看到非常酷炫的3D效果,這款游戲使用的是上帝視角,所以對所有的polygon進行渲染總覺得浪費時間,所以,你現在可以發現為什么這款游戲非常適合做成VR了。
開始使用Cardboard
你需要做的第一件事就是為Unity下載Cardboard SDK。接下來,把它導入到你的項目中。從Unity的主菜單,選擇AssetsImport PackageCustom Package,然后選擇你剛剛下載的CardboardSDKForUnity.unitypackage。確保所有東西都被選中,反選Legacy文件夾,然后點擊Import按鈕。
為了讓你的游戲作為一個VR體驗,你需要用到一些技巧,在Project Browser中的CardboardPrefabs文件夾里,把CardboardMain Prefab拖拽到你的場景中,在Inspector中,給其賦予和你的忍者角色一樣的位置(5.53,1.13,0.122),并且要進行90度Y Rotation。
你會發現的是,它比忍者的中心部位略高,這樣可以展現出你在看他的眼睛。
接下來,選擇主攝像頭(Main Camera)并且在Inspector中反選,做raccoon忍者對象的時候也需要同樣的操作?,F在,把游戲在Unity編輯器中再次運行,你就會看到一些類似于3D場景的東西。如果你在移動鼠標的時候按住選擇鍵,你的攝像頭就會隨著頭部的運動進行旋轉。
在iOS設備上運行你的游戲場景
在Unity編輯器中運行你的游戲是非常不錯的,但最后一次檢查的時候,用VR頭盔配上電腦顯示器看起來會讓人很痛苦,所以我們需要適配到iPhone上。
選擇FileBuild 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攝像頭看起來比較不錯為止。有時候,編程更多的是一門藝術而不是學科。
支持兩個Canvase
接下來,你需要更改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 MainHead,找到主攝像頭并把它重命名為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 MainHead,右擊并選擇UICanvas,重命名新的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文件夾中。
從AssetsPrefabs中把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游戲。
總結
以上是生活随笔為你收集整理的全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gtx770功耗(GTX770)
- 下一篇: 使用pr把模糊视频变清晰的方法