通过结合使用RealityKit或Metal创建的内容和空间,构建全面沉浸式体验。
概述
全面沉浸式体验将人们看到的所有东西替换为你创建的定制内容。你可能使用这种类型的体验来:
- 提供临时过渡体验
- 为你的内容创建无干扰的空间
- 实现虚拟现实(VR)游戏
- 呈现一个可供探索的虚拟世界
在全面沉浸式体验中,你负责屏幕上显示的所有内容。系统隐藏透视视频并显示你提供的内容,仅当手进入视野时才显示用户的手。为了获得最佳性能,使用RealityKit或Metal创建并动画化你的内容。
通常,你会将全面沉浸式体验与其他类型的体验结合使用,并在它们之间提供过渡。当你首先显示一个窗口,然后提供进入你的沉浸式体验的控制时,你给人们准备过渡的时间。这也给他们提供了一个选择,如果他们更喜欢使用你应用的窗口,可以跳过体验。
为你的应用的过渡做好准备
给人们对何时进入或退出全面沉浸式体验的控制,并在进入和退出这些体验时提供清晰的过渡。清晰的视觉过渡使得适应这样的大变化变得更容易。突然的过渡可能会令人感到不适,不愉快,或者让人认为出了什么问题。
在启动时,显示窗口或其他允许用户看到周围环境的内容。向那些内容添加控制以启动到全面沉浸式体验的过渡,并清楚地指出这些控制的功能。在你的体验中,提供明确的控制和说明如何退出体验。
警告
当你开始一个全面沉浸式体验时,visionOS定义了一个系统边界,该边界从人头部的初始位置向外延伸1.5米。如果他们的头移出了该区域,系统会自动停止沉浸式体验并重新打开外部视频。这个功能是一个助手,帮助防止人们与物体发生碰撞。
打开沉浸式空间
要创建全面沉浸式体验,打开一个ImmersiveSpace并将其样式设置为full。沉浸式空间是一种让你在人们周围环境的任何地方放置内容的SwiftUI场景类型。将full样式应用到场景,告诉系统隐藏透视视频并只显示你应用的内容。
在你的应用对象的body属性或你管理的任何SwiftUI场景中声明空间。以下示例显示了一个带有主窗口和全面沉浸式空间的应用。在启动时,应用显示窗口。
@main
struct MyImmersiveApp: App {
var body: some Scene {
WindowGroup() {
ContentView()
}
// Display a fully immersive space.
ImmersiveSpace(id: "solarSystem") {
SolarSystemView()
}.immersionStyle([.full])
}
}
要显示一个ImmersiveSpace,使用openImmersiveSpace动作打开它,该动作可以从SwiftUI环境获取。此动作异步运行,并使用提供的信息查找和初始化你的场景。以下示例显示了一个打开solarSystem标识符的空间的按钮:
Button("Show Solar System") {
Task {
let result = await openImmersiveSpace(id: "solarSystem")
if case .error = result {
print("An error occurred")
}
}
}
一个应用一次只能显示一个空间,当另一个空间可见时,尝试打开一个空间是错误的。要关闭已打开的空间,请使用dismissImmersiveSpace操作。
使用RealityKit绘制你的内容
当你的内容由基本形状或USD文件中的现有内容组成时,RealityKit工作得很好。使用RealityKit实体组织你的场景内容,并使用组件和系统对该内容进行动画处理。使用Reality Composer Pro以可视化方式组装你的内容,并将动态着色器,动画,音频和其他行为附加到你的内容。在你的场景中在RealityView中显示RealityKit场景的内容。
要在运行时加载一个Reality Composer Pro场景,获取你的Reality Composer Pro包文件的URL,并加载你的场景的根实体。以下示例显示了如何创建位于应用bundle中的包的实体:
import MyRealityBundle
let url = MyRealityBundle.bundle.url(forResource:
"MyRealityBundle", withExtension: "reality")
let scene = try await Entity(contentsOf: url)
使用Metal绘制你的内容
创建全面沉浸式场景的另一种选择是使用Metal自己绘制所有内容。当使用Metal来绘制你的内容时,使用Compositor Services框架将该内容放置在屏幕上。Compositor Services提供了你需要设置Metal渲染引擎并开始绘图的代码。
有关如何使用Metal和Compositor Services渲染内容以及管理与你的内容的交互的详细信息,请参见使用Metal绘制全面沉浸式内容。