在使用双渲染融合(实验性)功能时,有一些额外的注意事项需要考虑。
眼镜连接/断开
双渲染融合允许开发人员构建将 XR 作为智能手机移动体验扩展的应用程序。因此,有必要检查在 XR 眼镜未连接时,应用程序是否按预期运行。最简单的方法是订阅 Fusion Lifecycle Events 组件提供的事件。
注意事项
开发应用程序时需要考虑的一些额外问题包括:
● 应用程序在启动时眼镜断开和连接时分别是什么样子?
○ 利用 On OpenXR Started 和 On OpenXR Stopped 事件,它们会在 XR 内容可用或不可用时发出信号。
○ On OpenXR Available 和 On OpenXR Unavailable 事件会发出信号,指示眼镜是否可用,以及启动 XR 内容的调用是否能成功
○ 如果 XR 内容不可用,请禁用它!
● 如果眼镜“现在”断开连接,应用程序会如何表现?
○ 当眼镜断开连接时,会触发 On OpenXR Stopping、On OpenXR Stopped 和 On OpenXR Unavailable 事件。
○ 在断开连接时,应用程序应立即停止使用任何 XR 感知功能。在停止后,调用这些功能将会失败。
○ 请通知用户在 XR 内容不可用时需要重新连接眼镜。
● 如果用户按下眼镜上的电源按钮,应用程序会如何表现?
○ 通常,这会导致 XR 内容被暂停。但请注意,应用程序仍然在智能手机的前台运行。如果眼镜因放在桌子上而进入睡眠状态(接近传感器超时),也会发生类似的行为。
○ 请监听 On Idle 和 On Active 事件。 如果 XR 内容不可见,可以考虑降低其优先级。可以考虑暂停内容更新或减少高强度部分的运行频率。
● 如果用户按下智能手机上的主页按钮,应用程序会如何表现?
○ 这通常会被 Unity 处理为暂停。与普通的 Snapdragon Spaces 项目不同,使用双渲染融合时,这意味着 XR 内容会被停止,同时智能手机应用程序也会被置于后台。有关更多信息,请参见应用程序后台处理。
● 用户是否有可能在不支持双渲染融合(MR/VR 全合一头戴设备)的设备上运行此应用程序?结果会是什么样的?
○ 可以使用 On Host View Enabled 和 On Host View Disabled 事件来获取来自 Spaces Host View 组件的信息。
○ 这些事件会指示是否有能够显示双渲染融合内容的智能手机可用。
○ 如果智能手机内容无法使用,请确保禁用任何不可用的 UI 元素。
故障排除
应用程序仍然没有按预期运行?以下是一些提示和技巧,帮助您解决问题并使开发工作回到正轨:
场景切换
请特别注意关于动态 OpenXR 加载器、Spaces Glass 状态、Spaces Host View 和 Fusion Lifecycle Events 组件在场景切换中的说明。
动态 OpenXR 加载器、Spaces Glass 状态和 Spaces Host View 组件旨在保持在场景切换中继续存在,并会被自动标记为 DontDestroyOnLoad。这意味着这些组件需要附加到层级视图中的根级别游戏对象上。
Fusion Lifecycle Events 组件不打算在场景切换中继续存在,因此不应标记为 DontDestroyOnLoad。它应根据每个场景的需要进行配置,以处理 XR 或智能手机内容的启用和禁用。
断开连接导致的功能丧失
默认情况下,动态 OpenXR 加载器会处理 XR 内容不可用时 AR Session 和 AR Session Origin/XR Origin 游戏对象的启用和禁用。其他游戏对象可以通过 Fusion Lifecycle Events 根据应用需求进行禁用。但需要考虑禁用某些组件的影响。
例如,建议在 XR 内容不活跃时,不要禁用 Input Action Manager 和 Event System 组件。项目验证窗口会对此发出警告。
点击“编辑”将会在控制台中记录有关问题的详细信息,并提供解决方法。
示例
在上述示例中,当眼镜断开连接时,禁用名为“Sample Object To Be Disabled”的游戏对象会导致子对象 XR Interaction Manager 上的 Input Action Manager 或 Event System 组件被禁用,这将使智能手机无法响应触摸屏输入。
● 如果确实需要禁用“Sample Object To Be Disabled”,应将存在问题的子对象重新归属到其他父对象下。
● 另外,也可以考虑重命名 XR Interaction Manager 对象,因为它不仅影响 XR 内容的交互。
在为应用程序构建层级结构时,必须考虑 XR 生命周期事件导致的每个组件禁用的影响。
虽然很难列出所有可能的问题组件,但在验证步骤中监控的组件列表会随着问题的发现而不断增加。
运行时诊断日志
双渲染融合功能在尝试访问不可用的 XR 功能时,可以提供有用的诊断日志。运行时可能会生成类似于以下的重复日志条目:
完整的诊断日志可能包含大量信息,这可能会导致其他有用的错误信息被覆盖。因此,完整的诊断日志只会在每个 OpenXR 会话第一次尝试使用功能并失败时显示。这意味着如果眼镜断开连接,将重新检查日志,眼镜重新连接后也会再次检查。
完整诊断日志的输出可能包含多个消息。
以下是可能记录的消息示例,以及解决这些问题的方法:
● 双渲染融合功能未启用。如果 OpenXR 没有运行,很可能是因为在“项目设置 > XR 插件管理 > 启动时初始化 XR”中禁用了“启动时初始化 XR”选项。启用双渲染融合功能时,这种配置是正确的,但如果未启用,应用程序将无法启动 XR 内容。
● 相反的问题是 - 在“项目设置 > XR 插件管理 > 启动时初始化 XR”中启用了“启动时初始化 XR”选项,但实际上应该禁用它。
● 当眼镜断开连接时,XR 内容无法启动,但如果没有 Spaces Glass Status 组件,就无法获取何时可以成功启动的信息。Dynamic OpenXR Loader 组件需要一个 Spaces Glass Status 组件来正常运行,并在断开连接时帮助管理 XR 内容的生命周期。建议添加 Dynamic OpenXR Loader 组件,并启用 Auto Start XR On Display Connected 和 Auto Manage XR Camera 属性。如果需要手动管理应用程序的生命周期,至少应添加一个 Spaces Glass Status 组件。
● 如果在切换场景(以及断开/重新连接)后出现类似错误,这可能表明 Dynamic OpenXR Loader 或 Spaces Glass Status 组件没有在场景切换中保留。这可能是因为这些组件在创建时被附加到场景中的非根级游戏对象上。请参见上面的“场景切换”部分。
● 出现了在不安全的情况下尝试使用 XR 功能的情况。这通常是因为某个游戏对象在场景中处于激活状态,但它应该在接收到 On OpenXR Started 信号之前被禁用。
示例
考虑以下完整诊断日志中的消息:
在这个示例中,有一个附加了 SpacesCompositionLayer 组件的游戏对象。当场景加载时,这个游戏对象被创建,但眼镜尚未连接。它尝试使用 CompositionLayersFeature,但由于没有连接眼镜,XR 内容无法运行,因此访问该功能失败。
Fusion Lifecycle Events 组件应该在接收到 On OpenXR Started 信号后启用这个游戏对象。如果场景保存时游戏对象被禁用,但后来有人重新启用它,那么错误会再次出现。
如果在应用启动时接收到 On OpenXR Unavailable 信号,Fusion Lifecycle Events 组件应该禁用这个游戏对象。
另外,如果接收到 On OpenXR Stopping 或 On OpenXR Stopped 信号,也应该禁用这个游戏对象,否则它可能会在不安全的情况下尝试访问功能。
在手动处理生命周期时,还需要注意,OpenXR 可能会被停止但仍然保持可用。这种情况发生在眼镜仍然连接,但应用程序可能选择禁用 OpenXR 功能时。可用状态仅表示眼镜已连接。请注意,手动调用 DynamicOpenXrLoader.Instance.StopOpenXR() 不会断开眼镜的连接。
应用程序后台运行
双渲染融合架构的一个缺点是,与头戴式架构不同,应用程序无法在后台运行,而前台运行另一个应用程序。
项目验证器引起的构建问题
在运行自动构建时,请禁用“验证开放场景”功能设置,有关详细信息,请参阅“配置双渲染融合设置”。