Highlight
Reality Composer Pro 3 的 Script Graph(可视化节点脚本)让设计师无需编写 Swift 代码即可构建 visionOS 空间交互原型,支持在 Vision Pro 实机上实时调参迭代。
核心内容
从”写代码才能动”到”连线就能玩”
以前做 visionOS 原型,设计师画完草图,程序员要写一堆 RealityKit 代码实现手势响应、物理碰撞、动画触发。戴上 Vision Pro 测试发现拖拽灵敏度不对,回到 Xcode 改数字、重新编译、再戴上头显,循环极其低效。
Reality Composer Pro 3 用 Script Graph 改变了这个流程。Script Graph 是一套基于节点的可视化脚本系统,通过事件驱动逻辑来构建交互。你不需要写一行代码,在编辑器里拖拽节点、连线,就能监听手势事件、修改实体属性、驱动物理引擎。
(01:02)
实机预览让”手感”可调
空间交互最大的难点是”手感无法在 2D 屏幕上预测”。你在 Mac 上用鼠标拖拽觉得刚好的参数,戴上 Vision Pro 用手捏住一甩,体验完全不同。
Script Graph 的变量可以设为 public,暴露在实体的 Scripting Component 上。配合 Live Preview(今年晚些时候上线),设计师可以戴着 Vision Pro,在 Mac 虚拟显示器上直接修改参数值。演示中,演讲者把拖拽速度的乘数从 1.3 调到 1.5、再到 1.1、最后定在 1.15,全程不需要重新编译。
更关键的是 Override 机制:同一个 Script Graph 可以复用到多个实体上,每个实体有独立的参数覆盖值。这意味着场景里可以有多个”坚果”,它们共享同一套拖拽逻辑,但各自有不同的响应速度。
(05:37)
物理引擎也能节点化
拖拽一个物体如果只是直接设置位置,手感会很”飘”。Script Graph 支持接入 RealityKit 的物理引擎:给实体加上 Physics Body Component,然后用 Add Force 节点把拖拽的位移变化量(dragDelta)转换成力施加到物体上。
演示中,演讲者用 Set Variable 节点存储上一帧的拖拽位置,用当前位置减去上一帧位置得到位移差,再乘以一个系数输入 Add Force 节点。这样物体就有了惯性和抛物线效果,可以”抛”出去。
同时,用 Set PhysicsBodyComponent 节点可以在拖拽开始时关闭重力、提高线性阻尼(linear damping),让物体更容易控制;放下时恢复重力。整个物理交互的调参都可以在节点图里完成。
(08:34)
自定义事件打通 3D 与 SwiftUI
当玩家偷走松鼠的坚果时,松鼠需要说话抱怨。这个”说话”的触发在 Script Graph 里完成,但气泡 UI 用 SwiftUI 实现。
Script Graph 提供了 Send Scene Event 节点,可以发送带参数的自定义事件到场景级别。Swift 代码里通过 scene.subscribe(forEventName:) 监听这个事件,更新状态变量,再通过 RealityView 的 attachments 把 SwiftUI 视图挂载到 3D 实体上。
这种设计把”什么时候触发”交给设计师在节点图里编排,“UI 长什么样”交给程序员用 SwiftUI 实现,两者通过事件解耦。
(16:04)
详细内容
让实体可拖拽:基础节点组合
实现拖拽需要三个组件:
- Input Target Component:让实体成为手势的目标
- Collision Component:定义手势检测的碰撞体积
- Hover Effect Component:注视时显示高亮反馈
然后在 Script Graph 里用 On Drag 事件节点监听拖拽手势,把事件输出的 Scene Location 连接到 Set Transform 节点的 translation 输入。每次拖拽事件触发时,实体的位置就会被更新到手势所在的空间坐标。
(02:55)
用变量和数学节点调参
On Drag 节点输出的 Scene Translation 可以直接驱动位置,但手感可能不理想。演示中用了一个 Multiply by Number 节点对位移量进行缩放,并通过一个 public 的 Input 变量 dragSpeed 控制缩放系数。
在 Inspector 中创建 Input 变量时,可以设置类型(Number)、默认值(1.3)、访问权限(public)。设为 public 后,这个变量会出现在实体的 Scripting Component 面板上,方便实机测试时调整。
(06:28)
Prototyped Subgraph:复用逻辑
当节点图越来越复杂时,可以用 Subgraph 把一组节点打包成单个节点。选中相关节点,右键选择 Compose Subgraph,给子图命名即可。
如果需要跨多个 Script Graph 复用,可以进一步转换为 Prototyped Subgraph。转换后,子图会出现在项目资源浏览器中,并在添加节点菜单里作为一个标准节点可用。演示中把”检测布尔值是否发生变化”的逻辑封装成了可复用节点。
(11:32)
自定义事件库:跨实体通信
两个实体之间需要通信时,可以创建 Custom Event。首先在 Project Browser 中新建 Custom Node Library,在里面添加 Custom Event 并命名(如 nutIsDragged),然后添加属性(如 nutPosition,类型为 Vector)。点击 Sync Nodes 后,这个自定义事件就会出现在节点菜单中。
发送方用 Send “nutIsDragged” 节点,把 Nut 的世界坐标作为参数发出。接收方用 On “nutIsDragged” 事件节点监听,用收到的 nutPosition 驱动自身的旋转或材质变化。
(13:27)
从 Script Graph 触发 SwiftUI
在 Script Graph 中发送场景事件:
// SwiftUI 中监听场景事件并更新状态
if let scene = entity.scene {
scene.subscribe(forEventName: "squirrelTalk", on: { event in
if let sayThis: String = try? event.value("sayThis") {
self.sayThis = sayThis
}
}).store(in: &cancellables)
}
关键点:
subscribe(forEventName:on:)注册对指定名称场景事件的监听event.value("sayThis")按名称提取事件携带的参数值,类型必须匹配 Script Graph 中定义的类型.store(in: &cancellables)把订阅存入 Combine 的取消令牌集合,避免内存泄漏
把 SwiftUI 视图挂载到 3D 实体:
RealityView { content, attachments in
// 加载 3D 场景内容
} attachments: {
Attachment(id: "squirrelTalk") {
SquirrelTalkAttachmentView(text: sayThis)
}
}
关键点:
attachments闭包定义可以绑定到 3D 实体的 SwiftUI 视图Attachment(id:)的 ID 必须与代码中通过entity.components.set(AttachmentComponent)绑定的 ID 一致SquirrelTalkAttachmentView(text:)接收从场景事件解析出的文本,渲染对话气泡
(17:15)
核心启发
1. 快速验证空间交互原型
- 做什么:用 Script Graph 在 30 分钟内搭建一个可拖拽、有物理反馈的 3D 交互原型,直接在 Vision Pro 上测试手感。
- 为什么值得做:不需要写 Swift 代码就能验证核心交互是否成立,失败成本极低。
- 怎么开始:在 Reality Composer Pro 3 中导入 3D 模型,添加 Input Target + Collision + Hover Effect 组件,创建 Script Graph 连接 On Drag 和 Set Transform 节点。
2. 把物理反馈加入现有 App
- 做什么:给 visionOS App 中的可交互物体添加惯性和抛物线效果。
- 为什么值得做:直接设置位置的手感很假,Add Force 驱动的物理运动让交互更有”重量感”。
- 怎么开始:给实体添加 Physics Body Component,在 Script Graph 中用 Set Variable 存储上一帧位置,计算 dragDelta,通过 Multiply by Number 调节力度后输入 Add Force 节点。
3. 用 SwiftUI 做 3D 场景的 HUD 和对话系统
- 做什么:在 RealityKit 场景里用 SwiftUI 实现血条、对话气泡、任务提示等 2D UI。
- 为什么值得做:SwiftUI 的声明式语法比 RealityKit 的底层 UI 构建快得多,且可以复用现有组件。
- 怎么开始:在 Script Graph 中用 Send Scene Event 节点触发事件,Xcode 中用
scene.subscribe监听,通过 RealityView 的attachments把 SwiftUI 视图绑定到对应实体。
4. 构建可复用的交互组件库
- 做什么:把常用的交互逻辑(如”双击放大""注视高亮""拖拽吸附”)封装成 Prototyped Subgraph,在多个项目中复用。
- 为什么值得做:避免每次都从零连节点,保持项目间的交互一致性。
- 怎么开始:在项目中新建 Custom Node Library,把验证过的 Subgraph 转换为 Prototyped Subgraph,团队成员通过添加节点菜单直接调用。
5. 设计师与程序员协作的混合工作流
- 做什么:让设计师在 RCP3 里负责交互逻辑和事件触发时机,程序员在 Xcode 里负责 UI 实现和数据层。
- 为什么值得做:设计师不需要等程序员排期就能迭代交互,程序员不需要为每个微调动重新编译。
- 怎么开始:约定 Custom Event 的命名规范和参数类型,设计师用 Script Graph 编排事件流,程序员写事件监听和 UI 渲染代码。
关联 Session
- Reality Composer Pro 3 — Reality Composer Pro 3 的基础功能入门
- Reality Composer Pro 3 + Xcode — 将 RCP3 项目导出到 Xcode 的完整工作流
- RealityKit — RealityKit 框架的底层 API 和 ECS 架构详解
- SwiftUI — SwiftUI 在 visionOS 中的视图和附件系统
- Object tracking — 3D 物体追踪与空间锚定技术
评论
GitHub Issues · utterances