Design interactive experiences for visionOS
Spatial Computing 进阶 20m

设计 visionOS 上的交互式叙事体验

Design interactive experiences for visionOS

2024年6月10日

在 Apple 官方观看视频

一句话判断

visionOS 上的交互式叙事不是”3D 版电影”也不是”站着玩的 VR 游戏”,它是一个全新的媒介——你需要同时学会讲故事和设计交互,并在两者之间找到平衡。

这场 Session 讲了什么

这场 Session 以苹果自家制作的 Encounter Dinosaurs( encounter 恐龙体验)为主线,分享了在 Apple Vision Pro 上设计交互式叙事体验的实战经验。交互式叙事把电影的叙事能力、游戏的互动性、以及现场演出的沉浸感合为一体。观众不再是被动的观察者,而是故事的参与者。

苹果的设计团队提出了三个核心议题:如何搭建场景(Setting)、如何用交互推动故事(Interaction)、如何让所有人都能参与(Accessibility)。在 Setting 部分,他们讨论了如何利用 visionOS 的 Window、Volume、Immersive Space 三种内容形态来讲述故事,以及如何根据用户的物理空间大小动态调整内容布局。在 Interaction 部分,他们分享了如何引导用户从”被动观看”过渡到”主动参与”,以及如何在给用户自由度和控制叙事节奏之间找到平衡。

这不是一个 API 密集的技术 Session,而是一堂关于空间叙事设计思维的课。如果你打算做 visionOS 上的沉浸式内容,这里的经验比任何代码模板都更有价值。

Session 中反复强调的一个原则是”testing on device changes everything”——你在电脑屏幕上精心设计的空间布局、交互节奏、视觉层次,戴上 Vision Pro 后感受可能完全不同。有些你觉得很酷的效果实际体验很晕,有些你觉得可能有问题的方案反而效果出色。苹果自己的团队也是在反复真机测试中才找到了 Encounter Dinosaurs 的最终方案。

值得深挖的点

空间自适应性:你的内容必须适配用户的现实环境

Vision Pro 可以在任何地方使用——客厅、公园、飞机上。你的内容布局不能假设用户有一个理想的空间。Encounter Dinosaurs 给出了一个很好的分级策略:

  • 大空间(大房间或户外):portal 展开到最大 4 米宽,沿平坦墙面放置。
  • 中等空间(较小的房间):portal 自动弯曲包围用户,保持沉浸感但不穿墙。
  • 小空间(飞机、公交等狭小环境):portal 放在固定距离处,同时调暗 passthrough 来维持沉浸感。

这个策略的技术基础是 ARKit 的场景理解能力——app 在启动时(隐藏在 credit roll 背后)扫描用户的空间,判断可用面积,然后选择对应的布局方案。关键原则是:你不可能适配所有空间,但你可以适配几种最常见的场景。

这背后的设计哲学是:不要让用户做”设置”——不要问”请把 portal 放在哪里”。系统应该自动找到最佳位置。用户打开 app 就应该立刻进入故事,而不是先完成一个房间配置向导。

交互引导:从”我不知道可以互动”到”忍不住想互动”

苹果在早期测试中发现了一个关键问题:很多用户以为 Encounter Dinosaurs 是一个纯被动的观看体验,根本不知道自己可以和恐龙互动。这是一个全新媒介特有的问题——电影不教你”如何看电影”,但交互式叙事必须教用户”如何参与”。

他们的解决方案是一个三层递进的引导系统:

  1. 显式引导:onboarding 图形明确告诉用户”这些生物能看到你,可能会对你做出反应”。
  2. 隐式引导:用一只蝴蝶角色自然地引导用户伸出手指——蝴蝶飞向用户,在面前盘旋,自然地邀请用户伸手。如果用户伸出手指,蝴蝶会短暂停在上面。这是一个教科书级别的”通过角色行为教授交互机制”的设计。
  3. 渐进增强:从低风险的交互(触摸蝴蝶)开始,逐步升级到更强烈的内容(直面霸王龙)。

这个设计思路的核心是:不要假设用户知道怎么交互。在传统游戏里可以用”按 A 键跳跃”这样的提示,但空间计算没有标准化的交互范式——你必须用叙事和角色来教。

