已知问题、常见问题解答和调试指南

已知问题 (Unity 插件)

  • 控制器支持仅限于 Oculus Quest
    • 其他控制器可以工作,但显示不正确

  • 示例代码中的问题
    • 自动连接示例需要在编译时指定 IP 地址

    • Lobby UI 示例在 Oculus Quest 上测试通过(使用 Quest 屏幕键盘)

    • CxruReprojection.shader 问题
      • 垂直条带失真:某些或所有平台都表现出“模糊感”,形式为 6-10 个规则间隔的垂直失真条带

      • 斑点:少量像素显示随机噪声,在黑暗场景中明显

      • 输入停滞时的掉头:如果输入姿势被冻结并且 HMD 完全“转了一圈”,则着色器显示帧的失真版本而不是正确的黑色

  • 需要基于 Unity OpenXR 的插件提供程序
    • 目前,此插件使用 Unity 的 OpenXR 插件直接从运行时获取性能关键的姿势信息

    • 插件提供程序(如 ARCoreOculusXR)目前不支持不使用 OpenXR 的

  • 仅限 CloudXR 4.0
    • 此插件不适用于以前版本的 CloudXR,并且仅在 CloudXR 4.0 上进行了测试

  • 与 Unity 多线程渲染不兼容
    • 默认情况下启用,这将导致各种问题并且无法正常工作。

  • Unity 的 runInBackground 设置位于

    ProjectSettings/ProjectSettings.asset 需要设置为 1,以便在 Oculus 系统菜单期间 HMD 变换正确

  • 适用于 Unity 2.0 的 HTC VIVE OpenXR (移动) 插件 - 不再包含 libc++_shared.so - 现在需要软件包的“标准”版本(而不是 sans-libc++ 变体)

常见问题解答

  • 我可以制作平板电脑 AR 客户端吗?
    • 尚未。 平板电脑 AR 支持是我们最高优先级的即将推出的功能。

调试指南

  • CXRU_HMD 未定义
    • 症状
      • 首次导入 CloudXR 包时出现编译错误

    • 问题
      • 必须定义 CXRU_HMD 或(将来)CXRU_TABLET 以选择插件中正确的代码路径

    • 解决方法
      • 项目设置 > 播放器 > 其他设置

      • 在条件编译定义的列表中定义一个新符号 CXRU_HMD

  • CloudXR 调优姿势捕捉未启用
    • 症状
      • logcat: 错误 Unity DllNotFoundException: 无法加载 DLL ‘libCloudxrClientlibCsharp.so’ (持续)

    • 问题
      • Unity 未能确定提供的 AAR 中的库是必需的,并且未包含它们

    • 解决方法
      • 确保在“项目设置 > OpenXR > OpenXR 功能组”中启用了“CloudXR 调优姿势捕捉”功能

  • HMD 原点不正确
    • 症状
      • HMD 位于远程环境的“地板”上

    • 问题
      • OpenXR 姿势未与 Unity 姿势对齐

    • 解决方法
      • 在场景中的 XR Rig/Origin 对象上将“跟踪原点模式”设置为“设备”

  • 渲染顺序不正确
    • 症状
      • (本地)场景中的对象在流式传输期间无法渲染(例如,混合现实工具包 UI 对象)

    • 问题
      • CloudXR 示例渲染器功能/着色器正在“覆盖”其他渲染对象

    • 解决方法
      • 选项 1:在所有要渲染在“顶部”的对象上使用“UI”层

      • 选项 2:将“渲染对象”渲染器添加到 URP-Performant-Renderer(或“项目窗口 > 设置”中的正确 URP 渲染器设置)
        • 将事件设置为“AfterRenderingTransparents”,这将强制其在 CxruRendererFeature 运行之后,将本地对象渲染在流式像素之上

  • MainCamera 问题
    • 症状
      • logcat 中有很多此类错误
        • Unity NullReferenceException:对象引用未设置为对象的实例。

        • Unity at CxruClientSampleOculusUI.UpdatePlatform () [0x00000] in <00000000000000000000000000000000>:0

        • Unity at CxruClientSampleOculusUI.Update () [0x00000] in <00000000000000000000000000000000>:0

      • 在 HMD 内部,视图可能被“锁定”

    • 问题
      • MainCamera 配置不正确

    • 解决方法
      • 确保场景中只有一个标记为 MainCamera 的相机

      • 确保 MainCamera 连接到 XR Origin 或 XR Rig

      • 确保 CloudXRManager.cs 在该相机对象上处于活动状态

  • Android 互联网权限缺失
    • 症状
      • 为 Android HMD 构建

      • 无法调试的连接到 CloudXR 服务器的失败

      • 在 Package Manager 中,OpenXR 插件的版本为 1.8.2(或可能更高)

      • 检查导出的 Android Studio 项目,AndroidManifest.xml 不包含互联网权限
        • 即使在“项目 > 播放器设置”中启用了此权限

    • 问题
      • 从 OpenXR 插件 1.8.2 开始,Unity 为内置的 Android Meta Quest 支持功能添加了深入设置,其中包括默认情况下启用的“强制禁用互联网权限”(原因我不知道)。

      • 不幸的是,此强制禁用互联网功能(错误地)应用于任何 Android 平台,无论 Quest 支持功能本身是否启用。因此,由此产生的任何 APK 都永远无法连接到 CloudXR 服务器。

    • 解决方法
      • 项目设置 > XR 插件管理 > OpenXR

      • OpenXR 功能组 > Meta Quest 支持
        • 查找此项右侧的齿轮图标

      • 查找并禁用“强制删除互联网权限”

  • libc++_shared.so 冲突
    • 症状
      • 为这些 Android 平台构建
        • HTC VIVE OpenXR - Android

        • Qualcomm Spandragon Spaces SDK for Unity

        • 任何其他包含 libc++_shared.so 的平台

      • 构建失败,出现 Gradle 错误
        • 找到多个具有操作系统独立路径 ‘lib/arm64-v8a/libc++_shared.so’ 的文件

    • 问题
      • CloudXR 组合 AAR 库包含一个随附 lib_c++_shared.so` 版本的库

      • 这些平台的 Unity 插件包也附带 lib_c++_shared.so 版本

      • 只能包含一个

    • 解决方法
      • 使用主 CloudXR 客户端 Unity 插件的 sans-libc++ 变体(不包括 libc++_shared.so

    • 理由
      • 假设:所有 libc++_shared.so 文件都来自类似版本的 Android NDK

      • 观察:libc++_shared.so 上存在实际的名称冲突(即,没有 libstdc++_shared.so 或类似文件)

      • 结果:所有 libc++_shared.so 库都来自相同的实现,并且在 ABI 和实现上都兼容

      • 因此:任何 libc++_shared.so 文件都可以用作组合 AAR 或最终 APK 中唯一允许的共享 libc++ 实现。

  • Android run-in-background 未设置
    • 症状
      • 在 Oculus(以及可能的其他 Android 平台)上,按(右手)系统菜单

      • 移动头部

      • 系统菜单“跟踪”正确,Unity 跟踪错误

    • 问题
      • 不确定;可能是 Unity、Android、XR 运行时之间的问题

    • 解决方法
      • 编辑此文件:ProjectSettings/ProjectSettings.asset

      • 将 runInBackground 的值从 0 更改为 1