상호 작용 가능 개체 — MRTK3

MRTK는 Unity의 XR Interaction Toolkit에서 제공하는 XRBaseInteractable을 기반으로 합니다. 기존의 상호 작용 가능 개체 동작 및 API는 MRTK에서 완전히 지원되며, 모든 사용자 지정 상호 작용 가능 개체는 기존 XRI 상호 작용 가능 개체 API를 준수합니다.

XRI를 처음 사용하는 개발자의 경우 먼저 Unity의 XRI 아키텍처 설명서를 검토하는 것이 매우 좋습니다.

XRI에 포함된 상호 작용 가능 개체 메커니즘을 확장하기 위해 MRTK는 고급 상호 작용을 빌드할 수 있는 두 가지 기본 클래스를 제공합니다(하나의 클래스가 다른 클래스를 확장).

상호 작용 가능 상속 다이어그램

  • MRTKBaseInteractable : XRBaseInteractable
    • 이 클래스는 다양한 유형의 상호 작용기에 대한 필터링 및 플래그 지정을 제공합니다. 기본 XRI XRBaseInteractable은 상호 작용기 형식을 구분하지 않지만 MRTKBaseInteractable은 일반적인 유형의 상호 작용이 발생하는지 여부를 확인하기 위한 편리한 함수를 제공합니다. IsGazeHovered 또는 IsGrabSelected 같은 편리한 속성은 참여 상호 작용기가 지정된 인터페이스(IGazeInteractor또는 IGrabInteractor)를 구현하는지 여부를 쿼리하기 위한 바로 가기입니다. 이러한 플래그는 interactorsHovering 또는 interactorsSelecting 목록을 반복하는 것보다 성능이 더 높습니다. 또한 MRTKBaseInteractable은 개발자가 특정 입력 형식을 제외하려는 경우 특정 유형의 상호 작용기를 필터링/거부할 수 있습니다.
  • StatefulInteractable : MRTKBaseInteractable
    • MRTKBaseInteractable은 플래그와 필터를 추가하고 상호 작용 가능 개체에 상태를 추가하지 않도록 하지만 StatefulInteractable은 토글 및 변수 선택과 같은 유용한 상태 저장 기능을 도입합니다.

상태 및 시각적 개체의 엄격한 분리

MRTK 2.x에서 상호 작용 가능 개체는 3D 단추 압축, 가리키기 효과 또는 클릭 시 색 변경 등 자체 시각 효과를 구동하는 역할을 담당하는 경우가 많았습니다. 이 방식의 제한 사항은 상호 작용 논리가 시각적 개체에 밀접하게 바인딩된다는 것입니다. 시각적 개체를 다시 설계하거나 다른 크기/도형/변위/등 단추를 사용하는 경우 상호 작용 스크립트 자체를 변경해야 합니다.

MRTK3에서 상호 작용 가능 개체는 순수 상태 및 상호 작용입니다. 상호 작용 가능 개체가 내부 상태에 따라 시각적 변경 내용이나 효과를 렌더링하지 않습니다. 시각적 프레젠테이션 설정 간에 이식성이 뛰어난 상태 및 상호 작용 논리의 컬렉션입니다.

상태 및 시각적 개체의 엄격한 격리

동일한 PressableButton 스크립트를 사용하여 물렁물렁한 공, 누를 수 있는 "트랙 패드"와 같은 평면 또는 누르면 네트워크 이벤트를 실행하는 누를 수 있는 추상 개체를 빌드할 수 있습니다. PressableButton 스크립트는 "위치"를 신경 쓰지 않으며 Canvas 내부 또는 강체에 있을 수 있습니다.

시각적 개체를 구동하기 위해 별도의 "시각적 드라이버"를 사용하여 상호 작용 가능 개체에서 상태를 폴링하고 적절한 피드백을 렌더링합니다. StateVisualizer는 상호 작용 가능한 상태에서 일반적인 시각적 피드백 효과를 유도하는 데 권장되는 로우 코드 방법이지만 개발자는 자체 사용자 지정 시각적 드라이버를 자유롭게 작성할 수 있습니다. 예를 들어 단추 구성 요소는 일반적으로 고급 3D + 셰이더 기반 피드백 효과에 StateVisualizer를 사용하지만 간단한 시각적 드라이버를 코드로 작성하는 방법을 보여주는 BasicPressableButtonVisuals 예제도 제공합니다.

변수 선택

