建立和設定 AR session
在 Unity 中使用 AR,需要首先在場景中建立並設定 AR session。本文介紹了建立和設定 AR session 的幾種主要方法。一般在成功建立 session 之後,在 Hierarchy 視圖中可以看到如下結構:

開始之前
- 透過 ARSession 簡介了解 session 的基本概念、組成和工作流程。
建立預設配置的 session
在 Hierarchy 視圖中 空白 處點擊右鍵,透過選單 EasyAR Sense > [ AR 功能 ] > AR Session ([ 功能 ] Preset) 可以建立一個預設好的 session。session 預先配置了適合該功能的 frame source 和 frame filter 元件。
在腳本中,可以使用 ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset, ARSessionFactory.Resources) 來建立 session。
比如,透過選單 EasyAR Sense > Image Tracking > AR Session (Image Tracking Preset) 可以建立一個用於影像追蹤的 session。

對應的腳本程式碼如下:
ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.ImageTracking);
需要注意的是,在使用 ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder 以及 ARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder 預設時,需要同時傳入資源參數。例如,下面的程式碼建立了一個用於稀疏空間建構的 session,並指定了點雲材質:
ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial });
如果腳本只在編輯器中執行,也可以使用預設編輯器資源:
ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, ARSessionFactory.Resources.EditorDefault());
選單 EasyAR Sense > AR Session (Preset) > ** 中列出了所有可以使用的預設 session,可以參考使用。

附註
同一個場景中多個 session 同時執行會相互衝突,因此在場景中最多只能保留一個被啟用(GameObject.activeInHierarchy == true)的 session。
新增元件
session 的 frame source 和 frame filter 元件可以在 session 建立後根據需要新增和刪除。
在 Hierarchy 視圖中,選中 AR Session (EasyAR) 並點擊右鍵,透過選單 EasyAR Sense > [ AR 功能 ] > ** 可以新增適合該功能的 frame source 和 frame filter 元件。
在腳本中,可以使用 ARSessionFactory.AddFrameSource<Source>(GameObject, bool) 來新增 frame source 元件,或使用 ARSessionFactory.AddFrameFilter<Filter>(GameObject, ARSessionFactory.Resources) 來新增 frame filter 元件。
比如,透過選單 EasyAR Sense > Image Tracking > Frame Filter : Image Tracker 可以給當前選中的 session 新增一個新的影像追蹤器。

對應的腳本程式碼如下:
ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
注意
新增元件必需在 assemble 前完成。session 開始執行 assemble 以及完成 assemble 後,任何對元件的增加和刪除都會導致 session 進入 Broken 狀態並停止工作。
需要注意的是,在新增 SparseSpatialMapBuilderFrameFilter 以及 DenseSpatialMapBuilderFrameFilter 時,需要同時傳入資源參數。例如,下面的程式碼建立了一個用於稀疏空間建構的 SparseSpatialMapBuilderFrameFilter,並指定了點雲材質:
ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial })
如果腳本只在編輯器中執行,也可以使用預設編輯器資源:
ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, ARSessionFactory.Resources.EditorDefault());
建立 frame filter 之後,可以使用 ARSessionFactory.SetupFrameFilters(List<GameObject>, ARSessionFactory.ARSessionPreset) 來根據預設配置調整 frame filter 的參數。
比如下面這段程式碼給 session 新增一個新的影像追蹤器,並配置成 ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion 的預設參數。
var filter = ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
ARSessionFactory.SetupFrameFilters(new() { filter }, ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion);
使用選單建立時無法按預設調整參數,需要在建立後根據具體的元件說明進行配置。
刪除元件
要從 session 中刪除元件,可以在 Hierarchy 視圖中選中對應的元件並按 Delete 鍵,或者在腳本中銷毀(Destroy)對應的物體。
附註
停用(SetActive(false))元件的 GameObject 的效果與刪除元件相同。
比如要從 session 中刪除影像追蹤器,可以選中 Image Tracker 並按 Delete 鍵。

注意
刪除元件必需在 assemble 前完成。session 開始執行 assemble 以及完成 assemble 後,任何對元件的增加和刪除都會導致 session 進入 Broken 狀態並停止工作。
元件排序的影響
session 的 frame filter 子節點的排列順序對 session 執行沒有任何影響。
session 的 frame source 子節點的排列順序將影響 frame source 在 assemble 過程中的選擇順序。只有按 transform 順序 排列的第一個可用的 frame source 會被選中作為 session 的實際 frame source。
附註
frame source 節點的順序只有在 assemble 之前修改是有效的。assemble 後,調整順序不會影響執行結果。
[可選] 自由建立 session
如果預設配置的 session 不能滿足需求,還可用根據需要自由建立和配置 session。
可用使用選單 EasyAR Sense > AR Session (Preset) > AR Session (Empty) 建立一個不包含任何 frame source 和 frame filter 元件的空 session。
在腳本中,可以使用 ARSessionFactory.CreateSession() 來實現。
ARSessionFactory.CreateSession();
然後根據實際需要,新增合適的 frame source 和 frame filter 元件。
比如,如果需要建立一個包含稀疏空間建構和稠密空間建構功能的 session,可以使用下面的程式碼:
var session = ARSessionFactory.CreateSession();
var group = new GameObject("Frame Source Group");
group.transform.SetParent(session.transform, false);
ARSessionFactory.AddFrameSource<XREALFrameSource>(session);
ARSessionFactory.AddFrameSource<AREngineFrameSource>(session);
ARSessionFactory.AddFrameSource<ARCoreFrameSource>(session);
ARSessionFactory.AddFrameSource<ARCoreARFoundationFrameSource>(session);
ARSessionFactory.AddFrameSource<ARKitFrameSource>(session);
ARSessionFactory.AddFrameSource<ARKitARFoundationFrameSource>(session);
ARSessionFactory.AddFrameSource<VisionOSARKitFrameSource>(session);
ARSessionFactory.AddFrameSource<MotionTrackerFrameSource>(session);
List<GameObject> filters = new();
filters.Add(ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, resources));
filters.Add(ARSessionFactory.AddFrameFilter<DenseSpatialMapBuilderFrameFilter>(session, resources));
ARSessionFactory.SetupFrameFilters(filters, ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder);
ARSessionFactory.SetupFrameFilters(filters, ARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder);
它將建立出這樣的 session 結構:

後續步驟
控制執行
- 了解 初始化 的方法和作用
- 了解如何 判斷可用性和裝置支援
- 了解 控制 session 執行 的方法
存取元件和結果
- 嘗試 存取 AR 功能元件
- 了解如何 取得 session 的執行結果
元件參考
- ARSession 元件參考