Unity VR開發(fā)教程 OpenXR+XR Interaction Toolkit (一) 安裝和配置

文章目錄

??前言

?????????什么是 OpenXR

?????????什么是 XR Interaction Toolkit

??教程說明

??第一步:導(dǎo)入 OpenXR

??第二步:導(dǎo)入 XR Interaction Toolkit

?????????導(dǎo)入 Starter Assets

?????????添加 Preset

?????????設(shè)置 Preset Manager 的 Filter

??第三步:添加 XR Origin 和 XR Interaction Manager

??第四步:添加 Input Action Manager 腳本

??結(jié)語

??前言

OpenXR+XR Interaction Toolkit 是 Unity 當(dāng)前開發(fā) VR 的一套比較通用且方便的解決方案。

?什么是 OpenXR

近幾年 XR(VR/AR) 行業(yè)的發(fā)展非常迅速,制造 XR 設(shè)備的廠商層出不窮。在早期“群雄紛爭”的年代,不同的 XR 設(shè)備都維護(hù)著它們各自的 SDK,供開發(fā)人員制作出能在相應(yīng)設(shè)備上運(yùn)行的程序。但是尷尬的地方就在于,可能利用廠商 A 提供的 SDK 開發(fā)的程序無法兼容到廠商 B 的硬件設(shè)備上。不像如今已經(jīng)比較成熟的安卓移動端,只需用 Android SDK開發(fā)一款程序,就能兼容到不同的安卓手機(jī)上。??

因此開發(fā)者需要根據(jù)不同的 XR 設(shè)備廠商選擇不同的 SDK 進(jìn)行開發(fā),這對于在不同設(shè)備上移植同一套程序是非常麻煩的,也大大提高了學(xué)習(xí)成本,比如用 Oculus SDK 開發(fā)的 VR 程序雖然能在 Meta Quest 上運(yùn)行,但是如果想讓使用 HTC Vive 的人也能使用該程序,就要把原先程序里運(yùn)用 Oculus SDK 的部分替換成 HTC Vive 提供的 SDK,而市面上還有其他各種各樣的 XR 設(shè)備,如果想要使用不同設(shè)備的人都能體驗(yàn)到我開發(fā)的程序,那豈不是要為每一種設(shè)備開發(fā)一個特定的程序版本?這顯然是巨大的負(fù)擔(dān)。而開發(fā)者希望 XR 行業(yè)能有一套統(tǒng)一的標(biāo)準(zhǔn),只要編寫一次代碼,就能兼容所有的設(shè)備。這樣開發(fā)者只要專注于程序開發(fā)本身,而不用在意設(shè)備間的差異。

而 OpenXR 就是為了簡化 XR 開發(fā)而制定的一套標(biāo)準(zhǔn)。相當(dāng)于在編寫的 XR 應(yīng)用程序和不同的硬件設(shè)備間新增了一個中間層,向上提供一套統(tǒng)一的開發(fā) API,不同的開發(fā)引擎對該 API 進(jìn)行二次封裝,提供給 XR 應(yīng)用開發(fā)者時(shí)使用。而不同的設(shè)備廠商為硬件編寫支持 OpenXR 標(biāo)準(zhǔn)的接口,使得中間層能夠向下兼容對應(yīng)的硬件設(shè)備。如今,越來越多的 XR 設(shè)備開始支持 OpenXR 標(biāo)準(zhǔn),這意味著選用 OpenXR 進(jìn)行 XR 設(shè)備的開發(fā)可以成為一種通用的方案。

?什么是 XR Interaction Toolkit

XR Interaction Toolkit 是 Unity 官方提供的開發(fā) VR/AR 程序的框架,提供了移動、抓取、UI 交互等常用的功能,是游戲引擎提供給開發(fā)者的開發(fā)工具。

官方文檔:https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.1/manual/index.html(也許你在看到這篇文章的時(shí)候已經(jīng)推出了更高的版本,那么你可以在官網(wǎng)中選擇你正在使用的版本文檔)

??教程說明

本篇教程將會利用 OpenXR 和 XR Interaction Toolkit 2.1.1 搭建一個簡單的 VR 場景。最終實(shí)現(xiàn)的效果是開發(fā)者將 VR 頭顯和電腦進(jìn)行串流后,能通過頭顯看到 Unity 中的場景,并且頭部、手柄的位移和轉(zhuǎn)動也能準(zhǔn)確定位。

(注:本教程中的配置針對的是 PCVR 的開發(fā),也就是頭顯和電腦串流的形式。如果是開發(fā)一體機(jī)的安卓應(yīng)用,需要有其他的配置,但是這篇博客暫時(shí)不會介紹)

