編譯/VR陀螺
WWDC 2023 從北京時(shí)間 6 月 6 日至 10 日以在線形式舉行,在主題演講系列活動(dòng)中,為了幫助開發(fā)者了解如何將現(xiàn)有的Unity VR應(yīng)用和游戲帶到VisionOS中,以及如何在應(yīng)用和游戲中使用Unity輸入系統(tǒng)為眼睛和手部構(gòu)建內(nèi)容,蘋果公司與Unity帶來了一系列相關(guān)分享。
圖源:apple
以下是 “將你的Unity VR應(yīng)用程序帶到一個(gè)完全沉浸的空間”的主題分享(VR陀螺編譯,基于原文略有修改):
Christopher Figueroa:你好,我是蘋果公司ARKit團(tuán)隊(duì)的Christopher Figueroa。
Peter Kuhn:我是來自Unity的Peter Kuhn。
Christopher:Unity已經(jīng)把他們的引擎和XR生態(tài)系統(tǒng)帶到了這個(gè)新的平臺(tái)上,使得像Peter 這樣的Unity開發(fā)者可以很容易地把自己的項(xiàng)目帶入到VisionOS中。Peter和我將向大家展示如何使用你已經(jīng)熟悉的Unity工作流程,建立一個(gè)完全沉浸式的體驗(yàn),就像這里的《Rec Room》。你將從創(chuàng)建一個(gè)具有完全沉浸式風(fēng)格的沉浸式空間開始。這允許你的應(yīng)用程序隱藏Passthrough,并把人帶到另一個(gè)世界。在完全沉浸式體驗(yàn)中,Unity利用了Compositor Services,并讓你的應(yīng)用程序具有金屬渲染能力。
Unity還利用ARKit的優(yōu)勢(shì)來識(shí)別你的身體位置和周圍的環(huán)境,包括骨骼手的追蹤。Unity以這些技術(shù)為基礎(chǔ),在Unity引擎中提供同樣的服務(wù)。在這個(gè)平臺(tái)上用Unity創(chuàng)建沉浸式體驗(yàn)有兩種主要方法。你可以把完全沉浸式的Unity體驗(yàn)帶到這個(gè)平臺(tái)上,用你自己的環(huán)境取代玩家的環(huán)境?;蛘吣憧梢詫⒛愕膬?nèi)容與Passthrough功能混合,創(chuàng)造出與周圍環(huán)境相融合的沉浸式體驗(yàn)。
如果你對(duì)第二種方法感興趣,我推薦你查看“創(chuàng)建沉浸式Unity應(yīng)用程序”?,F(xiàn)在,Peter將介紹一下這些新的蘋果技術(shù)如何幫助Unity開發(fā)者將完全沉浸式的VR游戲帶到這個(gè)平臺(tái)。
Peter:謝謝你,Christopher。首先,我想向你展示來自Against Gravity的《Rec Room》。這是一個(gè)流行的VR社交平臺(tái),允許用戶與來自世界各地的人們一起創(chuàng)造內(nèi)容和玩耍。它建立在Unity游戲引擎上,這為游戲開發(fā)提供了一個(gè)強(qiáng)大而靈活的平臺(tái)。我將向你介紹其中的一些工具和技術(shù),這些工具和技術(shù)將使你更容易將自己的VR內(nèi)容帶到這個(gè)新平臺(tái),就像《Rec Room》一樣。我將告訴你一些在計(jì)劃將你的Unity內(nèi)容帶到這個(gè)新平臺(tái)時(shí)需要注意的事情。
首先,我將介紹你用來將內(nèi)容從Unity部署到設(shè)備上的工作流程。還有一些你需要記住的與這個(gè)平臺(tái)上的圖形有關(guān)的事情。最后,我將談?wù)勅绾螌⒖刂破鬏斎脒m應(yīng)于手部輸入,以及Unity提供的一些工具來幫助你完成這一轉(zhuǎn)變。
建立Unity工作流程
首先,需要有一個(gè)構(gòu)建和運(yùn)行的工作流程,你應(yīng)該已經(jīng)熟悉了。我們已經(jīng)在Unity中建立了對(duì)這個(gè)平臺(tái)的全面支持,所以你只需幾個(gè)步驟就可以看到你的項(xiàng)目在這個(gè)設(shè)備上運(yùn)行。首先是選擇這個(gè)平臺(tái)的構(gòu)建目標(biāo)。然后,像對(duì)待其他VR平臺(tái)一樣,啟用XR插件。如果你的應(yīng)用程序依賴于本地插件,它們將需要針對(duì)這個(gè)平臺(tái)重新編譯。另一方面,如果你使用的是原始源代碼或.mm文件,那么你就已經(jīng)可以直接使用了。
圖源:apple
現(xiàn)在從Unity構(gòu)建將生成一個(gè)Xcode項(xiàng)目,就像它為iOS、Mac或Apple TV目標(biāo)所做的那樣。然后,在Xcode中,你可以構(gòu)建并運(yùn)行到設(shè)備或設(shè)備模擬器上,以加快迭代。用來將某人的周圍環(huán)境轉(zhuǎn)化為完全沉浸式體驗(yàn)的圖形管道可能也是你熟悉的內(nèi)容。但是有幾個(gè)新的概念是必須要了解的。每個(gè)項(xiàng)目在開始時(shí)都會(huì)做出的一個(gè)選擇是使用哪條渲染管道。通用渲染管線是一個(gè)理想的選擇,它可以實(shí)現(xiàn)這個(gè)平臺(tái)獨(dú)有的一個(gè)特殊功能,即注視點(diǎn)渲染(Foveated Rendering)。
注視點(diǎn)渲染是一種技術(shù),它能將更多的像素密度集中在眼睛可能聚焦的每個(gè)鏡頭的中心,而在眼睛對(duì)細(xì)節(jié)不太敏感的屏幕外圍則減少細(xì)節(jié)。這將為使用設(shè)備的人帶來更高質(zhì)量的體驗(yàn)。
當(dāng)你使用通用渲染管線時(shí),靜態(tài)注視點(diǎn)渲染將被應(yīng)用于整個(gè)管線。而且它將與所有URP功能一起使用,包括后期處理、相機(jī)堆疊、HDR等。如果你有定制的渲染通道可以從注視點(diǎn)渲染中受益,Unity 2022中的新API可以利用這項(xiàng)技術(shù)。由于現(xiàn)在的渲染是在非線性空間中進(jìn)行的,所以也有著色器宏來處理這種重映射。利用靜態(tài)注視點(diǎn)渲染的優(yōu)勢(shì)意味著你會(huì)把資源花在重要的像素上,并產(chǎn)生更高質(zhì)量的視覺體驗(yàn)。
在這個(gè)平臺(tái)上優(yōu)化圖形的另一種方法是使用單通道實(shí)例渲染(Single-Pass Instanced Rendering)。在Unity中,單通道實(shí)例渲染現(xiàn)在支持Metal圖形API,它將被默認(rèn)啟用。使用單通道實(shí)例渲染,引擎只為雙眼提交一次繪制調(diào)用,并減少了渲染管道的某些部分(如剔除和陰影)的開銷。這就減少了渲染立體場(chǎng)景的CPU開銷。
好消息是,如果你的應(yīng)用程序已經(jīng)在其他VR平臺(tái)上使用單通道實(shí)例渲染正確渲染,著色器宏會(huì)確保它在蘋果的新平臺(tái)中也能工作。還有最后一件事要考慮,即確保你的應(yīng)用程序能正確地寫入每個(gè)像素的深度緩沖區(qū)。系統(tǒng)合成器使用深度緩沖區(qū)進(jìn)行再投影,只要缺少深度信息,為了進(jìn)行提示系統(tǒng)就會(huì)渲染一個(gè)錯(cuò)誤的顏色。一個(gè)例子是天空盒,它通常離用戶無限遠(yuǎn),所以它寫入了一個(gè)深度為0的反向Z,這需要修改才能出現(xiàn)在設(shè)備上。
我們已經(jīng)修復(fù)了Unity的所有著色器,使其向深度緩沖區(qū)寫入正確的值,但如果你有任何自定義的效果,如自定義天空盒,或者水效果或透明效果,應(yīng)確保每個(gè)像素都有一些值能寫入深度。
為Unity應(yīng)用程序添加交互
現(xiàn)在你已經(jīng)把你的圖形渲染到設(shè)備上了,是時(shí)候讓它們開始交互了。這個(gè)設(shè)備上的交互是獨(dú)一無二的,人們將使用他們的手和眼睛與內(nèi)容交互。有幾種方法可以讓你在這個(gè)平臺(tái)上為你的Unity應(yīng)用程序添加交互。
圖源:apple
XR交互工具包增加了手部追蹤,使你更容易適應(yīng)現(xiàn)有的項(xiàng)目。你還可以通過Unity輸入系統(tǒng)對(duì)內(nèi)置的系統(tǒng)手勢(shì)做出反應(yīng)。你也可以通過Unity Hands Package訪問原始手部關(guān)節(jié)數(shù)據(jù),進(jìn)行自定義交互。
XR交互工具包,也被稱為XRI,提供了一個(gè)高水平的交互系統(tǒng)。該工具包旨在使輸入轉(zhuǎn)化為交互變得容易。它同時(shí)適用于3D和UI對(duì)象。XRI抽象了輸入的類型,如手部追蹤,并將輸入轉(zhuǎn)化為你的應(yīng)用程序可以響應(yīng)的動(dòng)作。這意味著你的輸入代碼可以在接受不同類型輸入的平臺(tái)上工作。XRI使得在3D空間和3D空間世界的UI中響應(yīng)常見的交互(如懸停、抓取和選擇等)變得更容易。該工具包還包括一個(gè)運(yùn)動(dòng)系統(tǒng),因此人們可以更舒適地在一個(gè)完全沉浸式的空間中旅行。
當(dāng)人們與你的世界交互時(shí),視覺反饋對(duì)沉浸感很重要。XRI使你能夠?yàn)槊總€(gè)輸入約束定義視覺反應(yīng)。XRI的核心是一套基本的Interactable 和 Interactor組件。Interactable是你的場(chǎng)景中可以接受輸入的對(duì)象。你定義Interactor,指定人們?nèi)绾闻c你的Interactor互動(dòng)。交互管理器將這些組件聯(lián)系在一起,第一步是決定場(chǎng)景中哪些對(duì)象可以被交互,以及當(dāng)這些交互發(fā)生時(shí)如何反應(yīng)。我們通過向?qū)ο筇砑右粋€(gè)可交互的組件來做到這一點(diǎn)。
有三種內(nèi)置類型。Simple交互項(xiàng)可以將對(duì)象標(biāo)記為可以接受交互。你可以用這個(gè)組件訂閱SelectEntered或SelectExited等事件。使用Grab交互項(xiàng),當(dāng)對(duì)象被選中或被抓住時(shí),它將跟隨Interactor走動(dòng),并在釋放時(shí)繼承其速度。
像Teleport 交互項(xiàng)(如TeleportArea和TeleportAnchor)這樣的傳送互動(dòng)組件使你能夠?yàn)橥婕叶x傳送的區(qū)域或點(diǎn)。你還可以創(chuàng)建你自己的自定義交互器。交互者負(fù)責(zé)選擇或與你標(biāo)記為交互者的對(duì)象進(jìn)行交互。他們定義了一個(gè)有可能在每一幀上懸?;蜻x擇的可交互對(duì)象的列表。
有幾種類型的交互器,其中Direct Interactor用于選擇接觸到它的可交互對(duì)象。當(dāng)你想知道一個(gè)人的手什么時(shí)候接觸到可交互的對(duì)象,或者他們什么時(shí)候接近可交互的對(duì)象時(shí),你就會(huì)使用該組件。
圖源:apple
Ray Interactor用于從遠(yuǎn)處進(jìn)行交互。這種交互器是高度可配置的,有弧線和直線,以及可定制的可視化效果,以幫助你適應(yīng)項(xiàng)目的視覺風(fēng)格。一旦用戶開始交互,你就可以選擇這種互動(dòng)的方式。例如,如果是抓取互動(dòng),你可能想把物體移到用戶的手上。而Ray Interactor可以限制抓取的自由度,以滿足你的游戲需求。
圖源:apple
在完全沉浸式體驗(yàn)中,一個(gè)常見的交互是抓取一個(gè)物體并把它放在與該物體相關(guān)的某個(gè)地方。例如,把電池放在一個(gè)插座上。Socket Interactor可以向玩家顯示某個(gè)區(qū)域可以接受的一個(gè)對(duì)象。這些交互器并不附在手上,相反,它們放置在世界的某個(gè)地方。通過手部追蹤甚至是控制器,用戶自然想要進(jìn)行的一種常見的交互類型是戳式(Poke)互動(dòng)。這類似于Direct Interactor,不同之處在于它包括方向過濾,所以必須執(zhí)行正確的運(yùn)動(dòng)才能觸發(fā)交互。
圖源:apple
如果你想讓人們通過觀看進(jìn)行交互,Gaze Interactor可以為Ray Interactor提供一些擴(kuò)展,使注視變得更容易處理。例如,Gaze Interactor可以自動(dòng)地使互動(dòng)對(duì)象的碰撞器變大,這樣他們就更容易被選中。
為了將這一切結(jié)合起來,交互管理器會(huì)充當(dāng)交互器和可交互對(duì)象之間的中間人,促進(jìn)交互的交換。它的主要作用是在指定的已注冊(cè)交互器和可交互者群體中啟動(dòng)交互狀態(tài)的變化。通常,建立一個(gè)單一的交互管理器,以使所有的交互者都能影響所有的可交互者。另外,也可以利用多個(gè)互補(bǔ)的交互管理器,每個(gè)管理器都有自己獨(dú)特的交互者和可交互者的組合。這些管理器可以被激活或停用,以啟用或停用特定的互動(dòng)集。例如,你可以在每個(gè)場(chǎng)景或菜單中使用一組不同的交互器。
最后,XR控制器組件可以幫助你理解收到的輸入數(shù)據(jù)。它從手或追蹤設(shè)備中獲取輸入動(dòng)作,并將其傳遞給交互者,這樣他們就可以根據(jù)該輸入決定選擇或激活什么。
你需要為每個(gè)XR交互狀態(tài)(例如選擇)綁定輸入操作引用。這并不局限于每個(gè)手或控制器只能使用一個(gè)XR控制器組件,這使我們可以靈活地獨(dú)立支持兩個(gè)手和控制器。與XRI捆綁在一起的示例代碼向你展示了如何做到這一點(diǎn)。
手勢(shì)輸入
除了XRI的高級(jí)功能外,你還可以選擇直接使用Unity輸入系統(tǒng)的系統(tǒng)手勢(shì)輸入。然后,你可以把平臺(tái)的內(nèi)置交互,如輕敲手勢(shì),映射到你自己的交互系統(tǒng)中。你可以使用Unity輸入系統(tǒng)的綁定路徑來訪問和響應(yīng)這些系統(tǒng)手勢(shì)。
例如,捏合手勢(shì)在激活時(shí)作為一個(gè)值出現(xiàn),并帶有位置和旋轉(zhuǎn)。這些都可以被綁定到輸入動(dòng)作上。人們將注意力集中在與捏合手勢(shì)相同的框架中,具有位置和旋轉(zhuǎn)。為了獲得更多的靈活性,你可以使用Unity Hands子系統(tǒng),通過Unity Hands Package訪問系統(tǒng)中所有的原始手部關(guān)節(jié)數(shù)據(jù)。
Unity Hands Package提供了對(duì)低級(jí)手部關(guān)節(jié)數(shù)據(jù)的訪問,這些數(shù)據(jù)在各個(gè)平臺(tái)上是一致的。例如,你可以編寫代碼來查看每個(gè)關(guān)節(jié),并確定該姿勢(shì)與某種手勢(shì)的接近程度,如豎起大拇指或指向食指,并將這些轉(zhuǎn)化為游戲動(dòng)作。這很強(qiáng)大,但由于每個(gè)人的手大小不同,而且人們的動(dòng)作范圍也各不相同,所以要想做對(duì)是很有難度的。
這段代碼定義了一個(gè)方法,告訴你用戶的食指是否伸出。你可以從OnHandUpdate事件中調(diào)用這個(gè)方法,并傳入其中一只手。首先,得到幾個(gè)特定的關(guān)節(jié)來檢查食指是否伸展。如果其中任何一個(gè)無效,它將返回false。如果所有的關(guān)節(jié)都有效,做一個(gè)簡(jiǎn)單的檢查以確保食指沒有彎曲。
你可以把這個(gè)邏輯擴(kuò)展到其他手指,開始實(shí)現(xiàn)一些基本的手勢(shì)檢測(cè)。原始手部關(guān)節(jié)數(shù)據(jù)的另一個(gè)用途是將其映射到一個(gè)自定義的手部網(wǎng)格視覺。這可以幫助使手部更符合你的游戲藝術(shù)風(fēng)格。例如,《Rec Room》使用原始手部關(guān)節(jié)數(shù)據(jù)來顯示符合其視覺風(fēng)格的風(fēng)格化手部模型。他們還展示了其他玩家的手部模型,以增加沉浸感。
如果你想探索更多關(guān)于原始手部關(guān)節(jié)的信息,Unity Hands Package有一些示例代碼可以幫助你入門。我很高興看到你的VR體驗(yàn)來到了這個(gè)新的平臺(tái)。要獲得更多關(guān)于Unity對(duì)這個(gè)平臺(tái)的支持信息,并注冊(cè)早期的測(cè)試版訪問權(quán),請(qǐng)?jiān)L問unity.com/spatial。
Christopher:這些是你可以使用的工具,使用你已經(jīng)熟悉的Unity工作流程為這個(gè)新平臺(tái)帶來完全沉浸式的VR體驗(yàn)。
Peter:總而言之,這次演講向你介紹了一些工具和技術(shù),這些工具和技術(shù)將使你更容易把自己的VR內(nèi)容帶到這個(gè)新平臺(tái),就像《Rec Room》一樣。如果你要開始一個(gè)新的項(xiàng)目,請(qǐng)使用Unity 2022或更新的版本。如果你有一個(gè)現(xiàn)有的項(xiàng)目,請(qǐng)升級(jí)到2022。你需要考慮采用通用渲染管線,雖然支持內(nèi)置的圖形管道,但所有未來的改進(jìn)都將在通用管道上進(jìn)行。以及,開始考慮將任何基于控制器的交互適應(yīng)于手部。你可以從今天開始使用XR交互工具包和Unity Hands Package。
Christopher:最后,要了解更多關(guān)于如何使用Unity創(chuàng)建具有Passthrough功能的沉浸式體驗(yàn),我推薦查閱“創(chuàng)建沉浸式Unity應(yīng)用程序”。開發(fā)者們還可以查看“為空間計(jì)算建立偉大的游戲”,以了解游戲開發(fā)者在這個(gè)平臺(tái)上的可能性。
Peter:我們很期待看到你會(huì)給這個(gè)平臺(tái)帶來什么樣的內(nèi)容。
Christopher:謝謝觀看。
來源:apple