세션 가용성 및 장치 지원 확인
AR을 시작하기 전에 일반적으로 세션이 사용 가능한지와 현재 장치가 필요한 AR 기능을 지원하는지 확인해야 합니다. 이 문서에서는 이러한 확인을 수행하는 방법을 설명합니다.
시작하기 전에
- ARSession 소개를 통해 세션의 기본 개념, 구성 요소 및 워크플로를 이해하세요
- 장치 지원 및 보고를 통해 Unity에서 장치 지원 및 세션 보고의 기초를 이해하세요
- 세션 생성 방법을 이해하세요
시작 프로세스에서 보고서 가져오기
어셈블리 후 세션을 직접 시작한 경우 StateChanged 이벤트를 통해 세션 보고서를 가져올 수 있습니다.
세션 시작 전에 StateChanged 이벤트를 구독해야 하며, 일반적으로 Awake()에서 구독하는 것이 안전합니다:
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
이벤트 처리에서 주목해야 할 세션 상태는 다음과 같습니다: Ready 및 Broken. Ready 상태는 세션이 성공적으로 시작되었음을 나타내며, 이는 세션이 현재 장치에서 사용 가능함을 의미합니다. Broken 상태는 세션 시작이 실패했음을 나타내며, 이는 세션이 현재 장치에서 사용 불가능함을 의미합니다.
Broken 상태는 장치가 지원되지 않을 때만 발생하는 것은 아닙니다. 따라서 SessionReport.BrokenReason을 사용하여 구체적인 실패 원인을 가져와야 합니다.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// 세션이 현재 장치에서 사용 가능함
}
else if (status == ARSession.SessionState.Broken)
{
// 세션이 현재 장치에서 사용 불가능함
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// 선택한 구성 요소가 현재 장치에서 지원되지 않음
}
else
{
// 장치와 무관한 원인
}
}
}
SessionReport.SessionBrokenReason.NoAvailabileFrameSource 및 SessionReport.SessionBrokenReason.FrameFilterNotAvailabile 원인이 나타나면 세션 구성 요소가 현재 장치에서 사용 불가능함을 의미합니다. 다른 원인은 일반적으로 장치와 무관합니다. 엄밀히 말하면, 이 두 가지 원인은 현재 구성(그리고 오직 그 구성만)의 AR 기능이 해당 장치에서 실행될 수 없음을 의미합니다. 구성은 세션 오브젝트에서 선택한 기능과 설정을 의미합니다. Report에서 상세한 가용성 보고서를 얻을 수 있습니다.
SessionReport.SessionBrokenReason.NoAvailabileFrameSource의 경우, 세션 시작 시 장치 목록을 온라인으로 업데이트하는 동안 장치가 지원되는 것으로 확인되면 세션이 자동으로 복구될 수 있습니다.
시작 전에 보고서 가져오기
세션 시작 전에 판단하고, 구체적인 상황에 따라 세션을 시작할지 여부를 결정하려면 수동으로 Assemble()을 호출하고 AssembleUpdate 이벤트를 사용하여 구성 요소 가용성 보고서를 가져올 수 있습니다.
세션 어셈블리 전에 AssembleUpdate 이벤트를 구독해야 합니다.
Session.AssembleUpdate += OnAssembleUpdate;
어셈블리 첫 번째 단계에서 여전히 ARSession.SessionState 및 Report를 사용하여 세션 지원 여부를 판단할 수 있습니다. 그러나 두 번째 단계의 보고서는 세션에 업데이트되지 않습니다.
따라서 일반적으로 수동으로 Assemble()을 호출할 때는 AssembleUpdate 이벤트에서 구성 요소 가용성 보고서를 처리하여 세션이 현재 장치에서 사용 가능한지 판단해야 합니다.
SessionReport.AvailabilityReport.FrameSources 목록에서 구성 요소의 가용성에 주목해야 합니다. frame source 구성 요소 중 하나라도 사용 가능하면 SessionReport.AvailabilityReport.FrameSources 부분이 현재 장치에서 사용 가능합니다.
또한 보고서의 SessionReport.AvailabilityReport.FrameFilters 목록에서 구성 요소 가용성도 주목해야 합니다. 그러나 판단 기준은 어셈블리 옵션에 따라 모든 frame filter가 사용 가능해야 하는지, 아니면 임의의 수의 frame filter가 사용 가능해야 하는지 달라집니다. 기본 옵션에서는 모든 frame filter가 사용 가능해야 합니다.
기본 구성에서는 다음과 같은 코드를 사용하여 세션 구성 요소가 현재 장치에서 사용 가능한지 판단할 수 있습니다:
void OnAssembleUpdate(SessionReport.AvailabilityReport report)
{
if (report.FrameSources.Any(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available) &&
report.FrameFilters.All(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available))
{
Session.AssembleUpdate -= OnAssembleUpdate;
// 세션 구성 요소가 현재 장치에서 사용 가능함, 세션 시작 가능
Session.StartSession();
}
else
{
// 세션 구성 요소가 현재 장치에서 사용 불가능함
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
AssembleUpdate 이벤트는 두 번 트리거될 수 있습니다. 위 코드 예제에서는 구성 요소 사용 가능이 확인된 후 이벤트 구독을 취소합니다.
이 판단 방법은 세션 시작 과정에서 발생할 수 있는 다른 오류를 판단할 수 없지만, 이러한 오류는 일반적으로 장치와 무관합니다. 필요한 경우 세션 시작 후 StateChanged 이벤트를 통해 추가로 판단할 수 있습니다.
세션 구성 요소가 사용 불가능할 때의 선택
애플리케이션 개발에서는 일반적으로 가능한 많은 장치를 지원하기를 원합니다. 따라서 세션 구성 요소가 현재 장치에서 사용 불가능할 때 다음과 같은 선택을 고려할 수 있습니다:
다른 AR 기능으로 다운그레이드
세션 구성 요소 구성을 수정하여 현재 장치에서 지원되는 AR 기능을 선택하세요. 구성 수정 방법은 세션 생성을 참조하세요.비 AR 경험 제공
세션 구성 요소가 사용 불가능할 때 비 AR 경험을 제공하세요. 예를 들어 내비게이션 시나리오에서 AR 내비게이션이 불가능하면 전통적인 2D 내비게이션을 제공하는 것이 매우 유용합니다.사용자에게 장치 교체 요청
일부 애플리케이션 시나리오에서는 사용자가 AR 기능을 지원하지 않는 장치를 사용할 수 있습니다. 이 경우 더 나은 경험을 위해 장치를 교체하도록 사용자에게 요청할 수 있습니다.
이러한 방안을 선택할 때는 애플리케이션의 구체적인 요구 사항과 사용자 그룹을 고려하여 균형을 맞춰야 합니다. AR 애플리케이션에서는 일부 장치가 AR 또는 다운그레이드 방안을 제공할 수 없는 경우에도 현재 장치의 제한 사항을 사용자에게 알리기 위해 적절한 사용자 안내 메시지를 제공해야 합니다.
다음 단계
- 세션 실행 제어 방법을 이해하세요: 세션 실행 제어
- 프레임 데이터 소스 및 런타임 선택 방법을 이해하세요: 프레임 데이터 소스 및 런타임 선택
- 또한 아래 예제를 통해 보고서 획득 후의 적용 시나리오를 이해할 수 있습니다:
- Workflow_ARSession 예제는 StateChanged 이벤트를 사용하고 Broken 상태에 UI 안내를 제공하며, AssembleUpdate 이벤트를 사용하여 각 구성 요소의 가용성을 UI에 표시합니다
- SpatialMap_Sparse_AllInOne 예제는 AssembleUpdate 이벤트를 사용하여 장치 지원 여부를 사전에 판단하고 사용 불가능 안내를 제공합니다
- MotionTracking_DeviceMotionAndPlaneDetection 예제는 StateChanged 이벤트를 사용하고 Broken 상태에 UI 안내를 제공합니다
- MegaBlock_Basic 예제는 StateChanged 이벤트를 사용하고 Broken 상태에 UI 안내를 제공합니다