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

相關主題