Unity AR/VR研發(fā)最佳實踐:如何避免為不同設(shè)備構(gòu)建內(nèi)容的痛苦

映維
映維
很高興看到各種全新VR/AR技術(shù),設(shè)備,工具包和平臺的不斷涌現(xiàn)。但對于開發(fā)者來說,這種變化將成為軟件,功能和業(yè)務(wù)優(yōu)先級的噩夢。 Unity開發(fā)者是如何處理這樣豐富,多樣化,不斷變化的眾多功能和服務(wù),并與此同時...

很高興看到各種全新VR/AR技術(shù),設(shè)備,工具包和平臺的不斷涌現(xiàn)。但對于開發(fā)者來說,這種變化將成為軟件,功能和業(yè)務(wù)優(yōu)先級的噩夢。

Unity開發(fā)者是如何處理這樣豐富,多樣化,不斷變化的眾多功能和服務(wù),并與此同時實現(xiàn)“創(chuàng)建一次,構(gòu)建多個”呢?在Unity選擇目標(biāo)平臺的能力往往不夠精細(xì)。Unity正在努力通過對XR播放器設(shè)置和API類的新興支持來解決其中一些問題。但不可避免的是,開發(fā)者需要使用更高級別的工具包來滿足他們在Unity項目中定位的實際設(shè)備。下圖說明了開發(fā)者在應(yīng)對多個SDK和高級工具包時所面臨的挑戰(zhàn),包括預(yù)制件,非常有用的腳本組件,著色器和示例場景等等。

在Parkerhill,我們已經(jīng)開發(fā)了許多VR和AR項目和演示作品,并且經(jīng)歷過使用不同SDK來為不同設(shè)備構(gòu)建體驗的痛苦。因此,我們提出了一套適合我們的最佳實踐。更好的是,我們已經(jīng)實施了一系列的Unity編輯器實用程序,并將其作為Parkerhill BridgeXR軟件包在Unity Asset Store中發(fā)布。

一。 五個建議

1。 為player rig使用附加場景

Unity項目自然劃分為不同的場景,可實施游戲的關(guān)卡。Unity同時允許你將場景加載到當(dāng)前主場景。附加場景是將場景模塊化地組織為單獨(dú)對象層的絕佳工具。

我們通常使用附加場景來加載包含camera組件,輸入設(shè)備和物理事件處理的設(shè)備特定player rig。例如,為了保持主場景獨(dú)立于設(shè)備,我們可能提供一個包含SteamVR player rig的附加場景,另一個包含Daydream player rig的附加場景。然后我們編寫一個場景管理器腳本,并根據(jù)實際的目標(biāo)設(shè)備添加相應(yīng)的player rig場景。

2。 為特定于SDK的預(yù)制件使用條件響應(yīng)對象

設(shè)備SDK包括你在場景中使用的預(yù)制對象。例子包括傳送艙,視頻播放器,環(huán)境繪圖工具,虛擬角色等等。另一個例子是,根據(jù)目標(biāo)設(shè)備的不同,你可能需要模型的低多邊形版本與高多邊形版本,因為設(shè)備和平臺之間的性能和質(zhì)量要求差別很大。你的項目可以根據(jù)目標(biāo)設(shè)備而選擇相應(yīng)版本的預(yù)制件,并在運(yùn)行時進(jìn)行實例化。

3。 應(yīng)用條件組件以實現(xiàn)特定于SDK的行為

設(shè)備SDK最顯著的特征之一是,存在可以添加到游戲?qū)ο笾械慕M件腳本以實現(xiàn)特定的行為。一個常見例子是可交互的,具有抓取和突出顯示的行為。遺憾的是,Unity不存在有條件地向?qū)ο筇砑咏M件的簡單方法。

一種解決方案是將可交互對象的單獨(dú)版本保存為預(yù)制件,然后使用上述條件對象技術(shù)來將正確的一個添加到場景之中。這樣你將維護(hù)同一對象的完全獨(dú)立版本(每個設(shè)備SDK一個),而如果你希望更改原始對象,維護(hù)問題就會出現(xiàn)。

Unity 2018的Variant prefab功能可以提供幫助,支持你定義從其他預(yù)制件asset派生的預(yù)制件asset。你可以將原始游戲?qū)ο笞鳛榛A(chǔ)預(yù)制件,然后使用添加的可交互組件來制作Variant,每個SDK一個Variant預(yù)制件。你仍然需要為每個目標(biāo)設(shè)備分別使用不同的Variant預(yù)制件,但至少如果基礎(chǔ)對象已被修改,改動將反映在每個Variant中。

