Table of Contents

在 Unity 场景中自动切换 Unity XR 物体

Unity 的 XR 组件(包括 AR Foundation)所能支持的设备有限。为了在受支持的设备上使用 AR Foundation,同时又能在其它大量设备上使用 AR 功能,EasyAR 提供了自动切换 Unity XR 物体的功能。以下内容介绍该功能对场景物体的改动及使用方法。

开始之前

功能介绍

由于 Unity 的 AR Foundation 在手机上底层实现是 ARCore 和 ARKit,只能在有限的设备上使用,尤其是在很多国产 Android 手机上无法使用,所以通常建议仅在受支持的设备上启用 AR Foundation 及相关功能脚本。自动切换 Unity XR 物体的功能实现了上述操作,主要为移动 AR 设计,头显上默认配置下功能会被禁用。

在完整功能启用时,

默认配置下,功能启用条件如下,

  • 在 Windows/Mac 上启用。
  • 切换器启动时,如果移动 AR(ARKit/ARCore)的 loader 是激活的,则启用。
  • 切换器启动时,如果存在移动AR(ARKit/ARCore)之外的其它 loader,但没有任何一个 loader 是激活的,则禁用。
注意

XR Interaction Toolkit 的组件不受该功能控制,但其在 EasyAR 中是否可用未经验证。理论上对于只使用 Unity.XR.CoreUtils.XROrigin GameObject 及其 Camera 的功能应该可以正常使用。如果行为异常可以尝试设置 ARSession.ARCenterModeARSession.ARCenterMode.SessionOrigin。如果功能还是不正常,则需要实现自定义的 XR Interaction Toolkit 的组件控制,在 FrameSource 不是继承自 ARFoundationFrameSource 时禁用相关组件。

配置方法

这个功能可以通过 Project Settings > EasyAR > Sense 中的 Unity XR > Unity XR Auto Switch 中的选项启用或关闭。

alt text

图中选项配置功能行为如下:

  • Editor:编辑模式选项
  • Player:运行模式选项
    • Enable:启用运行时控制。注意:关闭该选项时编辑模式被禁用的组件在运行时不会被恢复。
    • Enable If Desktop:在 Windows/Mac 上启用。
    • Enable If Mobile AR On Startup:切换器启动时,如果移动 AR(ARKit/ARCore)的 loader 是激活的,则启用。通常这个选项需要 Project Settings > XR Plug-in Management 中的 Initialize XR on Startup 是选中的。
    • Disable If Non Mobile AR Post Startup:切换器启动时,如果存在移动AR(ARKit/ARCore)之外的其它 loader,但没有任何一个 loader 是激活的,则禁用。通常这个选项会在 Project Settings > XR Plug-in Management 中的 Initialize XR on Startup 未选中时被使用。
    • Restore AR Session When Disabled:功能禁用时,恢复(启用)所有被禁用的 UnityEngine.XR.ARFoundation.ARSession(无论它是否由 EasyAR 所禁用)。这个选项通常用于恢复编辑时被禁用的组件。

使用自定义的控制方法

如果需要自定义这些组件的切换,或是 EasyAR 的行为干扰了某些组件的正常工作,需要确保关闭这些选项,同时根据以下基本规则自定义组件切换:

  1. 在编辑器中禁用 UnityEngine.XR.ARFoundation.ARSession(它在执行时序中早于所有其它脚本)
  2. 在 AR Foundation 开始工作前禁用所有 Unity XR Core 组件及 AR Foundation 的组件以及需要控制的相关组件或功能
  3. 如果 easyar.ARSession.Assemble() 过程中选择了 ARCoreARFoundationFrameSourceARKitARFoundationFrameSource,启用之前禁用的所有组件或功能,需要在 StartSession() 完成前完成,通常建议在 easyar.ARSession.AssembleUpdate 事件响应中完成
  4. 如果 easyar.ARSession.Assemble() 过程中选择使用了其它 FrameSource,则保持不变

相关主题