Unity 編輯器建議選用 2020 及以上的版本。雖然 XR Interaction Toolkit 2.1.1 支持 Unity 2019.4 及以上的版本,但是因?yàn)?2020 以其上的版本可以使用版本特有的 XR Plugin Management 更方便地管理 OpenXR,所以用 2020 及以上的版本配置起來更加簡單。而且 XR Interaction Toolkit 后續(xù)的版本可能也不支持 2019 的版本了。

我這次使用的是 Unity 2020.3.36,VR 頭顯使用的是 Oculus Quest 2。

另外值得提醒的是本篇博客有可能具有時(shí)效性,因?yàn)?XR 更新迭代的速度比較快,目前尚不清楚 XR Interaction Toolkit 的功能和用法在未來會不會有比較大的變化,如果有,未來有時(shí)間也會進(jìn)行教程的更新。不過目前來看,XR Interaction Toolkit 的版本大更新并不會太快,在我這幾個月的使用期間,僅僅是一些名字有小改動,核心的用法是幾乎不變的。

項(xiàng)目源碼(持續(xù)更新):https://github.com/YY-nb/Unity_XRInteractionToolkit_Tutorial2022/tree/master

??第一步:導(dǎo)入 OpenXR

首先創(chuàng)建一個3D項(xiàng)目,雖然創(chuàng)建項(xiàng)目時(shí)選擇 VR 模板會讓 Unity 自動幫我們配置好一些東西,但是本教程將演示從零開始配置的方法,因此使用最普通的 3D 模板。

打開項(xiàng)目后在菜單欄選擇 Edit -> Project Settings -> XR Plugin Management,然后點(diǎn)擊 Install XR Plugin Management

安裝完之后就是下面這個界面:

勾選 OpenXR,接下來會看到這個界面:

因?yàn)?Unity 中的 OpenXR 插件有用到新的輸入系統(tǒng) Input System,而創(chuàng)建項(xiàng)目時(shí)默認(rèn)用的是舊的輸入系統(tǒng),我們這里選擇"Yes”就能將輸入系統(tǒng)替換成 Input System。然后界面會有一些新的變化:

接下來我們點(diǎn)擊紅框標(biāo)注的這個“OpenXR”,會看到如下界面:

找到 Interaction Profiles,點(diǎn)擊“+”可以添加想要兼容的設(shè)備。因?yàn)槲沂怯?Oculus Quest 2 開發(fā),所以我選擇“Oculus Touch Controller Profile”

然后 Render Mode 的設(shè)置可以根據(jù)需求更改,我一般習(xí)慣把 Render Mode 中的 Single Pass Instanced 改為 Multi Pass。Multi Pass 會將場景渲染兩次,分別顯示在兩只眼睛中,這種渲染方式雖然性能會差一點(diǎn),但是具有高兼容性。想要了解這兩種渲染模式的細(xì)節(jié)可以參考這篇文章(需要具備一定的圖形學(xué)知識):VR MultiPass\SinglePass(Instanced)\MultiView 淺析和區(qū)分總結(jié)

??第二步:導(dǎo)入 XR Interaction Toolkit

打開 Unity 的 Window -> Package Manager,選擇 Unity Registry,搜索 XR Interaction Toolkit,點(diǎn)擊 Install

注:如果你是 Unity 2021 及以上的版本但是發(fā)現(xiàn) XR Interaction Toolkit 的版本不是最新的或者找不到這個包,可以試試點(diǎn)擊下圖所示的 “+” 號,選擇 Add Package by name,輸入 com.unity.xr.interaction.toolkit,即可導(dǎo)入。

不同的 Unity 版本可能導(dǎo)入 XR Interaction Toolkit 的方式會有點(diǎn)不一樣,具體可以參考官方文檔中的 Guides -> Installation(https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.1/manual/installation.html,在里面找到自己正在使用的版本)

如果導(dǎo)入的 XR Interaction Toolkit 是預(yù)覽版(后綴有 pre,一般是發(fā)布的最新版),需要在 Unity 編輯器中打開 Edit -> Project Settings -> Package Manager,然后將 Enable Pre-release Packages 勾選。

這樣 Package Manager 中才能顯示最新的預(yù)覽版(2023 年 1 月份已經(jīng)出到了 2.3.0 pre)

?導(dǎo)入 Starter Assets

然后導(dǎo)入 Samples 中 的 Starter Assets,這個包提供了 一些 Preset 和 Input System 中和 XR 有關(guān)的一些常用輸入動作。

導(dǎo)入后我們可以看一下 Project 工作區(qū),Assets 文件夾下多了幾個文件夾:

其中 XR 是導(dǎo)入 OpenXR 后生成的,XRI 是導(dǎo)入 XR Interaction Toolkit 后生成的,Samples 是導(dǎo)入 Starter Assets 后生成的。

