大多数浏览器和
Developer App 均支持流媒体播放。
-
为 Unity VR App 带来完全令人沉浸其中的体验
了解如何将现有的 Unity VR App 和游戏引入 visionOS。我们将探索可以帮助你入门的工作流程,并向你展示如何使用 Unity 输入系统在你的 App 和游戏中构建适合眼睛和双手进行操作的内容。了解 Unity 的 XR 交互工具包、注视点渲染技巧和最佳实践。
章节
- 0:01 - Intro
- 2:28 - Build and run workflow
- 3:15 - Prepare your graphics
- 5:56 - Input options
- 13:43 - Wrap-Up
资源
相关视频
WWDC23
-
下载
♪ 悦耳的器乐嘻哈 ♪ ♪ Christopher Figueroa:大家好 我是 Apple ARKit 团队的 Christopher Figueroa Peter Kuhn: 我是 Unity 团队的 Peter Kuhn Christopher:我们已经 把 Unity 的引擎和 XR 生态系统 引入到了这个新平台上 使得包括你在内的 Unity 开发者 能够更容易地开发你的项目 Peter 和我将给大家展示 如何使用 你已熟悉的 Unity 工作流 构建类似《Rec Room》的 完全沉浸式体验 你将从创建一个完全沉浸式风格的 沉浸式空间开始 让你的 App 能隐藏用户环境 带领用户进入另一个世界 在一场完全沉浸式体验中 Unity 使用编译服务器 为你的 App 提供了 Metal 渲染功能 Unity 还使用 ARKit 识别你的位置和周围环境 包括骨骼手势跟踪 Unity 建立在这些技术基础之上 在 Unity 引擎中提供同样的服务 在这个平台上 使用 Unity 创造沉浸式体验 主要有两种方法 第一种方法是 你可以用自己的环境 取代玩家的环境 在这个平台上创造一个 完全沉浸式 Unity 体验 第二种方法是 你可以把内容和环境融合到一起 创造与用户环境 融为一体的沉浸式体验 如果你对第二种方法感兴趣 推荐你观看视频 “创建沉浸式 Unity App” 下面 Peter 会为大家介绍 这些新的 Apple 技术 如何帮助 Unity 开发者 把完全沉浸式 VR 游戏 带到这个平台 Peter:谢谢 Christopher 首先 我想先向大家展示 Against Gravity 的 《Rec Room》 这是一个流行的 VR 社交平台 用户可以和来自世界各地的 其他玩家一起制作和体验游戏 Unity 游戏引擎 是《Rec Room》的开发基础 它为游戏开发提供了一个 强大而灵活的平台 我将给你介绍几种工具和技术 帮助你更轻松地在这个新平台上 制作你的 VR 内容 就和《Rec Room》一样 我会告知你一些 计划在这个新平台上制作 Unity 内容要记住的注意事项 首先我会介绍把 Unity 内容 部署到设备上的工作流程 你需要记住一些 平台图形相关的事项 最后我会谈谈如何 把控制器输入调整为手势输入 并为大家介绍一些有助于实现 这一转变的 Unity 工具 首先 我们要构建和运行一个 你应该已经熟悉的工作流程 我们已经在 Unity 中 置入了对这个平台的全力支持 所以只需要几个步骤 你就能看到你的项目 在这台设备上运行 第一步是选择平台的构建目标 然后像其他 VR 平台一样 启用 XR 插件 如果你的 App 依赖原生插件 这些插件需要针对这个平台 进行重新编译 反之 如果你使用的是 原始源代码或者是 .mm 文件 就不需要重新编译 和 iOS、Mac、 Apple TV 目标一样 使用 Unity 构建 会产生一个 Xcode 项目 然后 你可以从 Xcode 内部 把内容构建和运行 到设备或设备模拟器上 以加快迭代 你可能也很熟悉 把用户环境转换为 沉浸式体验的图形管线 但是有几个新概念 是必须要了解的 每个项目一开始都要做一个选择 那就是选用哪种渲染管线 通用渲染管线是一个理想选择 它能启用这个平台一个独特的功能 叫做注视点渲染
注视点渲染是一种技术 它把更多的像素密度 集中在每个镜头的中心 那里是视线更容易集中的区域 把更少的细节安排在屏幕外围 因为眼睛对这里的细节不敏感 这就让使用这台设备的用户 拥有了高质量体验 在你使用通用渲染管线的时候 静态注视点渲染 应用在了整个管线中 而且它能使用 URP 所有功能 包括后处理、 相机堆叠、高动态范围等 如果你有得益于注视点渲染的 自定义渲染管线 Unity 2022 有 新的 API 能够利用这项技术 由于现在渲染 是在非线性空间中发生的 所以就有了着色器宏来处理重映射 利用静态注视点渲染意味着 你要把资源安排在重要的像素上 制造高质量的视觉体验 在这个平台上 还有一个优化图形的方法 那就是使用单通道实例化渲染 在 Unity 中 单通道实例化渲染 支持 Metal 图形 API 并且默认启用 使用单通道实例化渲染 引擎给双眼只提交一次绘制调用 并且减少了渲染管线某些部分 如剔除和阴影的开销 这就减少了 渲染立体场景的 CPU 开销 好消息是 如果 你的 App 在其他 VR 平台 使用单通道实例化渲染 已经正确地渲染过了 着色器宏就能保障你的 App 在这个平台上顺利运行 我们还要考虑最后一件事 那就是要确保你的 App 正确地写入到了 每个像素的深度缓冲区 系统编译器使用深度缓冲区 进行重投影 凡是缺少深度信息的地方 系统就会呈现错误颜色指示 天空盒就是一个例子 它通常离用户无穷远 所以写入了反向 Z 来表示深度值为 0 App 要修改缺少的深度信息 才能出现在设备上 我们已经修复了 Unity 的 所有着色器 使其向深度缓冲区写入正确的值 但是如果你有任何自定义效果 例如自定义天空盒、 水的特效或者透明特效 请确保每个像素的深度缓冲区 都写入了一定的值 你把图形渲染到设备上后 就可以着手提高它们的交互性了 这台设备的交互方式很独特 用户使用双手和眼睛 进行内容互动 在这个平台上 你可以通过几个方式 为你的 Unity App 增强交互 XR 交互工具包 添加了手部跟踪功能 这让你更容易适应现有项目 你也可以借助 Unity 输入系统和 内置的系统手势互动 你还可以通过 Unity Hands 软件包 获得原始手部关节数据 设计自定义交互方式 XR 交互工具包也被称为 XRI 提供了一个高级交互系统 工具包的设计使得 输入向交互的转化变得更容易 XRI 同样适用于 3D 和 UI 对象 XRI 抽象出了 类似手势跟踪的输入类型 把这种输入类型转化成了 你的 App 能够响应的动作 这就意味着你的输入代码 可以在 接受不同类型输入的平台上运行 不管是 3D 空间 还是 3D 空间世界的 UI XRI 让悬停、抓取和选择等 常见交互方式的响应 变得更加简单 XRI 还有一个运动系统 这样用户可以更加舒适地 在完全沉浸式空间中遨游 在用户与你创建的世界互动时 视觉反馈是创建沉浸感的重要因素 XRI 让你能够定义 每个输入约束的视觉反应 XRI 的核心是一组基本的 可交互和交互器组件 可交互对象 在你创建的场景中接收输入 你为交互器定义 交互器指定 用户与可交互对象的交互方式 交互管理器 把两种类型的组件联系在一起 我们首先要确定 这个场景中的可交互对象 以及交互方式 通过给对象添加可交互组件 我们可以实现这一点 有三种内置类型 Simple 组件把对象标记为接收交互 你可以使用这个组件 订阅 SelectEntered 和 SelectExited 等事件 当我们选中或抓取物体时 Grab 组件能让 该物体随着交互器移动 并在释放后维持着这个速度 TeleportArea 和 TeleportAnchor 等传送组件 能让你定义 玩家传送到的区域和目标点 你还可以创建自己的 自定义交互对象 交互器负责选择或者 与你已经标记的可交互对象互动 它们定义了一系列 可能在每一帧上悬停或选择的 可交互对象 交互器的类型有以下几种 直接交互器 选择与之接触的可交互对象 如果你想知道用户的手 什么时候接触到可交互对象 或者当用户靠近可交互对象的时候 你可以使用其中一个组件 射线交互器用于远距离互动 这是一种高度可配置的交互器 既可以使用直线 也可以使用曲线 还可以自定义可视化 帮助适配你项目的视觉风格 用户互动的时候 你可以决定互动方式 举个例子 如果是抓取互动 你可以把物体移到用户手边 而且 射线交互器能够 限制抓取的自由度 来匹配你的玩法需求 在一场完全沉浸式体验中 一个常见互动是抓取一个物体 并把这个物体 放在与之相关联的某处 比如把电池放在插槽里 套接交互器展示了 某个区域刚好可以容纳这个物体 这些交互器没有连接到用户的手上 而是存在于这个世界的某个地方 使用手势跟踪或者控制器 用户自然而然地想要执行 一种常见的交互类型 那就是手指触控 这种交互器和直接交互器有点相似 只是方向滤波技术的存在 让用户必须执行正确的动作 才能触发互动 若你想让用户通过观看来进行互动 凝视交互器对射线交互器 作了一些扩展 让凝视变得更容易处理 例如 凝视交互器可以自动放大 交互对象的对撞机 这样交互对象变得更容易选中 交互管理器充当 交互器和可交互组件的中间人 把所有组件组合到一起 便利了交互方式的交换 它的主要作用是在一组指定的 注册交互器和可交互组件中 启动交互状态的变化 我们通常建立一个单一交互管理器 让所有交互器组件 都可能影响所有可交互组件 或者 我们可以使用 多个互补的交互管理器 每一个都有自己独特类别的 交互器和可交互组件 我们可以激活或停用这些管理器 来驱动或禁用成套的互动 例如 你可以在不同的场景 或者你的菜单中 使用不同的可交互组件 最后 XR 控制器组件 帮你处理你接收的输入数据 它获取来自用户手部 或跟踪设备的输入动作 然后把这些动作传送给交互器 随后交互器基于这些输入动作 执行选择或启用的命令
你将需要为每一个 XR 交互状态 比如 Select 绑定 Input Action References 每只手或者每个控制器 不需要限制 只使用一个 XR 控制器组件 这样这些组件 可以分开支持手和控制器 XRI 捆绑的样本代码 向你展示了如何做到这一点 除开 XRI 的高级功能 你也可以简单地选择 直接使用 Unity 输入系统的 系统手势输入 你可以把平台的内置交互方式 如轻点手势 映射到你自己的交互系统 你可以使用 Unity 输入系统的绑定路径 来访问和响应这些系统手势 例如 当我们激活一个带有位置和 旋转角度的张合手势的时候 它会作为一个值通过 这些方式可以绑定到输入动作中 和带有位置和旋转角度的 张合手势一样 用户专注的地方 会以同样的框架通过 通过 Unity Hands 软件包 你可以使用 Unity Hands 子系统 来访问系统的 所有原始手部关节数据 Unity Hands 软件包提供了 访问低层次手部关节数据的路径 这些数据在不同平台上是一致的 例如 你可以编写代码查看每个关节 确定这姿势和某些手势的接近程度 如竖起大拇指 伸出食指 然后把这些姿势转变为玩法动作 这种方法强大而有挑战性 因为用户的手大小不同 移动范围也不同 这段代码定义了一个方法 告知你食指是否伸展 你可以从 OnHandUpdate 事件中 调用这个方法并传入手部 首先 检查几个特定关节代码 确定食指是否伸展 如果其中任何一个代码无效 检查就会终止 如果所有的关节代码都有效 简单地检查一下 确保食指没有弯曲 同样的逻辑可以运用到其他手指上 以此来进行一些基本的手势检测 原始手部关节数据的另一个用途是 将其映射到自定义的手部视觉网格 这样能让手部 更适合你游戏的艺术风格 例如 《Rec Room》使用原始手部关节数据 展示一个适合自己视觉风格的 别具风格的手部模型 它还向其他玩家展示手部模型 来增加沉浸感 如果你想探索更多 关于原始手部关节数据的访问 你可以从 Unity Hand 软件包的 一些样本代码开始着手 我很期待能在这个新平台上 看到你的 VR 体验 如果你想了解更多关于这个平台的 Unity 支持的相关信息 或者想注册早期 Beta版 请访问 unity.com/spatial Christopher:使用这些工具 你能使用已经熟悉的 Unity 工作流程 在这个平台上 制作完全沉浸式的 VR 体验 Peter:回顾一下 本节讲座为你介绍一些工具和技术 能帮你更简单地把你的 VR 内容 带到这个平台上 就像《Rec Room》一样 如果你准备开启一个新项目 请使用 Unity 2022 或者更高版本 如果你有现有的项目 请升级到 2022 版本 考虑采用通用渲染管线 尽管内置图形管线也受到支持 但是未来所有的改善 都会在通用管道中进行 开始把基于控制器的互动 调整为手部互动 你可以从今天开始使用 XR 交互工具包和 Unity Hands 软件包 Christopher:最后 如果你想进一步了解更多关于 如何使用 Unity 来 创造环境沉浸式体验的相关信息 请查看视频 “制作沉浸式 Unity App” 你可以查看视频 “制作出色的游戏 了解空间计算” 概览游戏开发者 可能在这个平台上的收获 Peter:我们期待在这个平台上 看到你的 VR 内容 Christopher:感谢观看 ♪
-
-
12:46 - Translate raw joints into gameplay actions
// Translate raw joints into gameplay actions static bool IsIndexExtended(XRHand hand) { if (!(hand.GetJoint(XRHandJointID.Wrist).TryGetPose(out var wristPose) && hand.GetJoint(XRHandJointID.IndexTip).TryGetPose(out var tipPose) && hand.GetJoint(XRHandJointID.IndexIntermediate).TryGetPose(out var intermediatePose))) { return false; } var wristToTip = tipPose.position - wristPose.position; var wristToIntermediate = intermediatePose.position - wristPose.position; return wristToTip.sqrMagnitude > wristToIntermediate.sqrMagnitude; }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。