在 Accessibility 方面,Session 提出了一些容易被忽略但很重要的设计考量。空间内容不应该假设用户站在标准身高位置——有人坐着,有人坐轮椅,有人个子矮。虚拟内容的位置应该根据用户的实际头部位置做调整,而不是假设一个”标准成人身高”。同样,交互设计不应该假设用户一定用双手——有人可能一只手抱着孩子,有人可能只有一只手可用。苹果建议在设计核心交互时,确保所有关键操作都能通过单手完成。

还有一个关于叙事和互动平衡的重要观点:最好的交互式叙事不是”让用户自由发挥”,也不是”完全按剧本走”,而是在两者之间找到一个动态平衡点。你需要给用户足够的自由度让他们感觉自己是故事的参与者,但同时在幕后控制好节奏和方向。苹果把它描述为”交响乐式的协作”——用户和创作者共同完成体验,任何一方都不应该压过另一方。

代码片段

这场 Session 以设计理念和经验分享为主,没有直接的代码示例。但以下是基于 Session 内容整理的关键技术要点:

利用 ARKit 做空间扫描(伪代码概念)

// 在启动画面(credit roll)期间进行空间扫描
// 利用 SceneReconstructionProvider 获取环境几何信息
let sceneProvider = SceneReconstructionProvider()
let anchor = sceneProvider.anchors.first { anchor in
    // 寻找足够大的平坦墙面来放置 portal
    return anchor.classification == .wall && anchor.extent.width >= 2.0
}

// 根据空间大小选择不同的 portal 配置
if let wallAnchor = anchor, wallAnchor.extent.width >= 4.0 {
    // 大空间模式:展开到最大
    configurePortal(size: 4.0, shape: .flat)
} else if let wallAnchor = anchor {
    // 中等空间:弯曲包围
    configurePortal(size: wallAnchor.extent.width, shape: .curved)
} else {
    // 小空间:固定距离 + 调暗 passthrough
    configurePortal(size: 2.0, shape: .flat, distance: 2.0)
    dimPassthrough()
}

场景:根据物理空间自适应调整沉浸式内容。坑:ARKit 扫描需要时间,一定要用一个有意义的过渡画面(如 credit roll)来掩盖等待。

交互层级设计的关键原则

// 第一层:低风险交互——吸引注意力
// 蝴蝶飞向用户,自然地邀请伸手
let butterfly = ButterflyEntity()
butterfly.perform(pattern: .approachUser, then: .circleNearUser)

// 当用户伸手时,给予正向反馈
butterfly.onProximityDetected = {
    butterfly.landOnFinger(duration: 0.5)
    // 这教会用户:"我的动作会引起反应"
}

// 第二层:中级交互——角色回应
// 恐龙注意到用户并做出反应
dinosaur.onUserGaze = {
    dinosaur.lookAtUser()
}

// 第三层:高强度交互——叙事高潮
// 霸王龙靠近,要求用户做出反应

场景:设计交互的渐进引导。坑:不要一上来就给用户高强度体验,否则用户会本能地退缩而不是投入。

最佳实践

新项目:在设计交互式叙事体验时,先确定你的”核心交互动作”是什么——用户最常做的那个动作。围绕它设计引导流程,确保用户在前 60 秒内就理解自己可以互动。空间布局方面,至少准备大、中、小三种空间适配方案。频繁在真机上测试,因为 spatial content 在屏幕上看起来和戴在头上完全不同。

已有项目:如果你已经有一个 visionOS 的 demo 或 MVP,检查两个问题:1)用户是否能在没有说明的情况下发现交互方式?2)内容在不同大小的空间里是否都能正常展示?如果答案是否定的,优先解决这两个问题。

还有什么值得关注

  • 苹果强调”一切都要在真机上测试”——你在屏幕上想象的效果和实际戴上 Vision Pro 后的感受经常大相径庭,有些你以为好的设计其实很糟糕,有些你觉得冒险的想法反而效果出奇。
  • Accessibility 方面,要考虑身高不同的用户、坐轮椅的用户、单手操作的用户——空间内容不应该假设所有人都站在标准身高位置用双手交互。
  • visionOS 的 Window、Volume、Immersive Space 三种形态可以组合使用,不用一开始就做全沉浸式体验。
WWDC 2024