咸魚的VR教程(一)-怎么在Unity考慮多平臺(tái)VR開發(fā)?

一、前言
????這篇文章是我搞各種VRDemo移植總結(jié)下來的經(jīng)驗(yàn),只能作為理論上的參考。如果你只是想快速開發(fā)VR項(xiàng)目,我還是會(huì)推薦VRTK(雖然沒有用過)。畢竟Unity的多個(gè)VR SDK的整合,本身就是一個(gè)很大的工作量,一時(shí)半會(huì)還真解釋不清。如果你有意向從頭開始開發(fā)多平臺(tái)VR項(xiàng)目,還是可以在這里參考到一些概念。
????本篇會(huì)刻意忽略不同設(shè)備跟蹤方案、性能和價(jià)格等的比較。雖說是一個(gè)科普性質(zhì)的開發(fā)分享,但也不能變成發(fā)燒友的VR設(shè)備導(dǎo)購(gòu)吧。主要是一方面我沒太多精力花在設(shè)備評(píng)測(cè),一方面讀者也沒必要消化那么多設(shè)備參數(shù)。雖說VR設(shè)備和我剛工作的時(shí)候相比,價(jià)格已經(jīng)很親民了。但要把市面上所有主流的VR設(shè)備買下來,已經(jīng)是一大筆開銷。因?yàn)槊總€(gè)人的錢包有限,還是自己選一個(gè)VR設(shè)備做主力吧。
二、VR開發(fā)的概念
????這里先讓我提出一個(gè)不負(fù)責(zé)任的說法:VR的交互實(shí)質(zhì)上是體感2.0。只要了解你開發(fā)的平臺(tái)的設(shè)備特性及開發(fā)套路,應(yīng)該沒什么東西可以阻止你的想法。
1.通用套路
????這里列舉三個(gè)我覺得VR SDK最重要的三個(gè)功能:
Tracking(跟蹤):設(shè)備的跟蹤,分為3Dof(旋轉(zhuǎn))、6Dof(旋轉(zhuǎn)+位移);
Rendering(渲染):引擎將游戲渲染成左右分離的畫面,然后顯示在頭顯上;
Input(輸入):這里局限于輸入設(shè)備的搖桿、按鍵、觸摸板等輸入;
????然后我們看看在Unity引擎里面,這些功能對(duì)應(yīng)什么要素:
Tracking→Transform;
Rendering→Camera;
Input→UnityEngine.Input、InputAction、或VR SDK的輸入接口;
????我們?cè)倩氐絍R設(shè)備這個(gè)層次,你會(huì)發(fā)現(xiàn)一切都那么簡(jiǎn)單:
Headset(頭顯)=Tracking+Rendering;
Controller(控制器)=Tracking+Input;
????再再回到VR設(shè)備的使用場(chǎng)景,這里有三種常見類型:
坐下體驗(yàn)的VR:一般是坐在沙發(fā)上,主要交互區(qū)域是前方180度的半圓柱體;
站立體驗(yàn)的VR:由于是站立,轉(zhuǎn)向比坐下更靈活??山换サ膮^(qū)域變成圓柱體,但不推薦大范圍走動(dòng);
房間體驗(yàn)的VR:最自由也最容易出事的VR體驗(yàn)方式??山换サ膮^(qū)域取決于你屋子大小,同時(shí)會(huì)要求玩家設(shè)定一個(gè)游玩區(qū)域;
????而且現(xiàn)在Unity的VR SDK支持度,我覺得可以分成三個(gè)級(jí)別,這個(gè)會(huì)直接決定你的開發(fā)難度:
黑人問號(hào)的SDK:除了能正常點(diǎn)亮VR設(shè)備外,實(shí)際開發(fā)起來十分難用,有各種奇怪接口和Bug。這個(gè)現(xiàn)象在小廠比較多,主要是因?yàn)樨?fù)責(zé)Unity開發(fā)的技術(shù)力不夠;
中規(guī)中矩的SDK:和主流VR SDK的思路類似,做平臺(tái)移植也方便。將來可以和Unity官方整合,或是走LWRP+InputSystem;
官方整合的SDK:經(jīng)過幾次磨合,大廠的VR SDK算是完全整合到Unity引擎中。你可以下載廠家SDK作為擴(kuò)展庫(kù)和工具庫(kù),或直接用Unity的VR功能做開發(fā)。
????現(xiàn)在你已經(jīng)了解VR SDK的各種基本套路,接下來讓我們簡(jiǎn)單地介紹兩個(gè)主流VR設(shè)備類型的特性。
2.低端VR設(shè)備
????代表設(shè)備:Daydream、GearVR、Vive Focus、Oculus Go等;
????開發(fā)關(guān)鍵詞:3Dof的Headset+3Dof的Controller*1,需要Recenter,適合坐下體驗(yàn),輕量級(jí)VR體驗(yàn);
????這里會(huì)把淘寶賣的VR盒子忽略掉,畢竟那些華強(qiáng)北性質(zhì)的產(chǎn)品,都是“云”VR討論的貶低論據(jù)。這類產(chǎn)品的重心,老早已經(jīng)從手機(jī)盒子轉(zhuǎn)移到低端一體機(jī)了。但通常會(huì)配備一個(gè)3Dof小手柄,滿足基本VR交互需求。
????其實(shí)這個(gè)小手柄最早是出現(xiàn)在谷歌Daydream Viewer中,解決了低端VR設(shè)備沒有實(shí)用輸入的尷尬。作為當(dāng)時(shí)的王者,GearVR采用側(cè)邊觸摸板,也支持游戲手柄輸入,但是實(shí)際體驗(yàn)都不好。我個(gè)人感覺當(dāng)時(shí)的谷歌有一點(diǎn)點(diǎn)任天堂的味道,不光是硬件上,連軟件上也是。小手柄搭配GoogleVR SDK的ArmModel,可以由旋轉(zhuǎn)數(shù)據(jù)模擬出位移數(shù)據(jù)。谷歌后面推出DaydreamLabsControllerPlayground、DaydreamElements和Media App Template等示例工程,我感覺低端VR設(shè)備的交互開發(fā),一下子上升到一個(gè)高度。

