Unity 검색

혼합 및 증강 현실 스튜디오(Unity Mars): 간편하고 유연한 AR 제작을 위한 프레임워크

2020년 1월 3일 테크놀로지 | 10 분 소요
다루는 주제
공유

Is this article helpful for you?

Thank you for your feedback!

유니티는 크리에이터가 번거롭게 코드를 작성하지 않고도 다양한 유형의 데이터를 이용하여, 컨텍스트를 고려한 유연하고 커스터마이징 가능한 AR 애플리케이션을 제작할 수 있도록 워크플로를 구축하고 있습니다.

올해 Unity Mars의 출시를 앞두고 이번 포스팅에서는 전반적인 경험 수준에서 차세대 공간과 상황 인식 컴퓨팅의 도입을 크게 앞당길 새로운 작업 환경 및 컴패니언 앱을 구축하는 과정과 개발 동기를 담은 비하인드 스토리를 공유합니다.

Unity Mars의 시작

어떻게 하면 Unity에서 AR을 더 유용하게 활용할 수 있을까요? 실제 세계와 애플리케이션의 좌표 프레임은 거의 일치하지 않습니다. 개발자는 불확실한 실제 세계에 맞추어 AR 경험을 제작할 수 있는 툴이 필요합니다. 이러한 툴은 “애매한” 배치 규칙이 발생하는 다양한 상황에 대응할 수 있어야 합니다.

이를 해결하기 위해 유니티는 하나의 대규모 좌표 시스템을 일련의 작은 시스템으로 분할하는 방법을 생각해 내었습니다. 각 시스템은 알려진 공간을 나타내며, 이러한 공간은 절차에 따라 실제 세계에 맞게 조정됩니다. 이 솔루션은 공생적으로 콘텐츠의 기반이 되는 실제 세계의 요소가 좌표 시스템의 경계를 정의합니다.

유니티는 Unity Labs 핵 위크(Hackweek) 기간 동안 이 아이디어를 테스트하여 다중 평면 환경을 구현하는 데 성공했습니다. 이는 몇 년 전에는 상상도 못할 일이었고, 지금도 Unity Mars 없이는 거의 구현할 수 없는 기술입니다.

이 콘텐츠는 Targeting Cookies 카테고리를 수락해야만 동영상을 시청할 수 있도록 허용하는 타사 제공업체에서 호스팅합니다. 이러한 제공업체의 비디오를 보려면 쿠키 환경 설정에서 Targeting Cookies 카테고리를 수락하시기 바랍니다.

이 솔루션의 엄청난 효과에 힘입어 유니티는 더 멋진 AR 환경을 구현하고자 잇따른 도전을 이어갔습니다. Unity Mars는 지속적인 질문과 답변의 과정을 거쳐 개발되었으며, 매 과정을 통해 기능이 끊임없이 개선되었습니다.

초기 발견 사항

유니티는 핵 위크 초기에 AR을 개발하면서 몇 가지 주요 난제에 직면했습니다.

  • 월드를 디지털 방식으로 표현하려면 매우 까다로운 종속성 그래프 작업을 거쳐야 합니다. 이를 위해서는 실시간 데이터베이스가 필요하며 그 양은 지속적으로 증가하고 새로운 유형의 데이터가 누적됩니다.
  • 게임 코드와 플랫폼 관리는 잘 통합되지 않습니다. 두 요소를 분리할수록 더 좋은 결과를 얻을 수 있습니다.
  • 유니티는 유저가 전체 AR 씬을 파악하지 못한 상태에서도 전체 AR 씬의 레이아웃에 영향을 주는 스크립트를 작성할 수 있도록 하고 싶었습니다.

또한 Unity Mars에서 다음과 같은 핵심 가치를 구현하기를 원했습니다.

  • Unity 확장– 팀의 모토는 “현실을 기준으로 빌드”하는 것입니다. Unity Mars는 Unity를 확장하여 실제 세계를 구현하는 에디터로 변모시키지만 Unity의 본질을 그대로 유지합니다.
  • 안전성– 새로운 공간 컴퓨팅 분야에서 사용자는 안심하고 이를 탐색하고 실험할 수 있어야 합니다. 우수한 개발 패턴을 실현하려면 번거로움이 없어야 합니다.
  • 모든 개발자를 위한 기술 - Unity Mars 모든 요소는 이를 사용하게 개발자의 기술 수준에 맞게 조정되어야 합니다.

위 문제는 복잡하고 광범위하여 애플리케이션 로직으로부터 분리된 완전한 솔루션을 제시해야 했습니다. 따라서 유니티는 Unity Mars 데이터 레이어를 개발했습니다.