在Parkerhill,我們實施了一個更好的解決方案:Refabs。從某種意義上說,Refabs是Variant Prefabs的反面。“refab”是可重復(fù)使用的組件集合(保存為預(yù)制件),可應(yīng)用于任何游戲?qū)ο蟆K鼈冊试S你將行為與對象分開,將其作為一個或多個組件的一組,并用作游戲?qū)ο竽0宓慕M件。

Refabs的工作方式如下:將組件添加到空白游戲?qū)ο螅⑵淞泶鏋轭A(yù)制件??梢允褂肦efab Loader組件將這組組件添加到任何游戲?qū)ο笾小H缓?,場景中的對象將只有一個Refab Loader指向要使用的refab。同樣可復(fù)用的組件集同樣可以添加到其他游戲?qū)ο笾小?/p>

4。 將特定于設(shè)備的輸入事件映射到應(yīng)用程序語義事件

除了player rig,預(yù)制件和對象組件之外,你還應(yīng)該分離應(yīng)用程序與設(shè)備相關(guān)的輸入事件。對于基于畫布的UI輸入(如按鈕),請嘗試使用Unity的標(biāo)準(zhǔn)Event System。

對于更一般的對象交互(如抓取,使用和投擲),特定于設(shè)備的SDK可以直接管理用戶的雙手或輸入控制器,光線投射和觸覺反饋。

要將應(yīng)用程序與SDK分離,請不要在應(yīng)用程序中使用特定于工具包的事件。你應(yīng)該將特定于工具包的事件映射到應(yīng)用程序語義事件。語義事件是在應(yīng)用程序情景中具有意義的事件。例如,你的應(yīng)用程序可能只需要知道“這個對象已被抓取”,而不是響應(yīng)“左手扳機(jī)鍵按鈕已被按下”。

5。 排除SDK文件夾以避免編譯器和生成沖突

當(dāng)你為一個特定平臺構(gòu)建導(dǎo)入多個SDK的項目時,由于插件庫之間的沖突,你可能會遇到編輯器或生成錯誤。你需要刪除未使用的違規(guī)文件夾。解決方法是重命名帶波形符的文件夾(“FolderName~”),這樣Unity就會忽略它。

二。 Parkerhill BridgeXR工具包

通過分離應(yīng)用程序與任何一個特定SDK,上述五條建議在令應(yīng)用程序獨(dú)立于設(shè)備方面可以提供巨大的幫助。這涉及一定的工作,但可以手動完成。幸運(yùn)的是,Parkerhill提供了一個幫助你管理的工具。

用于Unity的Parkerhill BridgeXR插件包含一組編輯器內(nèi)實用程序,支持上面列出的五種最佳實踐,如下所示:

Scene Bridg:根據(jù)當(dāng)前活動設(shè)備標(biāo)識符(Bridge ID),有選擇地將附加場景加載到當(dāng)前場景。適用于要包含在場景中的player rig和其他特定于設(shè)備的對象層。

Prefab Bridge:根據(jù)當(dāng)前活動的Bridge ID,有選擇地在場景中的生成點實例化Game Object預(yù)制件。當(dāng)你為不同設(shè)備使用相似但不同的預(yù)制件時使用它,如傳送點和視頻播放器等等。

Component Bridge?:當(dāng)你為每個目標(biāo)設(shè)備使用定義復(fù)雜行為的不同組件集時,使用Component Bridge。它可以根據(jù)當(dāng)前活動的Bridge ID并有選擇地將一個或多個Unity組件添加到游戲?qū)ο蟆omponent Bridge基于Parkerhill Refab實用程序,是使用特定于SDK的組件來實施常見行為的強(qiáng)大工具。

Input Event Mapping:使用BridgeXR的事件發(fā)送器組件和接收方組件來將核心應(yīng)用程序映射至特定于應(yīng)用程序的語義事件,從而分離核心應(yīng)用程序和特定于設(shè)備的SDK輸入事件。

Folder Exclusions:編輯器內(nèi)工具,可支持你在定位一臺或另一臺設(shè)備時排除特定文件夾。

每個實用程序都有自己的優(yōu)點。當(dāng)結(jié)合起來時,它們提供了一種在Unity項目中構(gòu)建獨(dú)立于設(shè)備層的方法。BridgeXR可幫助你在單個項目中管理多個SDK,沒有版本控制或其他不令人滿意的任務(wù)。

無論是自行操作,還是借助Parkerhill BridgeXR這樣的Unity實用程序,上述技巧可以幫助你繼續(xù)使用自己熟悉和信任的高級工具包,利用來自優(yōu)秀VR和AR供應(yīng)商的軟件,并避免可能影響你開發(fā)的大部分VR和AR工具包SDK碎片化情形。

THEEND

最新評論(評論僅代表用戶觀點)

更多
暫無評論