《LEGO Builder's Journey》是 Light Brick Studio 推出的一款多平臺(tái)解謎游戲,自登陸 Apple Arcade 以來(lái),逐漸積累了人氣,發(fā)展勢(shì)頭強(qiáng)勁。對(duì)于將《LEGO Builder's Journey》適配到 Apple Vision Pro 平臺(tái),迎接空間計(jì)算的新時(shí)代,他們總結(jié)了一些重要的經(jīng)驗(yàn)和心得。
本文將講述一個(gè)初次涉足混合現(xiàn)實(shí)領(lǐng)域的工作室,如何在充分利用 Apple Vision Pro 的沉浸式特性的同時(shí),確保游戲體驗(yàn)與其他平臺(tái)(如移動(dòng)端、PC 等)保持一致?他們?cè)?20 個(gè)項(xiàng)目成員中有 6 人負(fù)責(zé) Apple Vision Pro 的移植,在三個(gè)月內(nèi)的時(shí)間,解決了渲染和優(yōu)化難題,將《LEGO Builder's Journey》移植到 Apple Vision Pro。
由于樂(lè)高?積木是實(shí)物產(chǎn)品,Light Brick Studio 意識(shí)到在 Apple Vision Pro 上創(chuàng)建一種讓玩家在房間內(nèi)與游戲元素交互的體驗(yàn)十分具有挑戰(zhàn)性。對(duì)于游戲的 Apple Vision Pro 版本發(fā)布,時(shí)間也是一個(gè)限制因素。雖然團(tuán)隊(duì)之前曾在一兩個(gè)月內(nèi)完成過(guò)其他平臺(tái)的 2D 界面移植,但這次進(jìn)入空間計(jì)算領(lǐng)域的三個(gè)月時(shí)間安排非常緊張。
探索新維度
“一旦了解了平臺(tái)對(duì)游戲及其玩法設(shè)計(jì)的限制,你就幾乎可以創(chuàng)造出任何想要的體驗(yàn),” Light Brick Studios 的技術(shù)負(fù)責(zé)人 Mikkel Fredborg 解釋說(shuō)。
對(duì)于團(tuán)隊(duì)來(lái)說(shuō),將游戲移植到 VisionOS 平臺(tái)“主要是一個(gè)技術(shù)挑戰(zhàn),既要讓游戲流暢運(yùn)行,又要充分利用平臺(tái)的完整體驗(yàn)?!边@意味著需要進(jìn)行多項(xiàng)技術(shù)改進(jìn),包括對(duì)用戶界面(UI)進(jìn)行全面重新設(shè)計(jì),將原本平面的 UI 元素放置在房間中。團(tuán)隊(duì)還需要更新他們的渲染工具和方法,以確保最終產(chǎn)品的視覺質(zhì)量和沉浸感。同時(shí),平衡 Unity 和 RealityKit 兩個(gè)系統(tǒng),進(jìn)一步增加了性能優(yōu)化的難度。
“我們做過(guò)很多不同平臺(tái)的移植,但這次是最復(fù)雜的,因?yàn)?Apple Vision Pro 與其他平臺(tái)有很大不同,我們的目標(biāo)是探索能在多大程度上提升這種體驗(yàn),結(jié)果非常成功?!?Light Brick Studio 的總經(jīng)理 Karsten Lund 說(shuō)道。
成果
在不到 100 天的時(shí)間內(nèi)為 Apple Vision Pro 構(gòu)建了游戲的 80 個(gè)關(guān)卡和 60,353 塊樂(lè)高積木。
在 Unity PolySpatial 團(tuán)隊(duì)的支持下,節(jié)省了數(shù)周的開發(fā)時(shí)間。
保持了所有游戲玩法區(qū)域的完整性,僅進(jìn)行了特定的性能優(yōu)化,沒有改變游戲的整體節(jié)奏。
實(shí)現(xiàn)了流暢的過(guò)渡,采用開放式混合現(xiàn)實(shí)風(fēng)格,隨著游戲的推進(jìn),沉浸感逐漸增強(qiáng)。
重新設(shè)計(jì) UI 和游戲玩法
《LEGO Builder’s Journey》的 UI 非常簡(jiǎn)潔,最多只有 20 個(gè)按鈕,用于加載保存的游戲或重新開始關(guān)卡等操作,因此重新設(shè)計(jì) UI 的工作量比許多游戲要小。團(tuán)隊(duì)在 Unity 中重新設(shè)計(jì)了 UI,采用了 GameObjects 并為其添加碰撞體,以確保輸入功能正常工作,同時(shí)能模仿 VisionOS 的設(shè)計(jì)語(yǔ)言。
團(tuán)隊(duì)還需要考慮玩家身體移動(dòng)的靈活性。除了 UI,游戲中的所有內(nèi)容都是用一款名為 LEGO Digital Designer 的工具通過(guò)樂(lè)高積木構(gòu)建的。團(tuán)隊(duì)過(guò)去一直嘗試在 2D 平面上模擬 3D 空間,但在 Apple Vision Pro 上,他們必須考慮到玩家可以在任何位置移動(dòng)。為了適應(yīng)完整的360度體驗(yàn),團(tuán)隊(duì)重新設(shè)計(jì)了原本只能從特定角度觀看的模型,以確保模型幾何中沒有漏洞。為了減少繪制調(diào)用(draw calls),團(tuán)隊(duì)還將多個(gè)網(wǎng)格合并為單個(gè) GameObjects。
Fredborg 表示:“我們考慮到了玩家要走來(lái)走去的情況,并對(duì)模型進(jìn)行了完整的 360 度優(yōu)化。在將積木導(dǎo)入游戲時(shí),我們?nèi)サ袅朔e木內(nèi)部的所有幾何結(jié)構(gòu),移除了所有內(nèi)部細(xì)節(jié),因?yàn)檫@些細(xì)節(jié)永遠(yuǎn)不會(huì)被看到。我們利用現(xiàn)有的自動(dòng)化工具,并對(duì)其進(jìn)行了調(diào)整,以適應(yīng)完整的模擬體驗(yàn)?!?/p>
Light Brick Studio 團(tuán)隊(duì)在編輯器中設(shè)置 PolySpatial VolumeCamera 組件的 UI 和事件的截圖
管理 Bounded 模式下的布局
在早期,團(tuán)隊(duì)決定在有界(Bounded)模式下進(jìn)行設(shè)計(jì),這意味著他們必須在一個(gè)定義的體積范圍內(nèi)操作。如果嘗試在這個(gè)范圍外操作,元素會(huì)被裁剪且不可見,團(tuán)隊(duì)決定接受有界模式的限制。在這種模式下,除非玩家進(jìn)行交互,否則無(wú)法獲取玩家頭部、眼睛或手部的位置/方向信息。只有當(dāng)玩家做出捏合手勢(shì)時(shí),游戲才能知道手的位置以及正在交互的對(duì)象。當(dāng)捏合結(jié)束時(shí),這些信息也會(huì)消失。從這個(gè)意義上說(shuō),它類似于觸摸屏,只有在玩家觸摸屏幕時(shí)才能知道他們?cè)谧鍪裁础?/p>
Fredborg 表示:“我們不知道玩家在看什么,這是一個(gè)很大的變化,尤其是因?yàn)槲覀兊挠螒蛲娣ㄐ枰婕铱粗e木來(lái)選擇它。我們解決了這些限制后,效果非常好,并且很好地融入了系統(tǒng)。最終,這種方式運(yùn)行得非常順暢,因?yàn)橐磺卸汲恢碌挠脩趔w驗(yàn)方向發(fā)展?!?/p>
為 MaterialX 著色器提供支持
在《LEGO Builder's Journey》的最早版本中,團(tuán)隊(duì)使用了 Unity 輕量級(jí)渲染管線(LWRP)的自定義版本,隨后在為 Xbox 和 PlayStation 移植時(shí)轉(zhuǎn)向了高清渲染管線(HDRP)。為了適配 Apple Vision Pro,他們首先需要將所有內(nèi)容轉(zhuǎn)換為基于通用渲染管線(URP)和 Shader Graph 的版本,然后再遷移到 Apple 的 RealityKit。
為此,他們將 Shader Graph 中編寫的著色器轉(zhuǎn)換為 MaterialX 著色器,以便加載到 RealityKit 中。但團(tuán)隊(duì)遇到了一些障礙,發(fā)現(xiàn)結(jié)果并不理想,優(yōu)化工作比預(yù)期的要多。
他們?cè)居?jì)劃手動(dòng)優(yōu)化,但發(fā)現(xiàn)要實(shí)現(xiàn)自動(dòng)化來(lái)滿足規(guī)模化的需求。他們要手動(dòng)修補(bǔ)著色器,找到重復(fù)的代碼,然后替換這部分代碼以確保它只執(zhí)行一次。Fredborg 承認(rèn):“讓一切順利運(yùn)行是一個(gè)挑戰(zhàn),但我認(rèn)為 PolySpatial 團(tuán)隊(duì)在推動(dòng)優(yōu)化方面做得非常出色。”
尋找理想的光照效果
由于游戲的開發(fā)時(shí)間緊迫,團(tuán)隊(duì)需要快速找到解決方案。Fredborg 表示:“我們必須找到解決方案來(lái)提升游戲的逼真效果,同時(shí)支持實(shí)時(shí)光照和陰影。這是較大的改動(dòng)之一。”
最初,他們采用了 Apple Vision Pro 的基于圖像的光照(image-based lighting),目標(biāo)是將其正確地應(yīng)用到他們想要包含的材質(zhì)上,比如塑料及其不同變體。他們還需要解決一些難以處理的元素,比如積木上的指紋和劃痕。
由于游戲最初是為早期 iPhone 開發(fā)的,光照非常簡(jiǎn)單。團(tuán)隊(duì)使用了一種體積紋理(volume texture),就是帶有烘焙環(huán)境光遮蔽(ambient occlusion)的 3D 紋理,以便可以從場(chǎng)景中的任何位置采樣。他們會(huì)對(duì)點(diǎn)采樣并分析環(huán)境光遮蔽的程度。由于 Apple Vision Pro 不支持 3D 紋理,他們需要將體積紋理轉(zhuǎn)換為 2D 紋理,并從中手動(dòng)采樣。雖然這一過(guò)程目前在 PolySpatial 中已經(jīng)自動(dòng)化,但在 Light Brick Studio 團(tuán)隊(duì)剛開始處理還沒有這個(gè)功能。
Light Brick Studio 團(tuán)隊(duì)在編輯器中設(shè)置夜間場(chǎng)景的截圖
團(tuán)隊(duì)最初采用了塑料積木著色方式和體積紋理采樣系統(tǒng)。隨后,他們引入了實(shí)時(shí)光照(Realtime Lights)。當(dāng)體積紋理逐漸充滿整個(gè)場(chǎng)景時(shí),他們需要調(diào)整外部光照。在開發(fā)初期,他們無(wú)法直接覆蓋 RealityKit 的基于圖像的光照,因此選擇采樣不同的立方體貼圖,并讓 RealityKit 的光照逐漸淡出。
Fredborg 解釋說(shuō):“我們當(dāng)時(shí)想實(shí)現(xiàn)的效果在技術(shù)上并不可行,但我們找到了一種變通方法:降低積木的光滑度,并在將其傳遞給 RealityKit 光照系統(tǒng)之前調(diào)整了不同的參數(shù)?,F(xiàn)在,在 PolySpatial 和 RealityKit 中已經(jīng)可以直接覆蓋基于圖像的光照,開發(fā)者將能更輕松地實(shí)現(xiàn)類似的效果?!?/p>
創(chuàng)建柔和的陰影
Light Brick Studio 團(tuán)隊(duì)還需要為陰影找到解決方案。雖然可以在 Apple Vision Pro 中為某些元素添加陰影,但這并不是標(biāo)準(zhǔn)功能。為此,團(tuán)隊(duì)在 Unity 中將陰影渲染為高度圖(height map)或深度圖(depth map),然后將其發(fā)送到 RealityKit 并重新采樣。他們?cè)?Unity 的 Metal 后端將場(chǎng)景渲染為陰影貼圖(shadow map),然后將其傳遞到 RealityKit 的渲染端。
Fredborg 解釋說(shuō):“如果還需要達(dá)到每秒 90 幀的渲染速度,其實(shí)能在渲染中實(shí)現(xiàn)的效果是有限的。我們使用了一個(gè)非常小的陰影貼圖,64 x 64 像素,然后將 mipmap 級(jí)別組合到單個(gè)紋理的 RGBA 通道中,這樣在 RealityKit 中只需一次采樣就可以生成看起來(lái)像柔和陰影的效果。因此,當(dāng)積木非常接近表面時(shí),陰影非常銳利,但當(dāng)它遠(yuǎn)離時(shí),陰影變得更加柔和。我們用一次紋理采樣實(shí)現(xiàn)了這一點(diǎn)。”
對(duì)于 Unity 中的實(shí)時(shí)光照(Realtime Lights),他們使用了 Shader Graph 中的PolySpatial Lighting 節(jié)點(diǎn),該節(jié)點(diǎn)在被轉(zhuǎn)換為 RealityKit 可處理的格式后,會(huì)擴(kuò)展為多個(gè) Shader Graph 節(jié)點(diǎn)。
Fredborg 表示:“對(duì)于 RealityKit,修改著色器的唯一方法是通過(guò)類似 Shader Graph 的界面?!痹?Unity 端,團(tuán)隊(duì)發(fā)現(xiàn)可以在 Shader Graph 中創(chuàng)建自定義代碼函數(shù),只要遵循某些特定規(guī)則,之后就可以將其轉(zhuǎn)換為 MaterialX 節(jié)點(diǎn)圖。他繼續(xù)說(shuō)道:“這真的幫了我們大忙,否則 Shader Graph 里就會(huì)變得一團(tuán)糟?!?/p>
將游戲的幀率優(yōu)化到 90 fps
在團(tuán)隊(duì)將視覺效果推向新高度的同時(shí),他們也遇到了一些保持平臺(tái)流暢運(yùn)行的難題。開發(fā)采用了雙系統(tǒng)架構(gòu):所有內(nèi)容從 Unity 傳遞到 RealityKit,而兩者的渲染技術(shù)不同。這意味著Unity 負(fù)責(zé)處理游戲邏輯,而 RealityKit 負(fù)責(zé)渲染視覺效果,因此需要進(jìn)行優(yōu)化以實(shí)現(xiàn) 90 fps 的流暢運(yùn)行。其中一個(gè)主要挑戰(zhàn)是確定性能瓶頸是來(lái)自 Unity 端還是 RealityKit 端,團(tuán)隊(duì)需要多次嘗試才能找到解決方案。
Fredborg 解釋說(shuō):“最初,PolySpatial 工具包會(huì)將我們?cè)?Unity 中做的所有內(nèi)容都傳遞到 RealityKit,因此每個(gè) GameObject 或變換都會(huì)被傳遞過(guò)去。當(dāng)時(shí)我們無(wú)法關(guān)閉特定層的傳遞或反射。它會(huì)鏡像所有內(nèi)容,包括 UI 渲染、畫布渲染和動(dòng)畫粒子系統(tǒng)?,F(xiàn)在,有一個(gè)過(guò)濾器可以設(shè)置為不跟蹤特定層,但在當(dāng)時(shí),我們必須找到一種方法來(lái)清理那些在 RealityKit 端不需要顯示的內(nèi)容?!?/p>
團(tuán)隊(duì)需要優(yōu)化 GameObject 的層級(jí)結(jié)構(gòu)。在其他平臺(tái)上,每個(gè)樂(lè)高積木由三個(gè)或更多鏈接的 GameObject 組成,但在 VisionOS 上,團(tuán)隊(duì)將每個(gè)積木的 GameObject 數(shù)量限制為最多兩個(gè),以減少 Unity 和 RealityKit 之間的數(shù)據(jù)傳遞。這一優(yōu)化效果顯著,為團(tuán)隊(duì)帶來(lái)了很大的成功。
提升定格動(dòng)畫(stop motion animation)的性能也是一個(gè)亮點(diǎn)。游戲中包含瀑布動(dòng)畫,這些瀑布通過(guò)交換積木上的網(wǎng)格實(shí)現(xiàn),由數(shù)百個(gè)不同的 GameObject 組成,導(dǎo)致性能較慢?!拔覀冏罱K采用了一種分步處理的方式,而不是為每個(gè) GameObject 逐幀處理。我們會(huì)等待并在不同瀑布流之間每隔幾幀處理一次。這大大提升了性能?!盕redborg 說(shuō)道。
尋找合適的解決方案和合作伙伴
在為 Apple Vision Pro 開發(fā)應(yīng)用的過(guò)程中,Light Brick Studio 團(tuán)隊(duì)必須保持靈活、快速解決問(wèn)題,并通過(guò)不斷迭代來(lái)完善應(yīng)用。
Fredborg 說(shuō)道:“我認(rèn)為必須戴上頭盔才能真正理解那種體驗(yàn)。我們建議進(jìn)行多次構(gòu)建,并盡可能多地使用真實(shí)設(shè)備進(jìn)行測(cè)試,重點(diǎn)關(guān)注觸摸和運(yùn)動(dòng)交互。雖然你可以在Mac上運(yùn)行模擬器來(lái)了解應(yīng)用的運(yùn)行情況,但輸入方式是不同的。這是一個(gè)更注重物理交互的平臺(tái)。”
最終,團(tuán)隊(duì)對(duì)游戲的表現(xiàn)非常滿意,很大一部分原因在于與強(qiáng)大的支持合作伙伴的合作。他繼續(xù)說(shuō)道:“Unity 的 PolySpatial 團(tuán)隊(duì)在 Slack 和 Discussion 論壇上都非常及時(shí)地回應(yīng)我們。當(dāng)我們遇到阻礙時(shí),他們會(huì)迅速為我們提供解決方案,這非常有幫助。他們?yōu)槲覀兲峁┝藦?qiáng)大的支持,并希望我們能夠打造出更高質(zhì)量的 PolySpatial 版本?!?/p>
“只要是 Unity 支持的平臺(tái),我們就能讓內(nèi)容在上面運(yùn)行。”——MIKKEL FREDBORG,LIGHT BRICK STUDIO 技術(shù)負(fù)責(zé)人
使用 Unity 引擎為 Apple Vision Pro 開發(fā)應(yīng)用,歡迎聯(lián)系我們, 通過(guò)與我們的團(tuán)隊(duì)交流,了解我們可以如何幫助您利用 Unity 的強(qiáng)大工具和工作流,打造引人入勝的空間計(jì)算體驗(yàn)。
Unity 官方微信
第一時(shí)間了解Unity引擎動(dòng)向,學(xué)習(xí)進(jìn)階開發(fā)技能
每一個(gè)“點(diǎn)贊”、“在看”,都是我們前進(jìn)的動(dòng)力
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.