데이터 레이어

Unity Mars 데이터 레이어는 4가지 요소로 나눌 수 있으며 이들은 서로 통합되어 실제 세계를 다양한 형태로 추상화합니다.

프록시 시스템
쿼리 및 데이터 이벤트
데이터 소유권
데이터 설명 및 스토리지

Unity의 기반은 월드를 디지털 방식으로 묘사하는 데 있습니다. Unity의 보편적인 AR 언어는 의미론에 기반을 두고 있으며 ‘바닥’ 및 ‘나무’와 같은 표면에 적용된 속성은 단순한 형태의 의미론에 해당합니다.

공간 의미론은 실제 세계의 다양한 변화에 맞추어 변형될 수 있는 일반적인 사물을 모델링합니다. 얼굴을 예로 들어보겠습니다. 얼굴의 모양과 크기는 다양합니다. 얼굴의 AR 콘텐츠를 제작하려면 신체의 어느 부위가 얼굴이고 눈이 어디에 위치하는지를 알아야 합니다. 얼굴은 모두 다르지만, 알맞은 데이터 요소를 공략함으로써 콘텐츠가 조정될 수 있습니다. Unity Mars(및 AR)의 진가는 특정한 로우 레벨 데이터 제작에서 상위 레벨의 의미론적 영역으로 전환할 때 드러납니다.

그 위에는 데이터 소유권이 위치합니다. 디지털 콘텐츠가 실제 세계와 공존하려면 사용 가능한 데이터에 대한 경계가 명확해야 합니다. 데이터 소유권을 통해 콘텐츠에 적용할 실제 세계의 요소를 자동으로 확보할 수 있습니다. 실제 세계의 데이터를 디지털 콘텐츠에 맞게 이상적으로 배치하는 것은 애플리케이션 개발자에게 불가능에 가까운 일이지만, Unity Mars 데이터 레이어를 통해 해결할 수 있습니다.

Unity는 AR에서 데이터 액세스 시 일관된 패턴을 유지합니다. 데이터가 감지, 업데이트 또는 손실될 때 이벤트가 발생합니다. 쿼리 및 데이터 이벤트 시스템은 이러한 개념을 더 높은 차원으로 발전시킵니다. 사용자는 데이터와 값의 구체적인 조합인 쿼리를 설정합니다. 그러면 Unity Mars 데이터 레이어는 수집업데이트, 손실 이벤트를 발생시킵니다. 즉, 사용자는 단순히 어떤 평면이 감지되었다는 것만 파악하는 게 아니라 평면의 크기, 방향, 광원 수준까지 알 수 있습니다. 한 가지 주목할 점은 Unity Mars 데이터 스토리지가 새로운 유형의 커스텀 데이터를 동적으로 지원하도록 설계되었다는 것입니다. 덕분에 사용자는 모든 유형의 시나리오에서 복잡도에 관계없이 이벤트를 얻을 수 있습니다.

이 구조의 최상단에는 프록시 시스템이 위치합니다. 프록시 시스템은 Unity 오브젝트가 있는 물리적 세계를 나타냅니다. 이 시스템은 Unity의 네이티브 표현을 자동으로 쿼리로 변환합니다. AR 프록시 오브젝트는 데이터 이벤트에 연결되어 완전히 디지털 형식인 Unity 콘텐츠와 일치하는 오브젝트 라이프사이클을 제공합니다.

모든 개발자를 위한 데이터

Unity Mars 데이터는 모든 AR 개발자를 지원할 수 있어야 합니다. 유니티는 AR 개발자를 다음과 같이 3가지 핵심 그룹으로 분류했습니다.

  • 설계자 – 데이터 관련 세부적인 사항 보다는 실제 세계의 의미론적이고 시각적인 맥락을 반영하는 새로운 AR 앱 제작을 추구합니다.
  • 데이터 제공자 - 최첨단 하드웨어 및 소프트웨어 기술을 통해 AR 생태계에 새로운 데이터를 추가합니다.
  • 엔지니어 - 데이터 및 상호 작용을 효과적으로 활용하여 설계자의 비전과 데이터 제공자의 데이터 사이에 존재하는 격차를 해소합니다.

각 그룹은 나름의 방식을 통해 Unity Mars 데이터와 상호 작용합니다. 모든 개발자는 자신의 요구 사항과 워크플로에 맞춰진 환경 속에서 다른 유형의 개발자와 상호 작용할 수 있습니다.

Unity Mars 데이터 제공자

