AR session 만들기 및 구성
Unity에서 AR을 사용하려면 먼저 씬에 AR session을 만들고 구성해야 합니다. 이 문서는 AR 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)으로 image tracking용 session을 만들 수 있습니다.

해당 코드는 다음과 같습니다.
ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.ImageTracking);
ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder와 ARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder preset을 사용할 때는 resource 파라미터도 함께 전달해야 합니다. 예를 들어 다음 코드는 sparse spatial mapping용 session을 만들고 point cloud material을 지정합니다.
ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial });
스크립트가 editor에서만 실행된다면 editor 기본 resource도 사용할 수 있습니다.
ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, ARSessionFactory.Resources.EditorDefault());
EasyAR Sense > AR Session (Preset) > ** 메뉴에는 사용할 수 있는 모든 session preset이 나열되어 있으니 참고할 수 있습니다.

참고
같은 씬에서 여러 session을 동시에 실행하면 서로 충돌하므로, 씬에는 활성화된(GameObject.activeInHierarchy == true) session이 하나만 있어야 합니다.
컴포넌트 추가
session의 frame source와 frame filter 컴포넌트는 만들고 난 뒤 필요에 따라 추가하거나 삭제할 수 있습니다.
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에 새 image tracker를 추가할 수 있습니다.

해당 코드는 다음과 같습니다.
ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
주의
컴포넌트 추가는 assemble 전에 끝내야 합니다. session이 assemble을 시작하고 assemble이 완료된 뒤에는 어떤 컴포넌트 추가나 삭제도 session을 Broken 상태로 만들어 동작을 멈추게 합니다.
SparseSpatialMapBuilderFrameFilter와 DenseSpatialMapBuilderFrameFilter를 추가할 때도 resource 파라미터를 함께 전달해야 합니다. 예를 들어 다음 코드는 sparse spatial mapping용 SparseSpatialMapBuilderFrameFilter를 만들고 point cloud material을 지정합니다.
ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial })
스크립트가 editor에서만 실행된다면 editor 기본 resource도 사용할 수 있습니다.
ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, ARSessionFactory.Resources.EditorDefault());
frame filter를 만든 뒤에는 ARSessionFactory.SetupFrameFilters(List<GameObject>, ARSessionFactory.ARSessionPreset)를 사용해 preset에 맞게 frame filter 파라미터를 조정할 수 있습니다.
예를 들어 다음 코드는 session에 새 image tracker를 추가하고 ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion preset 파라미터로 설정합니다.
var filter = ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
ARSessionFactory.SetupFrameFilters(new() { filter }, ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion);
메뉴로 만들 때는 preset에 맞게 파라미터를 조정할 수 없으므로, 만든 뒤에는 각 컴포넌트 설명에 따라 구성해야 합니다.
컴포넌트 삭제
session에서 컴포넌트를 삭제하려면 Hierarchy 뷰에서 해당 컴포넌트를 선택하고 Delete 키를 누르거나, 스크립트에서 해당 오브젝트를 Destroy 하면 됩니다.
참고
컴포넌트의 GameObject를 SetActive(false)로 비활성화하는 것은 삭제와 같은 효과입니다.
예를 들어 session에서 image tracker를 삭제하려면 Image Tracker를 선택하고 Delete를 누르면 됩니다.

주의
컴포넌트 삭제도 assemble 전에 끝내야 합니다. session이 assemble을 시작하고 assemble이 완료된 뒤에는 어떤 컴포넌트 추가나 삭제도 session을 Broken 상태로 만들어 동작을 멈추게 합니다.
컴포넌트 순서의 영향
session의 frame filter 자식 노드 순서는 session 실행에 아무 영향도 주지 않습니다.
frame source 자식 노드 순서는 assemble 과정에서 frame source 선택 순서에 영향을 줍니다. 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 컴포넌트를 추가하면 됩니다.
예를 들어 sparse spatial mapping과 dense spatial mapping을 포함한 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 컴포넌트 참조