
-
将 SceneKit 项目移植到 RealityKit
了解为什么要弃用 SceneKit,并探索如何将你的 3D 项目迁移至 RealityKit 这一 Apple 推荐的高级 3D 引擎。我们将阐明弃用 SceneKit 对你的项目意味着什么,比较这两个引擎之间的关键概念,并向你展示如何将一个示例 SceneKit 游戏移植到 RealityKit。我们还将探讨 RealityKit 在所有受支持平台上拥有的巨大潜力,以帮助你为 App 和游戏打造出精彩的 3D 体验。
章节
资源
相关视频
WWDC25
WWDC24
WWDC23
-
搜索此视频…
大家好 欢迎观看本场讲座 我是 Apple 的软件工程师 Max Cobb 在开始之前 我想先带大家 简单回顾一下过去 如果你是 SceneKit 开发者 可能 还记得 Apple 多年前分享过的 一个有趣又充满灵感的示例游戏 在这个项目中 一只叫 Max 的小熊猫在火山场景中奔跑、 解谜、营救朋友 同时击退敌人 这个示例是用 SceneKit 框架构建的 它让开发者无需引入完整的 第三方游戏引擎 就能创建原生的 3D App SceneKit 已经存在很多年了 最早可以追溯到 OS X Mountain Lion 也就是 13 年前 自那以后 Apple 开发生态 已经发生了巨大变化 出现了新的编程范式、 新的硬件 以及全新的平台 换句话说 开发和使用 App 的方式已经发生了根本转变 SceneKit 的架构在当年非常合理 但随着生态不断演进 要在不破坏现有 3D 应用的前提下 让 SceneKit 跟上时代 变得越来越困难 因此 今年 Apple 正式宣布 在所有平台上弃用 SceneKit
但这对现有项目意味着什么? 我的 App 还能运行吗? 需要重写吗? 我该用什么替代? 接下来我们将详细解析 这次弃用 对 SceneKit 开发者意味着什么 首先 先澄清一点: 你不需要重写现有的 App 这次是软弃用 也就是说 现有使用 SceneKit 的应用 仍然可以正常运行 但如果你正在开发新 App 或计划进行重大更新 SceneKit 就不再是推荐选择
其次 SceneKit 现在进入了维护模式 Apple 只会修复关键性 bug 不会再推出新功能或性能优化 目前没有计划对 SceneKit 进行强弃用 如果未来有变 Apple 也会提前充分通知开发者
不过 如果你希望使用 Apple 最前沿的技术 以及软硬件深度集成的优势 RealityKit 是最好的选择
RealityKit 是一款现代、 通用的高级 3D 引擎 既强大又易用 支持多种行业标准 让你轻松打造出精美、 逼真的渲染效果 具备许多高级功能 可以让你的 App 大放异彩 它被广泛应用于第三方 App 和系统功能中 例如 mac 上的快速查看功能 只需轻点按钮即可预览 3D 模型 在 iOS 26 中 全新的 App Store 标签 是提升 App 可发现性 的一项重要更新 这些标签配有由 RealityKit 渲染的 3D 风格图标 比如在这个例子中 App Store 会推荐一组被标记为 “拥有出色 3D 图形”的游戏 在 iOS 中还有一项新功能: Swift Charts 使用 RealityKit 为数据可视化增添了第三维度
RealityKit 不仅适用于 visionOS 更是这个平台的核心 从 App 中的按钮到承载按钮的窗口 visionOS 上的一切都基于 RealityKit 构建 它让你的 App 内容 真实地融入 用户的现实环境
RealityKit 也将 SwiftUI 作为核心优先支持 SwiftUI 开发者可以 轻松上手、无缝集成 目前 RealityKit 支持 visionOS、 iOS、macOS 和 iPadOS 今年还首次登陆全新平台 —— Apple tvOS 为使用 RealityKit 构建的 App 和内容带来更多展示空间 这个框架在今年同样带来了 许多先进又令人兴奋的新功能 要想了解更多 请观看讲座 “RealityKit 的新功能” 由我的同事 Lawrence Wong 主讲 在今天的讲座中 我将帮助你了解 RealityKit 相较于 SceneKit 的工作方式、 核心差异和新的可能性 以及如何基于 SceneKit 经验 快速上手 我也希望让自己的游戏 变得更现代 为即将到来的新特性 和目标平台做好准备 因此 本次讲座将逐步讲解我如何 将这款有趣的 SceneKit 游戏迁移到 RealityKit 完整示例代码 也已提供下载 欢迎深入探索 以下是本次讲座的内容安排 首先 我会讲解这两个渲染引擎 在概念上的核心区别 以及如何与它们交互 接着 一款 3D 游戏 当然少不了酷炫的资源 我会介绍如何将现有的 SceneKit 资源 转换为 RealityKit 支持的格式 然后 我将演示搭建 RealityKit 场景时可以使用的工具 并逐项对比 SceneKit 与 RealityKit 的功能 从动画开始 我还会为场景添加动态光源 提升画面风格 加入自定义音效 增强沉浸感和个性 最后 通过粒子、后期处理等 视觉效果 为整体体验画上句号 这一切 正是我将游戏从 SceneKit 迁移到 RealityKit 所需要的 那我们正式开始吧 在概念层面 我会聚焦 四个关键方面: 架构、坐标系、资源和视图 先来看架构 SceneKit 是基于节点的架构 也就是说 场景中的每个对象 都是一个节点 而节点的行为通过 一系列属性来预定义
每个节点都可以包含 几何体、动画、音频、物理属性 和光源等功能属性
比如 当我创建一个空节点时 它没有几何体 也没有附加属性 默认位于它父节点的原点
如果我想在游戏中渲染 Max 只需将模型赋值给这个节点的 geometry 属性即可
当 Max 在场景中移动时 App 会为对应节点分配一个 动画播放器并播放动画
你听到的脚步声 则来自一个音频播放器 同样绑定在这个节点上
这就是节点式架构的工作方式 一切围绕节点和它的属性展开 相比之下 RealityKit 采用的是一种叫做 Entity Component System 简称 ECS 的设计模式 也就是说 场景中的每个对象 都是一个实体 可以通过为它添加不同的 组件来赋予它行为 RealityKit 中的每种行为 都是一个组件
从基础的变换到进阶功能 例如物理、粒子 甚至是传送门 而随着 RealityKit 的发展 可用组件的种类还在不断扩展 今年新增的组件包括图像呈现 和手势组件 这些架构上的差异 是在将 SceneKit App 迁移到 RealityKit 时需要特别注意的 接下来是个相对简单的部分 使用新渲染引擎前 必须先搞清楚它的坐标系
SceneKit 和 RealityKit 使用相同的坐标系统 因此转换起来很容易 在这两个系统中 x 轴指向右侧 y 轴向上 z 轴朝向摄像机
再来看资源部分 SceneKit 支持多种模型格式 并会将它们序列化为 .scn 文件 这确实很方便 但它并非行业通用标准 大多数格式都是专有的 功能支持不一致 会增加资源管线的复杂性
而 RealityKit 的设计则 围绕一个开放的行业标准展开 这就是通用场景描述格式 也就是 USD
USD 由 Pixar 于 2012 年推出 旨在解决素材创建管道中的 诸多难题 例如数据交换和 多方协作 这是 Apple 在所有平台上 采用的首选标准格式 我需要把游戏中的一些 SCN 文件转换成 USD 格式 接下来我们会详细讲解具体方法 不过在此之前 我想强调的 最后一个核心差异是视图 视图是应用界面的基本构建块 用来呈现部分内容 在 SceneKit 和 RealityKit 中 视图都是用来渲染 3D 内容的窗口
在 SceneKit 中 可以通过 SCNView 来渲染内容 如果使用 SwiftUI 则可以用 SceneView 还有 ARSCNView 可以配合 ARKit 将虚拟物体 呈现在现实世界中 而在 RealityKit 中 一切都更简单 只需要 RealityView 它从零开始设计 专为使用 SwiftUI 所习惯的 所有便捷特性而打造 用这一个视图 既可以构建完整的 虚拟场景 也可以将物体 放入现实世界 同一套内容可以在所有受支持的 Apple 平台上部署并自适应 在 visionOS 上甚至还能 自动实现立体渲染 无需改动代码 总结一下 从 SceneKit 迁移到 RealityKit 时 你需要掌握这四个核心概念: 架构、坐标系、资源格式、 视图系统 接下来 每款好游戏 都离不开出色的素材 那么让我们来看看 目前我的游戏中有什么 在素材资源目录中 我有一组 3D 模型 这些模型是以 SCN 文件格式保存的 这在 SceneKit 项目中非常合适 但我现在需要把这些资源 全部转换成 USD 格式 以便在 RealityKit 中使用 我给大家展示几种可行的做法 如果你手头有模型的原始文件 那会是最理想的选择 你的数字内容创建工具 简称 DCC 很可能对 USD 提供了良好支持 我用的是 Blender 因此可以 直接将模型导出为 USD 格式
但如果你没有原始文件 也有一些其他方法 可以将现有的 SCN 资源 直接转换为 USD 格式 其中一种方法可能最简单 就是直接在 Xcode 中转换 你只需选中一个资源 比如我这里选择的是 enemy1 然后前往 File > Export... 在导出选项中 选择 Universal Scene Description Package 也就是一种压缩过的 USD 文件格式
通过这种方式导出的结果 可能会因资源而异 但对我游戏中的大多数模型来说 这种方式效果很好 你可能还有一些动画是保存在 单独的 SCN 文件中的 这是 SceneKit 中常见的做法 比如在我的 SceneKit 游戏中 主角的动画效果 例如走路、跳跃、旋转 分别保存在不同的文件里 并且不包含几何信息 那么 如何把这些动画导出为 USD 并重新应用到模型上呢? 幸运的是 Apple 在 Xcode 26 中更新了一个 命令行工具 SCN tool 专门用于处理这个流程 我来演示一下怎么使用它 只需输入 xcrun scntool 就能调用 SCN tool
这样会列出所有可用选项 要进行转换 此时 只需输入 xcrun scntool --convert 指定要转换的 max.scn 文件 再用 --format usdz 来设置输出格式 这和我们之前在 Xcode 里将 SCN 文件 转化为 USD 的方式是一样的 要附加动画 只需对每个 要导出的 SCN 动画文件使用 --append-animation 比如这里是 max_spin
然后将结果导出到桌面
我们来看一下转换后的文件
很好 模型几何信息中已经包含了 动画 而且是 USD 格式 我对所有资源都做了同样的处理 并按照我的工作流程进行了整理 现在 我已经准备好 开始搭建整个游戏场景了 这就引出了下一个主题: 场景组合 借助 SceneKit 版本 在 Xcode 中 SceneKit 编辑器 帮助我把所有元素整合到一起 而在 RealityKit 中 也有一款 工具可以实现相同的目的 它叫做 Reality Composer Pro Reality Composer Pro 位于 Xcode 与我所用的 DCC 工具之间 例如 Blender 或 Maya 我可以用它来构建场景、 为实体添加组件、创建和 编辑着色器 并将场景准备好导入 Xcode 我可以将新转换好的 USD 资源导入其中 开始重新搭建我的游戏 Reality Composer Pro 随 Xcode 一起提供我现在就来打开它
我将创建一个名为 PyroPanda 的项目
Reality Composer Pro 会为我生成一个默认的空场景 接下来 我可以把刚刚转换好的 所有资源拖进项目中
要将它们添加到场景里 可以点按右键 选择“Add to Scene”
也可以将像 Max 这样的资源 直接从项目浏览器拖到视口中
添加之后 调整实体的位置也很简单 我可以使用这个控制器 将 Max 移动到游戏的起始位置 大概就在这里 Reality Composer Pro 是一款 非常实用的可视化场景编辑工具 可以用来编辑材质、着色器、 粒子、光源等内容 还记得我说过 Reality Composer Pro 处于 数字内容创作工具和 Xcode 之间吗? 现在 我要将内容导入到 App 中 也就是下一步要做的事 Reality Composer Pro 项目 本质上是一个 Swift 套件 我可以在 Xcode 中将它添加为本地依赖项 方法是进入项目的 Package Dependencies 点击“Add Local...”
然后选择我的 App 作为目标
接着 在内容视图的 Swift 文件 顶部引入 RealityKit 和 我刚添加的新套件 PyroPanda
我在 ContentView 中 添加一个 RealityView
接下来 我需要将场景作为实体加载 并指定它来自这个套件的资源包
最后 把这个实体添加到 RealityView 的内容中
我还会加入一个摄像头控制器 方便预览效果
之前我已经用 Reality Composer Pro 搭建好了整个场景 这是完整组合后的结果 我添加了剩下的模型 分配了纹理 还为熔岩、植物 以及其中一个敌人制作了 动态着色器 让这片火山环境更具生命力与个性 你可以查看完整的示例代码 了解这个场景中的每个部分 是如何构建的 Reality Composer Pro 功能丰富 如果想了解更多信息 推荐去看看 往年 WWDC 的这两个相关讲座 现在场景已经基本成型 接下来我要让小 Max 动起来 之前我在转换 Max 模型时 也附加了一段动画 当 USD 文件中包含动画时 RealityKit 会通过 AnimationLibraryComponent 展示这些动画 这样就可以在实体上 轻松访问并播放动画了 我将所有动画都集中保存在一个 名为“Max”的 USD 文件中
在 Reality Composer Pro 中 可以在检查器里看到 所有动画的引用
在项目中 只需通过这个组件中 定义的名称 就能触发对应的动画
在这个游戏的 SceneKit 版本中 播放旋转动画的流程是这样的 首先 在场景中找到 Max_rootNode 然后单独加载 spinAnimation 接着 遍历动画场景 直到找到 SCN 的动画播放器 并保存了对它的引用 然后把这个 animationPlayer 添加到 Max 上 命名为“spin” 最后在节点上播放这段动画 而在 RealityKit 中 通过 AnimationLibraryComponent 获取动画 就方便得多了 首先 通过名称找到 Max 实体 这里就是“Max” 然后从 Max 的组件集合中取出 AnimationLibraryComponent 并按名称选择目标动画 最后在这个实体上播放它即可 当 Max 在场景中移动时 我的完成的 App 会根据动作 播放不同的动画来呈现对应的行为 你可以查看 App 的源代码 了解这些是如何串联起来的 为场景营造真实感与氛围的 重要元素之一是光照 而合理运用光照 能让场景 呈现出截然不同的效果 在我的应用中 所有光照效果都可以 直接在 Reality Composer Pro 中完成 无需任何其他代码 我们来看一下具体操作 我可以轻点实体层级 底部的插入图标 选择添加一个方向光
这是一个仅包含 方向光组件的空实体 对于方向光来说 影响照明效果的只有它的朝向
我会把它放在这里 方便观察效果 然后绕 x 轴旋转一下
这个光源看起来还不错 但好像少了点什么 没有阴影! 在组件列表中 勾选这个选项 就能为方向光添加阴影组件
现在从起始位置看过去 可以清楚地看到地形和 Max 把阴影投射到了其余的场景中 用代码实现也是类似的流程 在 SceneKit 中 我会创建一个 SCNLight 设置类型为方向光 并将 castsShadow 设为 true 接着创建一个新节点 把这个 光源赋值给节点的 light 属性
在 RealityKit 中 我会创建 一个实体并添加两个组件 一个是方向光组件 另一个是方向光阴影组件 方向光只是 RealityKit 中的一种光源类型 除此之外还有点光源、聚光灯 和基于图像的光源 使用纹理贴图为场景提供照明 现在游戏的视觉效果更丰富了 接下来我会加入一些声音元素 让体验更具沉浸感 我们先来看一下这段在场景中 循环播放的环境音轨 在 SceneKit 项目中 我首先将环境音文件加载为音频源 然后 我可以修改这个音频源 的属性 从而更改它的播放方式 在这个示例中我想让它循环播放 而且我不希望它 在场景中或空间中出现位置感 也就是说音频音量不会随着 主摄像机与声音节点的距离而变化 最后 把音频播放器添加到 地形节点 并开始播放 在 RealityKit 中 访问音频文件的方式 和访问动画类似 也是通过组件 这次用的组件是 AudioLibraryComponent 更方便的是 我可以直接在 Reality Composer Pro 中完成 所有音频播放的配置 而无需等到 App 运行时再处理 我们来看看具体是怎么设置的 我已经在地形实体上附加了一个 AudioLibraryComponent 并引用了那段环境音频文件 由于我不希望这段音频 听起来像是来自某个具体位置 我还可以在同一个实体上添加一个 AmbientAudioComponent
这段音频资源比较长 RealityKit 的默认行为是 在运行时将整段音轨 预加载到内存中 我可以将默认行为改为 边播边加载 让音频流式加载资源
当音轨播放结束时 我希望它能自动从头开始 因此会勾选“Loop”(循环)选项
现在一切都已就绪 音频可以在 RealityKit 中播放了 播放的方式有两种 第一种是通过 AudioLibraryComponent
我可以先从地形实体的组件集中获取 AudioLibraryComponent 然后通过名称引用环境音资源 并在这个地形实体上播放它 RealityKit 会自动识别我在 Reality Composer Pro 中设置的参数 因此音频会以环境音的形式 流式播放 并自动循环 另外 我还可以用一个小技巧: 利用内建的实体动作 PlayAudioAction
使用这种方式时 PlayAudioAction 会自动查找目标实体上的 AudioLibraryComponent 并定位到指定名称的音频资源
我只需将这个动作转换成动画 并在同一个地形实体上播放即可
实体动作非常有助于 简化应用中的实际代码
我在游戏中用它来响应各种事件 例如主角跳跃或攻击时播放的 动作与音效
在本场讲座的最后 我想带大家看看 游戏中使用的一些视觉特效 视觉特效可以让 3D 场景从写实转变为 富有情感的体验 先从粒子效果说起 原版游戏中就制作了一些 非常不错的粒子特效 它们直接是在 Xcode 的 SceneKit 编辑器中完成的 并以 SCN 粒子文件形式保存 目前还没有工具能 将这些粒子文件直接转换为 RealityKit 可用的格式 但我可以在 Reality Composer Pro 中使用相似的设置 重新创建这些粒子效果 我们来看看在 Reality Composer Pro 中 编辑粒子效果的过程 我倾向于将粒子效果保存在 独立的 USD 文件中 因此可以在 Reality Composer Pro 中点击这里 新建一个文件 我将它命名为 volcano_smoke
接着 我在这个文件的根实体上 添加一个 ParticleEmitter 组件
点击组件上方的播放按钮后 默认的粒子就会开始显示
我可以从几个预设中进行选择 其中我最喜欢的是“Impact”
这个预设使用的贴图 非常适合烟雾效果 是制作这个特效的理想起点 这些设置和 SceneKit 中的 粒子系统很相似 只是有些细节略有不同
我将 Reality Composer Pro 中 的参数 与原游戏在 SceneKit 中的 粒子设置进行了对比 最终调出了一个在 RealityKit 中效果接近的 火山烟雾特效
现在已经完成 我把它拖到主场景中 看看和其他模型搭配起来的效果
太好了 这就是我想要呈现的效果 最后一步是后期处理 也就是在画面最终呈现在 App 中之前 为渲染结果添加最后的润色
在原版游戏中 相机应用了较强的泛光效果 让高亮区域在整个场景中 产生柔和的光晕 营造出一种超现实的氛围
这个效果是通过调整场景中 活动相机的几个属性实现的 虽然这种方式非常方便 但许多开发者 尤其是游戏开发者 通常更倾向于对这类效果 拥有更精细的控制 以兼顾性能和美术需求
那么 RealityKit 呢?
RealityKit 并没有提供 简单的属性来直接添加 这种泛光效果 是有意这样做的 不过从今年开始 你可以 在 iOS、iPadOS、macOS 和 Apple tvOS 上为 RealityView 添加 后期处理效果
虽然这需要一些设置 但你并不需要从零开始编写 所有 Metal 着色器 Apple 提供了一套高度优化的 Metal 性能着色器 可以直接使用 我将使用 RealityKit 的后期处理 API 来为游戏添加泛光效果 先从游戏的原始渲染纹理中 提取高亮部分 并将它们写入一个新的纹理 接着对这个纹理进行模糊处理 柔化边缘 最后将模糊后的纹理叠加回 原始图像上 就能实现泛光效果
要在 App 中实现这个效果 首先需要定义一个 BloomPostProcess 类型 它需要遵循 PostProcessEffect 协议
在 postProcess 方法中 我会创建一个临时的 Metal 纹理 用于写入泛光数据 接着 使用性能着色器 提取图像中最亮的部分 这正是我想让泛光出现的区域 我使用高斯模糊 对这个区域进行处理 最后 把模糊处理后的图像 叠加到原始纹理上 这些步骤的完整代码可以在 随附的下载资源中找到
要将这个效果应用到 RealityView 中 只需创建一个 BloomPostProcess 实例 然后把它添加到渲染效果中即可
这个效果为我的游戏增添了 非常出色的视觉收尾 整个场景变得更加生动 游戏体验也更加精彩 现在 我的 App 已经完全在 RealityKit 上搭建完成 它可以在 iOS、iPadOS、macOS 和 Apple tvOS 上以相同方式运行 凭借统一的核心代码和 一个 RealityKit 场景 我可以立即将这款游戏部署到 所有这些平台 让我给你展示一下这款游戏 在 RealityKit 最新支持的平台 Apple tvOS 上 的运行效果 其中支持手柄操作
现在 我可以在家中的 Apple TV 上畅玩 RealityKit 游戏了
在 visionOS 上 我还能添加一些更特别的效果 通过将场景放入一个 渐进式沉浸视图中 我可以在眼前打开通往 PyroPanda 世界的传送门 以完整 3D 的形式呈现整个场景
这种沉浸式体验 只有通过 RealityKit 和 visionOS 才能实现
让我们来回顾一下今天的内容 SceneKit 已被弃用 虽然这是一个重要的变化 但你无需立刻担心现有的 SceneKit 应用 未来最好的选择是转向 RealityKit 它可为 App 和游戏 带来独特的可能性 我介绍了 RealityKit 在概念方面的核心差异 以及 RealityKit 开发者 可以使用的工具 以及我将一款游戏从 SceneKit 迁移到 RealityKit 所采取的一些关键步骤
欢迎大家继续观看这些讲座 它们可以帮助你更好地利用 RealityKit 打造出色的 App 与游戏 你也可以参考往年的相关讲座 以及 RealityKit 官方文档 在这个示例 App 的下载包中 还包含更多我今天没来得及 讲到的内容 例如摄像头运动、 角色移动控制、以及手柄支持等 技术在不断演进 Apple 希望 SceneKit 的 弃用过程对开发者 来说尽可能平滑 我们对 RealityKit 的未来 充满期待 也迫不及待想看到 SceneKit 开发者在其中创造的新作品 感谢观看 祝你尽情享受 本次大会的其他精彩内容
-
-
16:33 - Animations in RealityKit
// RealityKit guard let max = scene.findEntity(named: "Max") else { return } guard let library = max.components[AnimationLibraryComponent.self], let spinAnimation = library.animations["spin"] else { return } max.playAnimation(spinAnimation)
-
18:18 - Directional Light Component in RealityKit
// RealityKit let lightEntity = Entity(components: DirectionalLightComponent(), DirectionalLightComponent.Shadow() )
-
24:37 - Create Bloom effect using RealityKit Post processing API
final class BloomPostProcess: PostProcessEffect { let bloomThreshold: Float = 0.5 let bloomBlurRadius: Float = 15.0 func postProcess(context: borrowing PostProcessEffectContext<any MTLCommandBuffer>) { // Create metal texture of the same format as 'context.sourceColorTexture'. var bloomTexture = ... // Write brightest parts of 'context.sourceColorTexture' to 'bloomTexture' // using 'MPSImageThresholdToZero'. // Blur 'bloomTexture' in-place using 'MPSImageGaussianBlur'. // Combine original 'context.sourceColorTexture' and 'bloomTexture' // using 'MPSImageAdd', and write to 'context.targetColorTexture'. } } // RealityKit content.renderingEffects.customPostProcessing = .effect( BloomPostProcess() )
-
-
- 0:00 - 开场
Apple 已在所有平台上正式弃用 SceneKit。现有的 SceneKit App 和游戏将继续正常工作,但今后只会接收关键的错误修复。建议开发者改用 RealityKit,这是一款现代且功能强大的 3D 引擎,它利用 SwiftUI,并在 visionOS、iOS、macOS、iPadOS 和现在的 Apple tvOS 上都受支持。
- 5:03 - 主要差异
SceneKit 和 RealityKit 是 Apple 3D 渲染引擎。SceneKit 基于节点,具有几何结构、动画、音频、物理和光源的属性。RealityKit 使用实体组件系统 (ECS),通过添加组件来修改实体。 两个引擎使用相同的右手坐标系。SceneKit 使用专有的 SCN 文件,而 RealityKit 则采用开放的行业标准 USD。
- 8:59 - 素材转化
过渡到 RealityKit 时,请考虑架构、坐标系、素材支持和视图。 资源,尤其是 3D 模型,需要从 SCN 转换为 USD 格式。最佳选择是从原始的 DCC 工具 (如 Blender) 直接导出。如果原始文件不可用,Xcode 会提供导出功能,但结果可能会有所不同。对于单独 SCN 文件中的动画,可以使用 Xcode 26 附带的 SCN 工具 CLI 将动画转换并附加到 USDZ 文件。
- 11:57 - 场景组合
Reality Composer Pro 是 Xcode 附带的一个工具,可协助 visionOS 项目的场景组合。它允许用户导入 USD 资源,排列实体,编辑材质、着色器和光源,并为 Xcode 准备场景。
- 15:21 - 动画
了解如何在 RealityKit 中为来自 SceneKit 的 3D 角色 Max 制作动画。将 Max 转换为包含动画的 USD 文件后,示例通过 Reality Composer Pro 中的 AnimationLibraryComponent 访问这些动画。与以前的 SceneKit 版本相比,这个过程更加简化,因为在以前的版本中,动画需要单独加载和管理。现在,你可以轻松找到 Max 实体,按名称选择所需的动画,然后在 App 中播放。
- 16:58 - 光效
Reality Composer Pro 中的光照功能非常强大,可以显著增强场景的真实感和氛围。使用这款 App,你可以轻松添加定向光、调整定向光的方向,并启用阴影以营造深度和立体感。 在 SceneKit 和 RealityKit 中,这一过程类似,RealityKit 还提供各种光源类型,包括点光源、聚光灯和基于图像的光源。
- 18:37 - 音效
SceneKit 项目通过添加环境音频来增强游戏的沉浸感。它将音频文件加载为音频源,将其配置为非空间循环,并附加到地形节点。 在 RealityKit 中,这个过程相似;将 AudioLibraryComponent 附加到地形实体,添加环境音频组件以禁用定位音频。为了优化内存使用,将音频设置为流式传输。
- 21:19 - 视觉效果
最后一部分介绍了如何在将 SceneKit 项目迁移到 RealityKit 时使用视觉效果。 这个示例首先展示了如何在 Reality Composer Pro 中使用名为“volcano_smoke”的 USD 文件创建粒子效果。开发者将 Reality Composer Pro 中的设置与 SceneKit 中的设置进行比较,在 RealityKit 中实现了类似的火山烟雾效果。 然后,示例进入后期处理阶段,为渲染的输出进行最终的润色。在游戏的原始 SceneKit 版本中,使用泛光效果在明亮的光源周围创建柔和的光晕。虽然 RealityKit 没有提供实现这一效果的简单属性,但现在你可以使用后期处理 API 为 RealityViews 添加后期处理效果。 示例通过提取高亮部分、进行模糊处理并将它们重新合成到原始纹理上来创建自定义泛光效果。这种效果增强了游戏的环境,使其更加生动。然后演示了该游戏在各种 Apple 平台上运行的情况,包括 iOS、iPadOS、macOS 和 Apple tvOS,展示了 RealityKit 的跨平台能力。