데이터 제공자는 Unity Mars 데이터 레이어의 데이터 스토리지 및 설명 기능만 활용합니다. 위의 아키텍처에서 알 수 있듯이 Unity Mars는 외부 데이터와 기능을 매우 필요로 합니다. 제공자에게는 모든 유형의 데이터를 추가, 업데이트 및 삭제할 수 있는 몇 가지 기능으로 구성된 간단한 API가 제공됩니다. 제공자는 방향, 포지션, 회전, 컬러, 광원, 거칠기를 비롯한 여러 유형의 데이터를 추가한 다음 이들을 연결할 수 있습니다.

다음은 AR 파운데이션 평면이 Unity Mars로 전달되는 방식의 예시입니다.


void AddPlaneData(MRPlane plane)
{
     var id = this.AddOrUpdateData(plane);
     this.AddOrUpdateTrait(id, TraitNames.Plane, true);
     this.AddOrUpdateTrait(id, TraitNames.Pose, plane.pose);
     this.AddOrUpdateTrait(id, TraitNames.Bounds2D, plane.extents);
     this.AddOrUpdateTrait(id, TraitNames.Alignment, (int)plane.alignment);
     if (planeAdded != null)
         planeAdded(plane);
}

제공자 인터페이스는 기능 주입 패턴을 사용한다는 점에 주목해야 합니다. API를 구현에서 분리함으로써 손쉽게 데이터 소스 간에 전환할 수 있습니다. 이는 제작 시 데이터 시뮬레이션 및 플레이백에 매우 중요합니다.

제공자는 클래스 정의에서 시스템에 어떤 데이터를 추가할지 나열해야 합니다. 다음은 Unity Mars 평면 제공자를 위한 속성(trait) 목록입니다.


static readonly TraitDefinition[] k_ProvidedTraits =
{
     TraitDefinitions.Plane,
     TraitDefinitions.Pose,
     TraitDefinitions.Bounds2D,
     TraitDefinitions.Alignment
};

컴파일 타임에 이 데이터를 제공함으로써 각 플랫폼의 애플리케이션에 정확히 어떤 데이터가 사용 가능한지 확인할 수 있습니다. 이를 통해 애플리케이션이 제대로 작동할지 아니면 Reasoning API 형태의 추가적인 지원 스크립트가 필요한지 파악할 수 있습니다.

애플리케이션 엔지니어

AR 엔지니어는 자주 불완전하거나 예측할 수 없는 데이터를 가지고 월드에 대해 추론해야 합니다. 간단한 예를 들어보겠습니다. 조각상 주변에 교육용 그래픽을 표시하는 애플리케이션을 떠올려 봅시다. 어떤 기기에서는 이 조각상에 대해 오브젝트 인식이 가능하고, 다른 기기에서는 이미지 마커를 사용합니다. 또 다른 플랫폼에서는 조각상의 위치를 해당 공간 안에 미리 정할 수 있도록 해주는 재배치(위치 재지정) 프로세스가 가능합니다.

더 복잡한 요소를 추가해 보겠습니다. 만약 사용자가 조각상의 ‘사진’을 본다면 어떻게 될까요? 조각상의 축소 모형을 본다면요? 만약 사용자가 직접 경험해 보고 싶지만 조각상에 액세스할 수 없다면 어떨까요? VR 사용자라면 어떻게 해야 할까요?

이전에는 가능한 모든 시나리오와 만약의 경우를 처리할 수 있는 애플리케이션을 제작하는 것이 이 유형의 AR 환경을 구현할 수 있는 유일한 솔루션이었지만 좋은 방법은 아닙니다. 이 방법을 사용하면 최종 씬은 애플리케이션 로직, 플랫폼 추상화, 월드 분석이 모두 혼합되어 오브젝트와 허술한 폴백이 혼란스럽게 뒤섞인 상태가 될 것입니다. 플랫폼과 관련된 문제가 자주 발생하게 되며, 아주 힘겨운 디버깅을 실행해야 합니다.

따라서 궁극적인 해결책으로 Reasoning API를 사용해야 합니다. Reasoning API는 엔지니어에게 복잡한 시나리오를 모두 처리할 수 있는 역량과 지식을 제공하는 스크립팅 인터페이스입니다. Unity Mars는 이러한 스크립트가 언제 필요한지에 대한 로직을 처리합니다. 데이터 제공자가 제공한 속성 목록은 Unity Mars 콘텐츠에서 필요로 하는 속성 목록과 결합되어 어떤 Reasoning API가 해당 격차를 가장 효율적으로 해소할 수 있는지 결정합니다. 사용 가능한 적합한 Reasoning API가 없는 경우, 개발자는 이에 대한 알림을 받습니다.

