Design great visionOS apps
Spatial Computing 进阶 20m

打造出色的 visionOS 应用体验

Design great visionOS apps

2024年6月10日

在 Apple 官方观看视频

一句话判断

visionOS 上最好的 App 不是把 iPad 版搬过来,而是找到了”只有空间计算才能做到”的那个瞬间——Session 通过 JigSpace、Loona、Lowe’s 等实际案例给出了三条可复用的设计策略。

这场 Session 讲了什么

这场 Session 不是 API 教学而是设计方法论。苹果的设计团队在过去一年里跟多个开发者深度合作,总结了 visionOS 上做好 App 的三个核心方向。

第一个方向是”找到你的 Key Moment”——每款 App 都应该有一个为 visionOS 特别优化的高光体验。正念 App 的呼吸花是系统级的例子,JigSpace 的 3D 拆解是第三方例子。关键是这个体验必须”只有空间计算才能做到”。

第二个方向是”拥抱沉浸感的多种层次”。沉浸不只是 Full Immersion 把人带到虚拟世界,还包括让虚拟内容融入真实空间(Super Fruit Ninja 的果汁溅到墙上),以及用空间音频创造临场感。

第三个方向是”用细节把质量推到极致”。材质、动画、手势反馈、音效——每一个微小元素都经过反复打磨。Loona 团队做了大量 2D 原型测试,最终把 iOS 上的放松 App 变成了 visionOS 上的 3D 拼图游戏。

值得深挖的点

找到 Key Moment:三种策略

让不可能成为可能——JigSpace 的做法。他们在 visionOS 上展示喷气式发动机的 3D 模型,你可以一层层拆开看内部的电气线路,这在 PC 上也能做但在空间计算上有本质区别:模型在你的手边、真实大小、可以用手势直接操控。关键是资产质量必须做到照片级真实,否则说服力大打折扣。

用原型探索新可能——Loona 的做法。他们的 iOS App 是 2D 放松动画,移植到 visionOS 最直觉的做法是做一个窗口化的视频播放器。但团队做了大量原型测试,从 2D 草图到 3D 模型,最终发现”拼图”这个交互形态在空间计算上最自然:拿起、悬停、放入,用手势完成。这个探索过程耗时但必要。

做互补而非完整——Lowe’s 的做法。他们的 iOS/iPad App 功能非常全面(库存查询、门店地图、产品计算器),但在 visionOS 上只做了一件事:Style Studio。你在沉浸式 3D 厨房里定制从后挡板到电器的所有元素。功能子集但体验完整,而且跟其他平台联动——你在 Vision Pro 上保存的设计板会同步到手机上购物。

沉浸感不只是”全沉浸”

Session 反复强调一个观点:不要默认每个 visionOS App 都要做 Custom Environment。沉浸感有多种层次,选错层次反而适得其反。

Super Fruit Ninja 的做法很值得参考:他们没有把玩家传送到虚拟水果世界,而是让水果在你真实的房间里飞。切开水果后,果汁溅到你的墙上和地板上,残渣会在真实表面上弹跳。设备传感器扫描你的房间布局,所以每次玩的效果都不一样。Truffles 小猪会在你的桌子和床上跳来跳去。

空间音频是另一个被低估的沉浸维度。visionOS 的传感器理解你房间的物理特性(大小、材质),然后给声音加上匹配的混响,让虚拟物体听起来”真的在你身边”。Session 建议:不要把音频只当成背景音乐,要把它当作引导、鼓励和奖励用户的工具。

代码片段

这场 Session 主要是设计指导,没有直接代码示例。以下是基于 Session 建议的实践代码模式:

用 ARKit 和 RealityKit 构建空间体验

// 利用 ARKit 的场景理解让虚拟内容与真实空间互动
let session = ARKitSession()
let planeProvider = PlaneDetectionProvider(alignments: [.horizontal, .vertical])
try await session.run([planeProvider])

for await update in planeProvider.anchorUpdates {
    // 在真实表面上放置虚拟物体
    let planeAnchor = update.anchor
    let entity = ModelEntity(mesh: .generateSphere(radius: 0.1))
    entity.transform = Transform(matrix: planeAnchor.originFromAnchorTransform)
    sceneAnchor.addChild(entity)
}

场景:在检测到的真实表面上放置虚拟物体,让内容融入物理空间。坑:ARKit 需要世界感知权限,Info.plist 要配置 NSWorldSensingUsageDescription

空间音频配置

// 让虚拟物体发出有空间感的声音
let audioResource = try await AudioFileResource(named: "splash.mp3",
    configuration: .init(
        spatialAudio: .init(
            directivity: .beam(focus: 0.8),
            reverbBlend: 0.3
        )
    )
)
entity.playAudio(audioResource)

场景:虚拟水果被切开时的空间音效,声音会根据用户头部位置和房间大小自动混响。坑:音频文件需要是 mono 格式才能获得最佳空间效果。

最佳实践

已有项目迁移:如果你的 App 已有 iPad 版,不要做简单的窗口移植。用 Lowe’s 的策略:挑一个最适合空间计算的功能子集,做成沉浸式体验。如果 App 涉及 3D 内容展示,用 JigSpace 的思路重新设计交互方式。

新项目起步:先用原型验证 Key Moment。不必一开始就写正式代码,用简单模型和基础手势测试核心交互是否成立。Loona 团队做了大量 2D 草图才发现拼图是最合适的形态——这个探索阶段不能省。如果预算有限,优先在空间音频上投入,性价比最高。

还有什么值得关注

  • visionOS 上的视觉质量门槛比其他平台高——3D 模型必须做到照片级真实才能产生说服力。
  • 手势设计要用系统标准手势(tap、hover、release),不要自创手势。
  • App 的核心功能如果是”看内容”,用窗口模式就够了;如果是”做事情”,考虑引入空间交互。
WWDC 2024