????像這類低端VR設(shè)備,除了屏幕顯示質(zhì)量,有可能會(huì)超過上一代的PC VR頭顯,但設(shè)備跟蹤被閹割成3Dof。而且本身安卓高通芯片還是沒法和高端PC硬件比,能跑的VR內(nèi)容的效果也很有限。主要是原本的市場(chǎng)定位,就是輕量型VR體驗(yàn)的閹割版產(chǎn)品。但消費(fèi)者貌似都不買賬,都希望有一個(gè)完整版體驗(yàn)的廉價(jià)產(chǎn)品。看看有多少低端VR一體機(jī)的用戶,額外買了Nolo設(shè)備,然后去串流玩SteamVR。其實(shí)花的錢已經(jīng)夠買一個(gè)WMR頭顯設(shè)備了,又何必為難自己呢?
3.高端VR設(shè)備
????代表設(shè)備:PSVR、Oculus CV1/S/Quest、WMR、VIVE、Valve Index等
????開發(fā)關(guān)鍵詞:6Dof的Headset+6Dof的Controller*2(可無限擴(kuò)充外設(shè)),需要設(shè)置PlayArea,重度VR體驗(yàn);
????這個(gè)是VR的主戰(zhàn)場(chǎng),不同設(shè)備在控制器形態(tài)上的差異性也大。如果拿幾個(gè)具有代表性的VR手柄,按照棍狀到手型排列,大致為:PSVR的按摩棒、Vive手柄、WMR手柄、Oculus的Touch、Valve Index的Knuckles。目前雙持手柄已經(jīng)是標(biāo)配了,但你是在SteamVR平臺(tái)的話,可外接的設(shè)備就是五花八門,比如你在VRChat能見到全身動(dòng)捕的玩家。
????游玩區(qū)域,或者叫護(hù)欄系統(tǒng),是設(shè)備提醒用戶超出合適范圍,有誤撞的風(fēng)險(xiǎn)(實(shí)際上該被絆倒還是會(huì)被絆倒,一拳砸壞顯示器也是存在的)。貌似Unity也沒有很好的統(tǒng)一API方案,也只能照用廠家的SDK工具庫(kù)。
????由于我不是家里有礦,所以沒法折騰這么多設(shè)備。而且工作接觸比較多的是低中端設(shè)備,各種SDK對(duì)Unity支持度也不同。但由于是工作,也只能硬著頭皮做開發(fā)或移植。其實(shí)專心做一個(gè)VR平臺(tái)的游戲,先打打預(yù)防針,不要過度依賴廠家的SDK,后面移植還是會(huì)很快的。目前看來,SteamVR還是首選的高端VR平臺(tái)。畢竟一個(gè)平臺(tái)幾乎所有設(shè)備都通吃,也省了開發(fā)者做移植的功夫。而低端VR設(shè)備之間的移植,如果是Unity內(nèi)部集成的平臺(tái),已經(jīng)是在設(shè)置上切換平臺(tái)就完事了。畢竟是9102年,大部分大廠的設(shè)備都差不多在Unity集成了,快沒有“導(dǎo)入SDK”這個(gè)概念,所以小廠還是好自為之。
三、Unity將來的VR開發(fā)預(yù)覽
????我覺得Unity的InputSystem推出正式版后,基本可以告別SDK之戰(zhàn)了。之前已經(jīng)看到InputSystem的UGUI支持,而VRTK也只是民間第三方支持,以后更多的教程還是會(huì)按照官方的套路來。但不管如何,你的Unity開發(fā)的VR入口,還是會(huì)從一個(gè)名為“VRCameraRig”預(yù)設(shè)體開始。
????由于我最早接觸和Unity最早內(nèi)部整合的VR SDK都是Oculus的,所以VRCameraRig會(huì)以O(shè)culus VR SDK為參考。之前也說過Tracking是VR SDK的重要套路之一,所有可跟蹤的設(shè)備,會(huì)放在VRCameraRig的TrackingSpace下面。需要調(diào)用Unity VR的接口去更新對(duì)應(yīng)的Transform的localPosition和localRotation。

