session 사용 가능 여부와 기기 지원 확인
AR을 시작하기 전에 보통 먼저 session이 사용 가능한지, 그리고 현재 기기가 필요한 AR 기능을 지원하는지 확인해야 합니다. 이 문서는 그 확인 방법을 설명합니다.
시작하기 전에
- ARSession 简介를 통해 session의 기본 개념, 구성, 워크플로를 이해하세요.
- 设备支持和报告를 통해 Unity에서의 기기 지원과 session 보고서의 기본을 이해하세요.
- 创建 session 방법을 익히세요.
시작 흐름에서 보고서 얻기
assemble 후 바로 session을 시작했다면, StateChanged 이벤트를 통해 session 보고서를 얻을 수 있습니다.
session start 전에 StateChanged 이벤트를 구독해야 하며, 보통 Awake()에서 구독하는 것이 안전합니다.
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
이벤트 처리에서 주의해야 할 session 상태는 Ready와 Broken입니다. Ready는 session이 성공적으로 시작되었음을 의미하므로 현재 기기에서 사용할 수 있다는 뜻입니다. Broken은 시작에 실패했음을 의미하므로 현재 기기에서 사용할 수 없다는 뜻입니다.
Broken 상태가 항상 기기 미지원일 때만 나타나는 것은 아닙니다. 그래서 SessionReport.BrokenReason도 사용해 실패 원인을 정확히 알아야 합니다.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session이 현재 기기에서 사용 가능
}
else if (status == ARSession.SessionState.Broken)
{
// session이 현재 기기에서 사용 불가
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// 선택한 컴포넌트가 현재 기기에서 지원되지 않음
}
else
{
// 기기와 무관한 원인
}
}
}
SessionReport.SessionBrokenReason.NoAvailabileFrameSource와 SessionReport.SessionBrokenReason.FrameFilterNotAvailabile는 session 컴포넌트가 현재 기기에서 사용할 수 없음을 뜻합니다. 다른 원인은 보통 기기와 무관합니다. 엄밀히 말하면 이 두 원인은 현재 구성, 그리고 그 구성만으로는 해당 기기에서 AR 기능을 실행할 수 없음을 의미합니다. 구성은 session 오브젝트에서 선택한 기능과 설정을 말합니다. 자세한 사용 가능 보고서는 Report에서 확인할 수 있습니다.
SessionReport.SessionBrokenReason.NoAvailabileFrameSource의 경우, session 시작 중 온라인으로 기기 목록을 갱신하다가 해당 기기가 지원되는 것으로 확인되면 session이 자동으로 복구될 수 있습니다.
시작 전에 보고서 얻기
session 시작 전에 판단해서 상황에 따라 session을 시작할지 결정하고 싶다면, Assemble()을 수동으로 호출하고 AssembleUpdate 이벤트를 사용해 컴포넌트 사용 가능 보고서를 얻을 수 있습니다.
session assemble 전에 AssembleUpdate 이벤트를 구독해야 합니다.
Session.AssembleUpdate += OnAssembleUpdate;
assemble의 첫 번째 단계에서는 여전히 ARSession.SessionState와 Report를 사용해 session 지원 여부를 판단할 수 있습니다. 하지만 두 번째 단계의 보고서는 session에 반영되지 않습니다.
따라서 보통 Assemble()을 수동으로 호출할 때는 AssembleUpdate 이벤트에서 컴포넌트 사용 가능 보고서를 처리해, 현재 기기에서 session이 사용 가능한지 판단해야 합니다.
특히 SessionReport.AvailabilityReport.FrameSources 목록의 컴포넌트 사용 가능 상태를 잘 봐야 합니다. frame source 컴포넌트가 하나라도 사용 가능하다면, SessionReport.AvailabilityReport.FrameSources 부분은 현재 기기에서 사용 가능합니다.
또한 보고서의 SessionReport.AvailabilityReport.FrameFilters 목록도 확인해야 합니다. 다만 판단 기준은 assemble 옵션에 따라 달라져, 모든 frame filter가 필요할 수도 있고 일부만 필요할 수도 있습니다. 기본 옵션에서는 모든 frame filter가 사용 가능해야 합니다.
기본 구성에서는 아래 코드로 session 컴포넌트가 현재 기기에서 사용 가능한지 판단할 수 있습니다.
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 컴포넌트가 현재 기기에서 사용 가능하므로 session 시작 가능
Session.StartSession();
}
else
{
// session 컴포넌트가 현재 기기에서 사용 불가
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
AssembleUpdate 이벤트는 두 번 발생할 수 있습니다. 위 예제에서는 컴포넌트가 사용 가능하다고 확인한 뒤 구독을 해제합니다.
이 방법으로는 session 시작 중 발생할 수 있는 다른 오류까지 판단할 수는 없지만, 그런 오류는 보통 기기와 무관합니다. 필요하다면 session 시작 후 StateChanged 이벤트로 추가 확인할 수 있습니다.
session 컴포넌트를 사용할 수 없을 때의 선택
앱 개발에서는 보통 가능한 한 많은 기기를 지원하고 싶습니다. 현재 기기에서 session 컴포넌트를 사용할 수 없다면 다음과 같은 선택지를 고려할 수 있습니다.
다른 AR 기능으로 낮춰서 사용
session 컴포넌트 구성을 바꿔 현재 기기가 지원하는 AR 기능을 선택합니다. 구성 변경 방법은 创建 session을 참고하세요.비 AR 경험 제공
session 컴포넌트를 사용할 수 없을 때는 AR이 아닌 경험을 제공합니다. 예를 들어 내비게이션 시나리오에서 AR 내비게이션이 어렵다면 전통적인 2D 내비게이션이 매우 유용합니다.사용자가 기기를 바꾸도록 안내
어떤 상황에서는 사용자가 AR 기능을 지원하지 않는 기기를 쓸 수 있습니다. 이때 더 나은 경험을 위해 기기 변경을 안내할 수 있습니다.
이런 방식을 선택할 때는 앱의 구체적 요구와 사용자층을 함께 고려하세요. AR 앱에서 일부 기기가 정말 AR 또는 대체 방안을 제공할 수 없다면, 현재 기기의 제한을 잘 알려 주는 메시지를 제공하는 것이 중요합니다.
다음 단계
- session 실행 제어 방법을 익히세요
- 帧数据源及运行时选取를 익히세요
- 또한 아래 예제로 보고서 이후의 사용 사례를 확인할 수 있습니다.
- Workflow_ARSession 示例는 StateChanged 이벤트를 사용하고 Broken 상태에 대한 UI를 보여 주며, AssembleUpdate로 각 컴포넌트의 사용 가능 상태도 UI에 표시합니다
- SpatialMap_Sparse_AllInOne 예제는 AssembleUpdate로 기기 지원을 미리 판단하고, 사용할 수 없으면 경고를 보여 줍니다
- MotionTracking_DeviceMotionAndPlaneDetection 예제는 StateChanged 이벤트를 사용하고 Broken 상태에 대한 UI를 보여 줍니다
- MegaBlock_Basic 예제는 StateChanged 이벤트를 사용하고 Broken 상태에 대한 UI를 보여 줍니다