?添加 Preset

然后我們打開下圖中的這個文件夾:

然后分別點(diǎn)擊下圖中紅框標(biāo)出的 Preset:

比如我現(xiàn)在點(diǎn)擊第一個,查看 Inspector窗口,然后點(diǎn)擊下圖中紅框標(biāo)出的這個按鈕。以后,在給一個 GameObject 添加 Continuous Move Provider(Action-based) 腳本后,腳本在 Inpector 面板的配置就會和這個 Preset 一樣。

比如我現(xiàn)在想要隨便給一個物體添加 Continuous Move Provider(Action-based) 腳本(這個腳本主要負(fù)責(zé)玩家持續(xù)移動,一般是利用手柄搖桿進(jìn)行移動),如果我沒有添加這個 Preset,那么腳本的面板配置是這樣的:

添加 Preset 之后,再重新添加這個腳本,面板顯示就會是這樣(和 Preset 設(shè)置的是一樣的):

按照 Starter Assets 中為我們準(zhǔn)備好的 Preset 配置,可以大大簡化我們后續(xù)的開發(fā)工作。因此,其他的 Preset 也是一樣,我們都可以點(diǎn)擊 Inspector 面板中的 Add 按鈕。

?設(shè)置 Preset Manager 的 Filter

接下來也是比較重要的一步,我們點(diǎn)擊 Edit -> Project Settings -> Preset Manager:

找到 ActionBasedController,在 Filter 中分別填寫 Right 和 Left,對應(yīng) Preset 中的 Right 和 Left Controller,如下圖所示:

Filter 的作用

Controller 一般指的是手柄,XR Interaction Toolkit 提供了 ActionBasedController 這個腳本用于跟蹤手柄的姿態(tài)和處理手柄的輸入動作。先看一下這個腳本在 Inspector 面板中長啥樣【實(shí)際上在面板中會顯示為 XR Controller (Action-based) 】:

先不管每一個 Action 具體是什么意思(后面的教程會具體介紹,感興趣的小伙伴也可以先看官方文檔的這一部分:https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.1/manual/xr-controller-action-based.html),目前我們需要知道的是這個腳本可以綁定配置好的動作,也就是添加這些 Input Action,那么配置的動作在什么地方呢?回到我們剛剛打開過的這個文件夾,打開下圖的這個 Asset:

可以看到這里面有很多準(zhǔn)備好的輸入設(shè)置,比如上圖中我現(xiàn)在選擇的這個 XRI LeftHand Interaction,也就是左手交互相關(guān)的動作。其中的 gripPressed,也就是左手柄 grip 鍵按下的這個按鍵操作代表了 Select 這個動作,然后我們將這個 Select 動作綁定到 XR Controller (Action-based) 的 Selection Action 中,左手柄就能檢測是否觸發(fā)了“Select”這個動作,也就是左手柄的 grip 鍵是否被按下,這個功能經(jīng)常用于 VR 中的抓取功能。

但是把動作一個個綁定到 XR Controller (Action-based) 中是比較麻煩的操作,不過別忘了左右手的 Controller 也有 Preset。

左:

右:

所以我們添加了 Preset 后,只要在 GameObject 上添加 XR Controller (Action-based) 腳本, Unity 會自動幫我們綁定好對應(yīng)的動作。但是現(xiàn)在還有一個問題:怎么知道綁定的是左手還是右手? 所以 Filter 的作用就體現(xiàn)出來了,它會根據(jù) GameObject 的名字來判斷是左手還是右手。如果名字里含有 "Left“ 就根據(jù) XRI Default Left Controller 這個 Preset 進(jìn)行設(shè)置;如果含有 “Right” 就根據(jù) XRI Default Right Controller 這個 Preset 進(jìn)行設(shè)置。

那么現(xiàn)在基礎(chǔ)的配置已經(jīng)弄好了,接下來就來搭建一個簡單的 VR 場景。

??第三步:添加 XR Origin 和 XR Interaction Manager

回到 Unity 的場景,首先把 Main Camera 刪掉。然后在 Hierarchy 面板中點(diǎn)擊鼠標(biāo)右鍵 -> XR ->XR Origin(VR)

于是場景中會出現(xiàn) XR Orgin 和 XR Interaction Manager

注:尚不清楚 XR Origin(VR) 這個名字在將來會不會更改,因?yàn)閮蓚€月前它還叫做 “XR Origin(Action-based)”,但是只要點(diǎn)擊 XR 下的選項(xiàng)后能在 Hierarchy 面板中創(chuàng)建出這兩個東西就行了