????CenterEyeAnchor對(duì)應(yīng)著頭顯,一般Unity VR會(huì)幫你自動(dòng)更新Camera的Transform,而Camera的很多參數(shù)都會(huì)由Unity VR決定。如果你希望由兩個(gè)Camera代表左右眼,則刪除CenterEyeAnchor,新建兩個(gè)帶Camera的GameObject:LeftEyeAnchor,RightEyeAnchor,然后修改Camera的Target Eye。

????這邊使用InputSystem的TrackedPoseDriver控制LeftHandAnchor和RightHandAnchor的位移和旋轉(zhuǎn)。


????實(shí)際開發(fā)中,會(huì)需要手柄可視化顯示(ControllerVisual),還有在手柄上附著一些道具。由于不同手柄的坐標(biāo)原點(diǎn)不同,所以需要腳本去更新道具容器(Hand)的位移和旋轉(zhuǎn)。而PlayAreaVisual用于顯示游玩區(qū)域。

????然后你可以用Prefab Variant功能去擴(kuò)展你的VRCameraRig,使用代碼在不同VR 平臺(tái)創(chuàng)建不同的VRCameraRig。而輸入使用InputSystem的InputAction,然后UGUI使用官方的VR支持。
四、Unity保守的VR開發(fā)方式
????你可以使用VRTK開發(fā),但是按照目前的趨勢(shì),VRTK會(huì)變成VR入門開發(fā)者的模板庫(kù)。你需要更多功能去實(shí)現(xiàn)更多想法時(shí),會(huì)逐漸擺脫VRTK的框架。由于大部分大廠的VR設(shè)備已經(jīng)集成到Unity,上面的開發(fā)預(yù)覽都能實(shí)現(xiàn),唯一讓人不快的是UnityEngine.Input這個(gè)小老弟。
????如果不想那么快用上InputSystem,我可以推薦你去參考Google的BaseActionTrigger。其實(shí)實(shí)現(xiàn)的思路也很簡(jiǎn)單,繼承MonoBehaviour的BaseActionTrigger只有一個(gè)返回Bool值的TriggerActive函數(shù),用于判斷是否觸發(fā)。然后你邏輯腳本引用BaseActionTrigger,并在Update檢測(cè)BaseActionTrigger.TriggerActive()。而不同輸入邏輯通過繼承BaseActionTrigger的子類去實(shí)現(xiàn)。
????之所以這么吹Google的VR SDK,是因?yàn)榘袵oogleVR的例子移植到其他平臺(tái)特別舒服,基本就是按照里面輸入框架來。當(dāng)你還在一個(gè)一個(gè)的腳本中修改輸入函數(shù)時(shí),我已經(jīng)通過自定義的ControllerProvider去覆蓋輸入,而且直接白嫖GoogleVR的滿血版UGUI的VR交互。
????吹歸吹,但Google已經(jīng)停止維護(hù)一些VR例子。一方面可能是大家都知道怎么開發(fā)VR交互了,一方面可能是整體VR開發(fā)熱情開始疲軟。其實(shí)考慮多平臺(tái)開發(fā),本身就是有點(diǎn)瞎操心的味道。但是一旦開始移植,代碼火葬場(chǎng)。
五、說點(diǎn)其他的吧
????其實(shí)每個(gè)人都有小白的時(shí)候,我覺得你能熟悉查閱API文檔后,你已經(jīng)就是入門了。但我開發(fā)一些VR和AR后,發(fā)現(xiàn)API文檔完全不夠,甚至有些大廠的開發(fā)者網(wǎng)站還有交互設(shè)計(jì)文檔。我之所以說VR交互是體感2.0,就是因?yàn)楫?dāng)年任天堂Wii開創(chuàng)的體感1.0時(shí)代,不少設(shè)計(jì)思路到現(xiàn)在VR開發(fā)也適用。想當(dāng)年跟別人討論怎么檢測(cè)丟東西這個(gè)動(dòng)作,各種記錄運(yùn)動(dòng)軌跡blabla,而Google的例子直接檢測(cè)一個(gè)陀螺儀數(shù)據(jù)完事,這就是你和別人的差距。
????除了設(shè)計(jì)和編程外,多平臺(tái)VR開發(fā)最大問題就是平臺(tái)性能問題。想當(dāng)年還有做手游的開發(fā)者跟我說移動(dòng)VR只需要20~30幀而已,實(shí)際上這個(gè)說法也是個(gè)笑話。雖說要達(dá)到官方的理論參數(shù),本身就是困難的事。但不管是什么類型的開發(fā),優(yōu)化依舊是重中之重,還是且行且思吧。不過當(dāng)年的HoloLens就已經(jīng)支持PC串流,而且各種VR一體機(jī)串流和VR無線套件,也算是不錯(cuò)的嘗試。而且隨著5G和云游戲的興起,以后VR開發(fā)不會(huì)再拿性能說事了吧?
????不過,最近寫的東西有點(diǎn)多,感覺有點(diǎn)只寫不干事了。主要最近有很多要忙的事情,所以還是等有空再做做VR小游戲,再分享開發(fā)經(jīng)驗(yàn),溜了溜了。