《LEGO Builder's Journey》是 Light Brick Studio 推出的一款多平台解谜游戏,自登陆 Apple Arcade 以来,逐渐积累了人气,发展势头强劲。对于将《LEGO Builder's Journey》适配到 Apple Vision Pro 平台,迎接空间计算的新时代,他们总结了一些重要的经验和心得。
本文将讲述一个初次涉足混合现实领域的工作室,如何在充分利用 Apple Vision Pro 的沉浸式特性的同时,确保游戏体验与其他平台(如移动端、PC 等)保持一致?他们在 20 个项目成员中有 6 人负责 Apple Vision Pro 的移植,在三个月内的时间,解决了渲染和优化难题,将《LEGO Builder's Journey》移植到 Apple Vision Pro。
由于乐高®积木是实物产品,Light Brick Studio 意识到在 Apple Vision Pro 上创建一种让玩家在房间内与游戏元素交互的体验十分具有挑战性。对于游戏的 Apple Vision Pro 版本发布,时间也是一个限制因素。虽然团队之前曾在一两个月内完成过其他平台的 2D 界面移植,但这次进入空间计算领域的三个月时间安排非常紧张。
探索新维度
“一旦了解了平台对游戏及其玩法设计的限制,你就几乎可以创造出任何想要的体验,” Light Brick Studios 的技术负责人 Mikkel Fredborg 解释说。
对于团队来说,将游戏移植到 VisionOS 平台“主要是一个技术挑战,既要让游戏流畅运行,又要充分利用平台的完整体验。”这意味着需要进行多项技术改进,包括对用户界面(UI)进行全面重新设计,将原本平面的 UI 元素放置在房间中。团队还需要更新他们的渲染工具和方法,以确保最终产品的视觉质量和沉浸感。同时,平衡 Unity 和 RealityKit 两个系统,进一步增加了性能优化的难度。
“我们做过很多不同平台的移植,但这次是最复杂的,因为 Apple Vision Pro 与其他平台有很大不同,我们的目标是探索能在多大程度上提升这种体验,结果非常成功。” Light Brick Studio 的总经理 Karsten Lund 说道。
成果
在不到 100 天的时间内为 Apple Vision Pro 构建了游戏的 80 个关卡和 60,353 块乐高积木。
在 Unity PolySpatial 团队的支持下,节省了数周的开发时间。
保持了所有游戏玩法区域的完整性,仅进行了特定的性能优化,没有改变游戏的整体节奏。
实现了流畅的过渡,采用开放式混合现实风格,随着游戏的推进,沉浸感逐渐增强。
重新设计 UI 和游戏玩法
《LEGO Builder’s Journey》的 UI 非常简洁,最多只有 20 个按钮,用于加载保存的游戏或重新开始关卡等操作,因此重新设计 UI 的工作量比许多游戏要小。团队在 Unity 中重新设计了 UI,采用了 GameObjects 并为其添加碰撞体,以确保输入功能正常工作,同时能模仿 VisionOS 的设计语言。
团队还需要考虑玩家身体移动的灵活性。除了 UI,游戏中的所有内容都是用一款名为 LEGO Digital Designer 的工具通过乐高积木构建的。团队过去一直尝试在 2D 平面上模拟 3D 空间,但在 Apple Vision Pro 上,他们必须考虑到玩家可以在任何位置移动。为了适应完整的360度体验,团队重新设计了原本只能从特定角度观看的模型,以确保模型几何中没有漏洞。为了减少绘制调用(draw calls),团队还将多个网格合并为单个 GameObjects。
Fredborg 表示:“我们考虑到了玩家要走来走去的情况,并对模型进行了完整的 360 度优化。在将积木导入游戏时,我们去掉了积木内部的所有几何结构,移除了所有内部细节,因为这些细节永远不会被看到。我们利用现有的自动化工具,并对其进行了调整,以适应完整的模拟体验。”
Light Brick Studio 团队在编辑器中设置 PolySpatial VolumeCamera 组件的 UI 和事件的截图
管理 Bounded 模式下的布局
在早期,团队决定在有界(Bounded)模式下进行设计,这意味着他们必须在一个定义的体积范围内操作。如果尝试在这个范围外操作,元素会被裁剪且不可见,团队决定接受有界模式的限制。在这种模式下,除非玩家进行交互,否则无法获取玩家头部、眼睛或手部的位置/方向信息。只有当玩家做出捏合手势时,游戏才能知道手的位置以及正在交互的对象。当捏合结束时,这些信息也会消失。从这个意义上说,它类似于触摸屏,只有在玩家触摸屏幕时才能知道他们在做什么。
Fredborg 表示:“我们不知道玩家在看什么,这是一个很大的变化,尤其是因为我们的游戏玩法需要玩家看着积木来选择它。我们解决了这些限制后,效果非常好,并且很好地融入了系统。最终,这种方式运行得非常顺畅,因为一切都朝着一致的用户体验方向发展。”
为 MaterialX 着色器提供支持
在《LEGO Builder's Journey》的最早版本中,团队使用了 Unity 轻量级渲染管线(LWRP)的自定义版本,随后在为 Xbox 和 PlayStation 移植时转向了高清渲染管线(HDRP)。为了适配 Apple Vision Pro,他们首先需要将所有内容转换为基于通用渲染管线(URP)和 Shader Graph 的版本,然后再迁移到 Apple 的 RealityKit。
为此,他们将 Shader Graph 中编写的着色器转换为 MaterialX 着色器,以便加载到 RealityKit 中。但团队遇到了一些障碍,发现结果并不理想,优化工作比预期的要多。
他们原本计划手动优化,但发现要实现自动化来满足规模化的需求。他们要手动修补着色器,找到重复的代码,然后替换这部分代码以确保它只执行一次。Fredborg 承认:“让一切顺利运行是一个挑战,但我认为 PolySpatial 团队在推动优化方面做得非常出色。”
寻找理想的光照效果
由于游戏的开发时间紧迫,团队需要快速找到解决方案。Fredborg 表示:“我们必须找到解决方案来提升游戏的逼真效果,同时支持实时光照和阴影。这是较大的改动之一。”
最初,他们采用了 Apple Vision Pro 的基于图像的光照(image-based lighting),目标是将其正确地应用到他们想要包含的材质上,比如塑料及其不同变体。他们还需要解决一些难以处理的元素,比如积木上的指纹和划痕。
由于游戏最初是为早期 iPhone 开发的,光照非常简单。团队使用了一种体积纹理(volume texture),就是带有烘焙环境光遮蔽(ambient occlusion)的 3D 纹理,以便可以从场景中的任何位置采样。他们会对点采样并分析环境光遮蔽的程度。由于 Apple Vision Pro 不支持 3D 纹理,他们需要将体积纹理转换为 2D 纹理,并从中手动采样。虽然这一过程目前在 PolySpatial 中已经自动化,但在 Light Brick Studio 团队刚开始处理还没有这个功能。
Light Brick Studio 团队在编辑器中设置夜间场景的截图
团队最初采用了塑料积木着色方式和体积纹理采样系统。随后,他们引入了实时光照(Realtime Lights)。当体积纹理逐渐充满整个场景时,他们需要调整外部光照。在开发初期,他们无法直接覆盖 RealityKit 的基于图像的光照,因此选择采样不同的立方体贴图,并让 RealityKit 的光照逐渐淡出。
Fredborg 解释说:“我们当时想实现的效果在技术上并不可行,但我们找到了一种变通方法:降低积木的光滑度,并在将其传递给 RealityKit 光照系统之前调整了不同的参数。现在,在 PolySpatial 和 RealityKit 中已经可以直接覆盖基于图像的光照,开发者将能更轻松地实现类似的效果。”
创建柔和的阴影
Light Brick Studio 团队还需要为阴影找到解决方案。虽然可以在 Apple Vision Pro 中为某些元素添加阴影,但这并不是标准功能。为此,团队在 Unity 中将阴影渲染为高度图(height map)或深度图(depth map),然后将其发送到 RealityKit 并重新采样。他们在 Unity 的 Metal 后端将场景渲染为阴影贴图(shadow map),然后将其传递到 RealityKit 的渲染端。
Fredborg 解释说:“如果还需要达到每秒 90 帧的渲染速度,其实能在渲染中实现的效果是有限的。我们使用了一个非常小的阴影贴图,64 x 64 像素,然后将 mipmap 级别组合到单个纹理的 RGBA 通道中,这样在 RealityKit 中只需一次采样就可以生成看起来像柔和阴影的效果。因此,当积木非常接近表面时,阴影非常锐利,但当它远离时,阴影变得更加柔和。我们用一次纹理采样实现了这一点。”
对于 Unity 中的实时光照(Realtime Lights),他们使用了 Shader Graph 中的PolySpatial Lighting 节点,该节点在被转换为 RealityKit 可处理的格式后,会扩展为多个 Shader Graph 节点。
Fredborg 表示:“对于 RealityKit,修改着色器的唯一方法是通过类似 Shader Graph 的界面。”在 Unity 端,团队发现可以在 Shader Graph 中创建自定义代码函数,只要遵循某些特定规则,之后就可以将其转换为 MaterialX 节点图。他继续说道:“这真的帮了我们大忙,否则 Shader Graph 里就会变得一团糟。”
将游戏的帧率优化到 90 fps
在团队将视觉效果推向新高度的同时,他们也遇到了一些保持平台流畅运行的难题。开发采用了双系统架构:所有内容从 Unity 传递到 RealityKit,而两者的渲染技术不同。这意味着Unity 负责处理游戏逻辑,而 RealityKit 负责渲染视觉效果,因此需要进行优化以实现 90 fps 的流畅运行。其中一个主要挑战是确定性能瓶颈是来自 Unity 端还是 RealityKit 端,团队需要多次尝试才能找到解决方案。
Fredborg 解释说:“最初,PolySpatial 工具包会将我们在 Unity 中做的所有内容都传递到 RealityKit,因此每个 GameObject 或变换都会被传递过去。当时我们无法关闭特定层的传递或反射。它会镜像所有内容,包括 UI 渲染、画布渲染和动画粒子系统。现在,有一个过滤器可以设置为不跟踪特定层,但在当时,我们必须找到一种方法来清理那些在 RealityKit 端不需要显示的内容。”
团队需要优化 GameObject 的层级结构。在其他平台上,每个乐高积木由三个或更多链接的 GameObject 组成,但在 VisionOS 上,团队将每个积木的 GameObject 数量限制为最多两个,以减少 Unity 和 RealityKit 之间的数据传递。这一优化效果显著,为团队带来了很大的成功。
提升定格动画(stop motion animation)的性能也是一个亮点。游戏中包含瀑布动画,这些瀑布通过交换积木上的网格实现,由数百个不同的 GameObject 组成,导致性能较慢。“我们最终采用了一种分步处理的方式,而不是为每个 GameObject 逐帧处理。我们会等待并在不同瀑布流之间每隔几帧处理一次。这大大提升了性能。”Fredborg 说道。
寻找合适的解决方案和合作伙伴
在为 Apple Vision Pro 开发应用的过程中,Light Brick Studio 团队必须保持灵活、快速解决问题,并通过不断迭代来完善应用。
Fredborg 说道:“我认为必须戴上头盔才能真正理解那种体验。我们建议进行多次构建,并尽可能多地使用真实设备进行测试,重点关注触摸和运动交互。虽然你可以在Mac上运行模拟器来了解应用的运行情况,但输入方式是不同的。这是一个更注重物理交互的平台。”
最终,团队对游戏的表现非常满意,很大一部分原因在于与强大的支持合作伙伴的合作。他继续说道:“Unity 的 PolySpatial 团队在 Slack 和 Discussion 论坛上都非常及时地回应我们。当我们遇到阻碍时,他们会迅速为我们提供解决方案,这非常有帮助。他们为我们提供了强大的支持,并希望我们能够打造出更高质量的 PolySpatial 版本。”
“只要是 Unity 支持的平台,我们就能让内容在上面运行。”——MIKKEL FREDBORG,LIGHT BRICK STUDIO 技术负责人
使用 Unity 引擎为 Apple Vision Pro 开发应用,欢迎联系我们, 通过与我们的团队交流,了解我们可以如何帮助您利用 Unity 的强大工具和工作流,打造引人入胜的空间计算体验。
Unity 官方微信
第一时间了解Unity引擎动向,学习进阶开发技能
每一个“点赞”、“在看”,都是我们前进的动力