编译/VR陀螺
WWDC 2023 从北京时间 6 月 6 日至 10 日以在线形式举行,在主题演讲系列活动中,为了帮助开发者了解如何将现有的Unity VR应用和游戏带到VisionOS中,以及如何在应用和游戏中使用Unity输入系统为眼睛和手部构建内容,苹果公司与Unity带来了一系列相关分享。
图源:apple
以下是 “将你的Unity VR应用程序带到一个完全沉浸的空间”的主题分享(VR陀螺编译,基于原文略有修改):
Christopher Figueroa:你好,我是苹果公司ARKit团队的Christopher Figueroa。
Peter Kuhn:我是来自Unity的Peter Kuhn。
Christopher:Unity已经把他们的引擎和XR生态系统带到了这个新的平台上,使得像Peter 这样的Unity开发者可以很容易地把自己的项目带入到VisionOS中。Peter和我将向大家展示如何使用你已经熟悉的Unity工作流程,建立一个完全沉浸式的体验,就像这里的《Rec Room》。你将从创建一个具有完全沉浸式风格的沉浸式空间开始。这允许你的应用程序隐藏Passthrough,并把人带到另一个世界。在完全沉浸式体验中,Unity利用了Compositor Services,并让你的应用程序具有金属渲染能力。
Unity还利用ARKit的优势来识别你的身体位置和周围的环境,包括骨骼手的追踪。Unity以这些技术为基础,在Unity引擎中提供同样的服务。在这个平台上用Unity创建沉浸式体验有两种主要方法。你可以把完全沉浸式的Unity体验带到这个平台上,用你自己的环境取代玩家的环境。或者你可以将你的内容与Passthrough功能混合,创造出与周围环境相融合的沉浸式体验。
如果你对第二种方法感兴趣,我推荐你查看“创建沉浸式Unity应用程序”。现在,Peter将介绍一下这些新的苹果技术如何帮助Unity开发者将完全沉浸式的VR游戏带到这个平台。
Peter:谢谢你,Christopher。首先,我想向你展示来自Against Gravity的《Rec Room》。这是一个流行的VR社交平台,允许用户与来自世界各地的人们一起创造内容和玩耍。它建立在Unity游戏引擎上,这为游戏开发提供了一个强大而灵活的平台。我将向你介绍其中的一些工具和技术,这些工具和技术将使你更容易将自己的VR内容带到这个新平台,就像《Rec Room》一样。我将告诉你一些在计划将你的Unity内容带到这个新平台时需要注意的事情。
首先,我将介绍你用来将内容从Unity部署到设备上的工作流程。还有一些你需要记住的与这个平台上的图形有关的事情。最后,我将谈谈如何将控制器输入适应于手部输入,以及Unity提供的一些工具来帮助你完成这一转变。
建立Unity工作流程
首先,需要有一个构建和运行的工作流程,你应该已经熟悉了。我们已经在Unity中建立了对这个平台的全面支持,所以你只需几个步骤就可以看到你的项目在这个设备上运行。首先是选择这个平台的构建目标。然后,像对待其他VR平台一样,启用XR插件。如果你的应用程序依赖于本地插件,它们将需要针对这个平台重新编译。另一方面,如果你使用的是原始源代码或.mm文件,那么你就已经可以直接使用了。
图源:apple
现在从Unity构建将生成一个Xcode项目,就像它为iOS、Mac或Apple TV目标所做的那样。然后,在Xcode中,你可以构建并运行到设备或设备模拟器上,以加快迭代。用来将某人的周围环境转化为完全沉浸式体验的图形管道可能也是你熟悉的内容。但是有几个新的概念是必须要了解的。每个项目在开始时都会做出的一个选择是使用哪条渲染管道。通用渲染管线是一个理想的选择,它可以实现这个平台独有的一个特殊功能,即注视点渲染(Foveated Rendering)。
注视点渲染是一种技术,它能将更多的像素密度集中在眼睛可能聚焦的每个镜头的中心,而在眼睛对细节不太敏感的屏幕外围则减少细节。这将为使用设备的人带来更高质量的体验。
当你使用通用渲染管线时,静态注视点渲染将被应用于整个管线。而且它将与所有URP功能一起使用,包括后期处理、相机堆叠、HDR等。如果你有定制的渲染通道可以从注视点渲染中受益,Unity 2022中的新API可以利用这项技术。由于现在的渲染是在非线性空间中进行的,所以也有着色器宏来处理这种重映射。利用静态注视点渲染的优势意味着你会把资源花在重要的像素上,并产生更高质量的视觉体验。
在这个平台上优化图形的另一种方法是使用单通道实例渲染(Single-Pass Instanced Rendering)。在Unity中,单通道实例渲染现在支持Metal图形API,它将被默认启用。使用单通道实例渲染,引擎只为双眼提交一次绘制调用,并减少了渲染管道的某些部分(如剔除和阴影)的开销。这就减少了渲染立体场景的CPU开销。
好消息是,如果你的应用程序已经在其他VR平台上使用单通道实例渲染正确渲染,着色器宏会确保它在苹果的新平台中也能工作。还有最后一件事要考虑,即确保你的应用程序能正确地写入每个像素的深度缓冲区。系统合成器使用深度缓冲区进行再投影,只要缺少深度信息,为了进行提示系统就会渲染一个错误的颜色。一个例子是天空盒,它通常离用户无限远,所以它写入了一个深度为0的反向Z,这需要修改才能出现在设备上。
我们已经修复了Unity的所有着色器,使其向深度缓冲区写入正确的值,但如果你有任何自定义的效果,如自定义天空盒,或者水效果或透明效果,应确保每个像素都有一些值能写入深度。
为Unity应用程序添加交互
现在你已经把你的图形渲染到设备上了,是时候让它们开始交互了。这个设备上的交互是独一无二的,人们将使用他们的手和眼睛与内容交互。有几种方法可以让你在这个平台上为你的Unity应用程序添加交互。
图源:apple
XR交互工具包增加了手部追踪,使你更容易适应现有的项目。你还可以通过Unity输入系统对内置的系统手势做出反应。你也可以通过Unity Hands Package访问原始手部关节数据,进行自定义交互。
XR交互工具包,也被称为XRI,提供了一个高水平的交互系统。该工具包旨在使输入转化为交互变得容易。它同时适用于3D和UI对象。XRI抽象了输入的类型,如手部追踪,并将输入转化为你的应用程序可以响应的动作。这意味着你的输入代码可以在接受不同类型输入的平台上工作。XRI使得在3D空间和3D空间世界的UI中响应常见的交互(如悬停、抓取和选择等)变得更容易。该工具包还包括一个运动系统,因此人们可以更舒适地在一个完全沉浸式的空间中旅行。
当人们与你的世界交互时,视觉反馈对沉浸感很重要。XRI使你能够为每个输入约束定义视觉反应。XRI的核心是一套基本的Interactable 和 Interactor组件。Interactable是你的场景中可以接受输入的对象。你定义Interactor,指定人们如何与你的Interactor互动。交互管理器将这些组件联系在一起,第一步是决定场景中哪些对象可以被交互,以及当这些交互发生时如何反应。我们通过向对象添加一个可交互的组件来做到这一点。
有三种内置类型。Simple交互项可以将对象标记为可以接受交互。你可以用这个组件订阅SelectEntered或SelectExited等事件。使用Grab交互项,当对象被选中或被抓住时,它将跟随Interactor走动,并在释放时继承其速度。
像Teleport 交互项(如TeleportArea和TeleportAnchor)这样的传送互动组件使你能够为玩家定义传送的区域或点。你还可以创建你自己的自定义交互器。交互者负责选择或与你标记为交互者的对象进行交互。他们定义了一个有可能在每一帧上悬停或选择的可交互对象的列表。
有几种类型的交互器,其中Direct Interactor用于选择接触到它的可交互对象。当你想知道一个人的手什么时候接触到可交互的对象,或者他们什么时候接近可交互的对象时,你就会使用该组件。
图源:apple
Ray Interactor用于从远处进行交互。这种交互器是高度可配置的,有弧线和直线,以及可定制的可视化效果,以帮助你适应项目的视觉风格。一旦用户开始交互,你就可以选择这种互动的方式。例如,如果是抓取互动,你可能想把物体移到用户的手上。而Ray Interactor可以限制抓取的自由度,以满足你的游戏需求。
图源:apple
在完全沉浸式体验中,一个常见的交互是抓取一个物体并把它放在与该物体相关的某个地方。例如,把电池放在一个插座上。Socket Interactor可以向玩家显示某个区域可以接受的一个对象。这些交互器并不附在手上,相反,它们放置在世界的某个地方。通过手部追踪甚至是控制器,用户自然想要进行的一种常见的交互类型是戳式(Poke)互动。这类似于Direct Interactor,不同之处在于它包括方向过滤,所以必须执行正确的运动才能触发交互。
图源:apple
如果你想让人们通过观看进行交互,Gaze Interactor可以为Ray Interactor提供一些扩展,使注视变得更容易处理。例如,Gaze Interactor可以自动地使互动对象的碰撞器变大,这样他们就更容易被选中。
为了将这一切结合起来,交互管理器会充当交互器和可交互对象之间的中间人,促进交互的交换。它的主要作用是在指定的已注册交互器和可交互者群体中启动交互状态的变化。通常,建立一个单一的交互管理器,以使所有的交互者都能影响所有的可交互者。另外,也可以利用多个互补的交互管理器,每个管理器都有自己独特的交互者和可交互者的组合。这些管理器可以被激活或停用,以启用或停用特定的互动集。例如,你可以在每个场景或菜单中使用一组不同的交互器。
最后,XR控制器组件可以帮助你理解收到的输入数据。它从手或追踪设备中获取输入动作,并将其传递给交互者,这样他们就可以根据该输入决定选择或激活什么。
你需要为每个XR交互状态(例如选择)绑定输入操作引用。这并不局限于每个手或控制器只能使用一个XR控制器组件,这使我们可以灵活地独立支持两个手和控制器。与XRI捆绑在一起的示例代码向你展示了如何做到这一点。
手势输入
除了XRI的高级功能外,你还可以选择直接使用Unity输入系统的系统手势输入。然后,你可以把平台的内置交互,如轻敲手势,映射到你自己的交互系统中。你可以使用Unity输入系统的绑定路径来访问和响应这些系统手势。
例如,捏合手势在激活时作为一个值出现,并带有位置和旋转。这些都可以被绑定到输入动作上。人们将注意力集中在与捏合手势相同的框架中,具有位置和旋转。为了获得更多的灵活性,你可以使用Unity Hands子系统,通过Unity Hands Package访问系统中所有的原始手部关节数据。
Unity Hands Package提供了对低级手部关节数据的访问,这些数据在各个平台上是一致的。例如,你可以编写代码来查看每个关节,并确定该姿势与某种手势的接近程度,如竖起大拇指或指向食指,并将这些转化为游戏动作。这很强大,但由于每个人的手大小不同,而且人们的动作范围也各不相同,所以要想做对是很有难度的。
这段代码定义了一个方法,告诉你用户的食指是否伸出。你可以从OnHandUpdate事件中调用这个方法,并传入其中一只手。首先,得到几个特定的关节来检查食指是否伸展。如果其中任何一个无效,它将返回false。如果所有的关节都有效,做一个简单的检查以确保食指没有弯曲。
你可以把这个逻辑扩展到其他手指,开始实现一些基本的手势检测。原始手部关节数据的另一个用途是将其映射到一个自定义的手部网格视觉。这可以帮助使手部更符合你的游戏艺术风格。例如,《Rec Room》使用原始手部关节数据来显示符合其视觉风格的风格化手部模型。他们还展示了其他玩家的手部模型,以增加沉浸感。
如果你想探索更多关于原始手部关节的信息,Unity Hands Package有一些示例代码可以帮助你入门。我很高兴看到你的VR体验来到了这个新的平台。要获得更多关于Unity对这个平台的支持信息,并注册早期的测试版访问权,请访问unity.com/spatial。
Christopher:这些是你可以使用的工具,使用你已经熟悉的Unity工作流程为这个新平台带来完全沉浸式的VR体验。
Peter:总而言之,这次演讲向你介绍了一些工具和技术,这些工具和技术将使你更容易把自己的VR内容带到这个新平台,就像《Rec Room》一样。如果你要开始一个新的项目,请使用Unity 2022或更新的版本。如果你有一个现有的项目,请升级到2022。你需要考虑采用通用渲染管线,虽然支持内置的图形管道,但所有未来的改进都将在通用管道上进行。以及,开始考虑将任何基于控制器的交互适应于手部。你可以从今天开始使用XR交互工具包和Unity Hands Package。
Christopher:最后,要了解更多关于如何使用Unity创建具有Passthrough功能的沉浸式体验,我推荐查阅“创建沉浸式Unity应用程序”。开发者们还可以查看“为空间计算建立伟大的游戏”,以了解游戏开发者在这个平台上的可能性。
Peter:我们很期待看到你会给这个平台带来什么样的内容。
Christopher:谢谢观看。
来源:apple