기본 XRI 기능에 대한 StatefulInteractable의 가장 유용한 추가 기능은 Selectedness 변수에 대한 지원입니다. 기본 XRI 상호 작용 가능 개체는 선택되거나 선택되지 않지만 MRTK의 StatefulInteractable은 선택된 부동 소수점 부분일 수 있습니다.

이 개념은 거의 모든 형식의 입력이 더 이상 이진 상태가 아니기 때문에 XR에서 작업할 때 유용합니다. 모션 컨트롤러에는 아날로그 트리거(또는 아날로그 그립)가 있는 경우가 많고, 손 조작은 가변적인 "손가락 모으기"를 제공할 수 있으며, 용적 누름 조작은 다양한 양으로 단추나 누름식 표면을 눌린 상태로 만들 수 있습니다. XR의 모든 곳에서 이러한 변수, 아날로그 상호 작용을 볼 수 있으며, MRTK는 개발자가 이러한 아날로그 입력을 기반으로 만족스러운 상호 작용을 구축하는 데 도움이 됩니다.

다양한 상호 작용기 및 상호 작용 유형이 모두 상호 작용 가능 개체의 전반적인 선택성에 함께 기여할 수 있습니다. 특히, IVariableSelectInteractor를 구현하는 모든 상호 작용 가능 개체는 일반적으로 모든 참여 상호 작용기의 max()를 통해 아날로그 선택량에 기여합니다. 이 변수 크기는 바닐라 스타일 상호 작용기에서 제공되는 이진, 비가변 선택 항목과 결합됩니다.

PressableButton 같은 파생 클래스의 경우 선택성 계산에 "성분"을 더 추가하기 위해 Selectedness() 함수가 재정의됩니다. IPokeInteractor를 구현하는 상호 작용기는 물리적 위치 및 상호 작용 가능 개체를 물리적으로 누르는 방법에 따라 선택성에 기여할 수 있습니다. 다른 파생 클래스는 다른 임의 형식의 선택을 도입할 수 있습니다.

변수 선택

MRTK가 제공하는 상호 작용 가능 개체의 경우 Selectedness()isSelected가 항상 "동의"합니다. 즉, interactorsSelecting에 해당 XRI isSelected 및 함께 제공되는 상호 작용기가 없으면 SelectThreshold보다 큰 Selectedness()를 관찰할 수 없습니다.

중요

사용자 지정 상호 작용 가능 개체 하위 클래스는 XRI isSelected에서 완전히 연결이 끊어진 다른 값으로 Selectedness를 분명히 재정의할 수 있지만, 상호 작용 가능 개체는 이 작업을 수행하지 않으므로 이는 권장되지 않습니다. 일반적으로 해당 상호 작용기가 없는 상호 작용은 작성하지 않습니다. 대부분의 경우 XRI 선택으로 충분하며 빌드하는 모든 사용자 지정 상호 작용은 상호 작용기로 작성되어야 합니다.

Selectedness() 결정 방법을 지원하는 사용자 지정 상호 작용 가능 개체를 만드는 경우 메서드를 재정의하고 새 선택성을 기존 선택량과 결합하기만 하면 됩니다. StateVisualizer 또는 변수 선택을 수신 대기하는 다른 시각적 레이어를 사용하는 경우 새 선택 유형에 따라 응답합니다.

XRI에 UGUI 이벤트 매핑

경우에 따라 마우스, 게임 패드 또는 터치 스크린 입력과 같은 UGUI 이벤트에 상호 작용 가능 개체가 응답하도록 하는 것이 좋습니다. UGUIInputAdapter(UGUI Selectable)는 UGUI 이벤트를 수신하고 CanvasProxyInteractor로 전달합니다(있는 경우).

UGUI 어댑터 흐름

CanvasProxyInteractorUGUIInputAdapter에 의해 UGUI 이벤트에 대한 알림을 받으면 관련 상호 작용 가능 개체에 대해 동등한 XRI 작업을 실행합니다. UGUI 입력과 XRI 작업 간의 매핑은 다소 손실되며 활성 개발 영역입니다.

이 시스템을 사용하면 몰입형 플랫폼, 손, 모션 컨트롤러 및 3D 입력을 위해 빌드된 기존 XRI 상호 작용 가능 개체가 마우스 및 게임 패드와 같은 액세스 가능한 2D 컨트롤에 똑같이 잘 반응할 수 있습니다.