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,則保持不變

相關主題