從上圖中可以看到 XR Origin 下的 Camera Offset 有三個子物體,分別是主相機(jī)(XR Origin 下已經(jīng)有了相機(jī),所以我們之前要把場景中默認(rèn)創(chuàng)建的主相機(jī)刪掉),左控制器,右控制器。主相機(jī)對應(yīng) VR 頭顯,左控制器對應(yīng)左手柄,右控制器對應(yīng)右手柄,因此 XR Origin 正好就現(xiàn)實(shí)中的設(shè)備在 VR 世界中的映射,代表了玩家自己。然后我們可以看下左右手的控制器,我這里以左控制器為例:

可以看到左控制器的 XR Controller(Action-based) 腳本預(yù)先綁定了左手的動作。這是因?yàn)槲覀冎疤砑恿俗笫挚刂破鞯?Preset,并且設(shè)置了 Filter。因?yàn)檫@個 GameObject 的名字里含有 Left,所以它能按照左手控制器的 Preset 來綁定動作。

此外,左控制器上還有其他腳本,這些腳本會在之后的教程中介紹。

如果左右手的控制器上的 XR controller(Action-based) 綁定的是正確方向的動作,說明之前的配置是成功的。

??第四步:添加 Input Action Manager 腳本

隨便在一個 GameObject 上添加 Input Action Manager 腳本。我這里選擇 XR Interaction Manager 這個物體,在 Inspector 面板中點(diǎn)擊 Add Component,添加 Input Action Manager 腳本:

然后點(diǎn)擊 Action Assets 下的 “+” 號,添加 XRI Default Input Actions:

然后在場景中添加一個 Plane,方便對照。到此,我們的場景就搭建完成了。然后我們將 VR 頭顯連上電腦,直接點(diǎn)擊 Unity 編輯器的運(yùn)行按鈕進(jìn)行測試(好像只有 Windows 系統(tǒng)可以):

可以看到此時(shí)已經(jīng)處在 VR 的視角當(dāng)中,隨著頭部的轉(zhuǎn)動,視野也會改變,說明頭部的追蹤是正常的。

因?yàn)榇藭r(shí)還沒有手柄的模型,所以手柄處是空的。但是這兩條紅色的射線是由手柄發(fā)出的,如果射線能跟隨手柄的位移和轉(zhuǎn)動而運(yùn)動,說明手柄的追蹤是正常的。

如果大家看到的效果和我一樣,那么就說明我們之前的配置是成功的!??

2023.1.15 更新:

此時(shí) XR Interaction Toolkit 已經(jīng)更新到了 2.3.0 pre 版本。如果你使用了這個版本并且按照我的教程進(jìn)行配置,需要檢查一下 XR Origin 下的 LeftHand Controller 和 RightHand Controller 的 Inspector 面板是長什么樣的。如果你之前將 Starter Assets 下的所有 Preset 都添加的話,Inspector 面板可能長這樣:

像上圖這樣 Input 下面全是空的,即沒有 Input Action 的引用。這時(shí)候運(yùn)行程序,會看到眼睛發(fā)出了射線,并且無法追蹤我們的手柄。這是因?yàn)橹疤砑拥乃?Preset 里含有用于眼動追蹤的 XRI Default Gaze Controller,XR Controller 腳本使用了這個配置。

如果大家遇到了這種情況,有這么幾種解決辦法:

方法一

回到 LeftHand Controller 和 RightHand Controller,找到 XR Controller(Action-based)腳本,點(diǎn)擊下圖中的這個 Preset 按鈕:

然后更換 Preset 就設(shè)置成功了。如果你不想每次創(chuàng)建 XR Origin 的時(shí)候都進(jìn)行這個設(shè)置,可以試試下面的方法。

方法二

打開 Project Settings -> Preset Manager,將 XRI Default Gaze Controller 拖到第一位。

然后回到場景中,重新創(chuàng)建一個 XR Origin,此時(shí)左右手的 Preset 應(yīng)該就是正確的。

方法三

如果你的項(xiàng)目中沒有用到眼動追蹤,可以不用添加眼動追蹤的 Preset。如果之前添加過了,就點(diǎn)擊下圖的按鈕移除掉。

然后重新創(chuàng)建 XR Origin 就好了。

??結(jié)語

本篇博客只是演示 OpenXR+XR Interaction Toolkit 開發(fā) Unity VR 應(yīng)用的基礎(chǔ)配置。今后還會介紹更多 XR Interaction Toolkit 的功能,大家敬請期待~ 因?yàn)槟壳皣鴥?nèi)的相關(guān)教程還不是很多,所以我想把自己學(xué)習(xí)到的東西做個記錄,分享給更多學(xué)習(xí) VR 開發(fā)的小伙伴們!??

原文鏈接:https://blog.csdn.net/qq_46044366/category_11656077.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容