如今,各種新型虛擬現(xiàn)實(shí)VR和增強(qiáng)現(xiàn)實(shí)AR的技術(shù)、設(shè)備、工具包和平臺(tái)不斷涌現(xiàn)。但對(duì)于開發(fā)人員而言,這樣的變化會(huì)在處理軟件、功能和業(yè)務(wù)優(yōu)先級(jí)時(shí)產(chǎn)生負(fù)擔(dān)。Unity開發(fā)人員在處理豐富多樣,不斷變化的大量功能和服務(wù),同時(shí)應(yīng)該如何實(shí)現(xiàn)“一次開發(fā),多次構(gòu)建”呢?
本文是沉浸式媒體開發(fā)公司Parkerhill Reality Labs的白皮書《Best Practices for Multi-Device VR/AR Development》的簡略版本,將分享5個(gè)Unity VR/AR項(xiàng)目多設(shè)備優(yōu)化技巧和工具。
項(xiàng)目難題
Unity中選擇目標(biāo)平臺(tái)的功能往往不夠精細(xì),Unity正努力通過為XR播放器設(shè)置和API類提供更多支持來解決該問題。但不可避免的是,開發(fā)人員需要使用一些更高級(jí)別的工具包來處理他們?cè)赨nity項(xiàng)目中指向的實(shí)際設(shè)備。
下圖說明了開發(fā)人員在選取多個(gè)SDK和高級(jí)工具包時(shí)所面臨的難題,這類工具包中包含玩家綁定、預(yù)制件、實(shí)用腳本組件、著色器和示例場(chǎng)景等內(nèi)容。
優(yōu)化工具
在Parkerhill Reality Labs,我們開發(fā)了許多VR和AR的項(xiàng)目和演示,體驗(yàn)過使用不同SDK對(duì)各種不同設(shè)備進(jìn)行構(gòu)建的痛苦。因此,我們總結(jié)出了一些最佳實(shí)踐技巧。而且,我們還實(shí)現(xiàn)了一系列Unity編輯器內(nèi)的實(shí)用工具,它們能方便地實(shí)現(xiàn)這些設(shè)計(jì)模式,我們把這些工具的資源包成為Parkerhill BridgeXR。
下載Parkerhill BridgeXR,請(qǐng)?jiān)L問Asset Store資源商店:
https://assetstore.unity.com/packages/tools/utilities/bridgexr-116811
優(yōu)化技巧
1、為玩家綁定使用附加場(chǎng)景
Unity項(xiàng)目通常分為多個(gè)場(chǎng)景,用于實(shí)現(xiàn)游戲關(guān)卡。Unity允許用戶在當(dāng)前主場(chǎng)景附加載入場(chǎng)景。附加場(chǎng)景能夠?qū)?chǎng)景模塊化地組織為單獨(dú)的對(duì)象層級(jí),它是一個(gè)優(yōu)秀的工具,。
我們通常使用附加場(chǎng)景來載入設(shè)備的特定玩家綁定,包含攝像機(jī)組件、輸入設(shè)備和物理事件控件。為了保持主場(chǎng)景獨(dú)立于設(shè)備,我們可能會(huì)同時(shí)使用帶有SteamVR玩家綁定的附加場(chǎng)景和帶有Daydream玩家綁定的附加場(chǎng)景。然后編寫場(chǎng)景管理器腳本,當(dāng)應(yīng)用啟動(dòng)時(shí),該腳本會(huì)根據(jù)實(shí)際目標(biāo)設(shè)備來添加對(duì)應(yīng)玩家綁定場(chǎng)景。
2、為SDK特定預(yù)制件使用條件對(duì)象
設(shè)備SDK包含預(yù)制件對(duì)象,可用于在場(chǎng)景中實(shí)現(xiàn)各種功能。示例包含:傳送艙、視頻播放器、環(huán)境繪圖工具和Avatar等。
另一個(gè)示例,根據(jù)目標(biāo)設(shè)備的不同特點(diǎn),你或許想要擁有同一模型的低多邊形和高多邊形版本,因?yàn)椴煌O(shè)備和平臺(tái)上的性能和質(zhì)量需求不同。項(xiàng)目可以根據(jù)目標(biāo)設(shè)備使用合適版本的預(yù)制件,預(yù)制件會(huì)在運(yùn)行時(shí)實(shí)例化。
3、使用條件組件來實(shí)現(xiàn)SDK特定行為
設(shè)備SDK最特別功能是為游戲?qū)ο筇砑咏M件腳本來實(shí)現(xiàn)特定行為。例如:通常可交互對(duì)象會(huì)有抓取和突出顯示的行為。然而在Unity中,根據(jù)條件給對(duì)象添加組件的功能沒有簡單的實(shí)現(xiàn)方法。
一種解決方法是將可交互對(duì)象的獨(dú)立版本保存為預(yù)制件,然后使用上文中的條件對(duì)象方法來給場(chǎng)景添加正確的預(yù)制件。該方法能夠完全保留同一對(duì)象的獨(dú)立版本,因?yàn)槊總€(gè)設(shè)備SDK有一個(gè)相應(yīng)的預(yù)制件。但是,如果你想修改原始對(duì)象則會(huì)帶來維護(hù)問題。
Unity 2018引入了全新的預(yù)制件變體(Variant Prefabs)功能,它允許你定義從其它預(yù)制件資源衍生的預(yù)制件資源。你可以將原始游戲?qū)ο笞鳛榛A(chǔ)預(yù)制件,然后添加可交互組件制作變體,每個(gè)SDK都有一個(gè)相應(yīng)預(yù)制件變體。最后你同樣會(huì)得到每個(gè)目標(biāo)設(shè)備相應(yīng)的預(yù)制件變體,但是不同的是,對(duì)基礎(chǔ)對(duì)象進(jìn)行的改動(dòng)也會(huì)影響變體。
我們實(shí)現(xiàn)了一個(gè)更好的解決方案,稱為Refab。 從某種意義上說,Refab與Variant Prefabs是相反的。Refab是一個(gè)可重用的組件集合,保存為預(yù)制件,可用于任何游戲?qū)ο?。它們?cè)试S你將行為和對(duì)象分開,作為一個(gè)或多個(gè)用作游戲?qū)ο竽0宓慕M件。
Refab的工作方式如下:添加組件到空白游戲?qū)ο笊?,將其保存為預(yù)制件。可以通過Refab Loader組件將這組組件添加到任何游戲?qū)ο笾?。然后,?chǎng)景中的對(duì)象會(huì)擁有Refab Loader組件來指向所使用的Refab,而不是SDK的特定組件。相同的可重用組件集也可以添加到其它游戲?qū)ο蟆?br />
下面是Refabs for Unity演示示例。
4、將設(shè)備特定輸入事件映射為應(yīng)用程序語義事件
除了玩家綁定、預(yù)制件和對(duì)象組件之外,你還應(yīng)該將應(yīng)用程序和設(shè)備特定輸入事件分離。對(duì)于基于畫布的UI輸入,例如按鈕,請(qǐng)嘗試使用Unity的標(biāo)準(zhǔn)事件系統(tǒng)。
對(duì)于常見的對(duì)象交互,例如:抓取或投擲,設(shè)備特定SDK會(huì)直接管理用戶手勢(shì)或輸入控制器、光線投射和觸覺反饋。
為了將應(yīng)用程序和SDK分離,請(qǐng)不要在應(yīng)用程序中使用工具包特定事件。你應(yīng)該將工具包特定事件映射為應(yīng)用程序語義事件。語義事件(Semantic Event)是在應(yīng)用程序上下文中有意義的事件。例如:你的應(yīng)用程序或許只知道“該對(duì)象已被抓取”的意思,但無法對(duì)“按下左手觸發(fā)器按鈕”做出反應(yīng)。
5、排除SDK文件夾以避免編譯器和版本沖突
當(dāng)構(gòu)建針對(duì)特定平臺(tái)導(dǎo)入了多個(gè)SDK的項(xiàng)目時(shí),你或許會(huì)遇到編輯器或版本錯(cuò)誤,這是因?yàn)椴寮熘写嬖跊_突。此時(shí)需要?jiǎng)h除未使用的沖突文件夾。還有一個(gè)解決方法是在名稱后加入波浪號(hào),例如:FolderName~,這樣Unity就會(huì)無視該文件夾。
BridgeXR
通過使用以上五個(gè)技巧,你可以將應(yīng)用程序從特定SDK中分離出來,使之獨(dú)立于設(shè)備。應(yīng)用這些技巧需要一些操作,但它們完全可以手動(dòng)完成。而且,你還可以使用BridgeXR工具包進(jìn)行更好的管理。
BridgeXR工具包包含一系列編輯器內(nèi)的實(shí)用工具,支持上文5個(gè)最佳實(shí)踐技巧,功能如下:
Scene Bridge?:可以根據(jù)當(dāng)前活動(dòng)的設(shè)備識(shí)別碼,即Bridge ID,便捷地為當(dāng)前場(chǎng)景選擇性加載附加場(chǎng)景。當(dāng)你將玩家綁定和其它設(shè)備特定對(duì)象層級(jí)加入場(chǎng)景時(shí),該工具可以發(fā)揮很大作用。
Prefab Bridge:該工具可以基于當(dāng)前活動(dòng)的Bridge ID,在場(chǎng)景出生點(diǎn)選擇性地實(shí)例化游戲?qū)ο箢A(yù)制件。當(dāng)你擁有外形相似但是用于不同設(shè)備的不同預(yù)制件時(shí),就可以使用該工具來處理,這類預(yù)制件包括傳送點(diǎn)、視頻播放器和細(xì)節(jié)層級(jí)對(duì)象。
Component Bridge?:當(dāng)你擁有根據(jù)目標(biāo)設(shè)備定義復(fù)雜行為的不同組件集時(shí),可以使用Component Bridge根據(jù)當(dāng)前活動(dòng)Bridge ID,選擇性地添加一個(gè)或多個(gè)Unity組件到游戲?qū)ο?。Component Bridges基于Refab實(shí)用功能開發(fā),它是個(gè)為SDK特定組件實(shí)現(xiàn)常見行為的強(qiáng)大工具。
Input Event Mapping:它可以通過使用BridgeXR的事件發(fā)送器和接收器組件,將事件映射為應(yīng)用程序特定語義事件,從而把核心應(yīng)用程序和設(shè)備特定SDK輸入事件分離。
Folder Exclusions:Folder Exclusions是一個(gè)編輯器內(nèi)的工具,能讓你在指向目標(biāo)設(shè)備進(jìn)行構(gòu)建時(shí),將特定文件夾從版本中排除。
在單獨(dú)使用時(shí),這些工具能發(fā)揮各自的作用。在結(jié)合使用時(shí),它們將提供方法為你的Unity項(xiàng)目構(gòu)建獨(dú)立于設(shè)備的層。BridgeXR將幫助你管理項(xiàng)目中的多個(gè)SDK,而且不用處理版本控制分支或其它任務(wù)。
小結(jié)
無論你是自己實(shí)現(xiàn)工具,還是使用BridgeXR這類實(shí)用工具,通過利用這些技巧,你可以繼續(xù)使用自己了解和信賴的高級(jí)工具包,利用VR和AR主流供應(yīng)商的優(yōu)秀軟件,并避免VR和AR工具SDK的分化對(duì)開發(fā)過程產(chǎn)生的影響。
關(guān)注微信公眾號(hào):VR陀螺(vrtuoluo),定時(shí)推送,VR/AR行業(yè)干貨分享、爆料揭秘、互動(dòng)精彩多。
投稿/爆料:tougao@youxituoluo.com
稿件/商務(wù)合作: 六六(微信 13138755620)
加入行業(yè)交流群:六六(微信 13138755620)