Reasoning API 인터페이스는 Unity Mars의 데이터 스토리지 및 설명 기능과 상호 작용합니다. Reasoning API는 수직으로 정렬된 평면의 전체 목록 등 Unity Mars 데이터의 전체 목록에 한 번에 액세스할 수 있습니다.

Reasoning API는 데이터를 추가, 업데이트 및 삭제 시 데이터 제공자와 동일한 함수 호출을 사용합니다. 즉, Unity Mars는 Reasoning API와 하드웨어 제공자의 데이터를 적절히 조합할 수 있어 애플리케이션에서 어떠한 변경 작업을 하지 않고도 기능 간의 격차를 원활하게 해소할 수 있습니다.

설계자

유니티 팀은 Unity에서 실제 세계의 사물을 사용자가 참조할 수 있는 비주얼 오브젝트로 표현하려고 합니다. 사용자는 비주얼을 통해 디지털 콘텐츠를 신속하게 제작하고 확인할 수 있습니다. 오브젝트 레퍼런스를 사용하면 별도의 스크립트를 제작하지 않아도 Unity 스크립트 및 이벤트로 기존 게임 코드를 지원할 수 있습니다. Unity Mars가 수정 작업 없이 모든 에셋 스토어 및 기타 사용자 패키지를 지원해야 하므로 이 점이 매우 중요합니다. 워크플로가 Unity의 베스트 프랙티스를 준수할 때 교차 호환성이 가장 우수합니다.

Unity의 오브젝트 시스템은 단순하게 설계되었으며, 단순한 시스템을 다양한 방식으로 서로 통합하면 복잡한 구조를 만들 수 있습니다. 또한 오브젝트 시스템은 독립적으로 설계되었습니다. 따라서 일반적인 Unity 오브젝트와 동일한 방식대로 씬 뷰 및 모든 유형의 프리팹에서 바로 작업 가능합니다.

Unity Mars 콘텐츠를 구성하는 세 가지 컴포넌트는 Proxy, ProxyGroup, Spawner 입니다. 이 오브젝트에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

Proxy는 AR에서 단일 오브젝트를 정의합니다. 대부분 AR 툴 세트가 이런 한계점을 가지고 있습니다. 사용자는 ProxyGroup을 이용하여 실제 세계의 여러 사물이 서로 연관되어 있는 시나리오를 묘사할 수 있습니다. 다른 어떤 AR 제작 환경에서도 기능을 제공하지 않습니다. 이는 알고리즘으로 해결하기에는 너무나도 복잡한 문제이므로, 유니티는 Unity Mars 데이터 레이어를 통해 해결하고자 합니다. 마지막으로 Spawner 컴포넌트가 있습니다. Spawner는 Proxy 또는 ProxyGroup을 포함하고 이를 반복적으로 복제하여 규칙 세트로 변환함으로써 전체 실제 세계를 새롭게 꾸미는 오브젝트입니다.

주요 개념 검토

레이어 다이어그램을 다시 참조하여 전체적인 내용을 요약해 보겠습니다.

  • 모든 Proxy, ProxyGroup, Spawner 컴포넌트는 설계자가 제작합니다. 설계자는 쿼리를 생성하고, 이벤트에 반응합니다.
  • 쿼리는 데이터베이스에서 일치하는 항목을 찾고 소유권을 제어합니다.
  • Reasoning API 및 제공자는 데이터베이스에 데이터를 추가하고 삭제합니다.

데이터 레이어의 각 요소는 함께 작동하여 모든 플랫폼에서 최상의 환경을 구현합니다.

  • 씬 내 Unity Mars 프록시 오브젝트는 애플리케이션이 실행해야 하는 필수 속성 세트를 정의합니다.
  • 데이터 제공자는 애플리케이션에 사용 가능한 속성 세트를 정의합니다.
  • Reasoning API는 사용 가능한 속성 세트에서 애플리케이션이 필요로 하는 전체 컬렉션으로 이동하기 위한 중간다리 역할을 합니다.

Unity Mars로 제작한 혁신적인 애플리케이션의 탄생이 기대됩니다. 유니티는 계속해서 공간 컴퓨팅을 더욱 발전시킬 예정입니다. Unity Mars에 대한 더 자세한 정보 또는 향후 릴리스에 대한 소식을 확인하시려면 소식 받기를 신청하고 새 프로젝트 Unity Mars 웹페이지를 확인하시기 바랍니다.

2020년 1월 3일 테크놀로지 | 10 분 소요

Is this article helpful for you?

Thank you for your feedback!

다루는 주제
관련 게시물