입력 시스템 데이터 공급자 만들기 - MRTK2

Mixed Reality 도구 키트 입력 시스템은 입력 디바이스 지원을 사용하도록 설정하기 위한 확장 가능한 시스템입니다. 새 하드웨어 플랫폼에 대한 지원을 추가하려면 사용자 지정 입력 데이터 공급자가 필요할 수 있습니다.

이 문서에서는 입력 시스템에 대해 디바이스 관리자라고도 하는 사용자 지정 데이터 공급자를 만드는 방법을 설명합니다. 여기에 표시된 예제 코드는 의 코드 WindowsMixedRealityDeviceManager입니다.

이 예제에 사용된 전체 코드는 MRTK/Providers/WindowsMixedReality 폴더에서 찾을 수 있습니다.

네임스페이스 및 폴더 구조

데이터 공급자는 타사 추가 기능 또는 Microsoft Mixed Reality 도구 키트의 일부로 배포할 수 있습니다. 새 데이터 공급자를 MRTK에 제출하기 위한 승인 프로세스는 사례별로 다르며 초기 제안 시 전달됩니다.

중요

입력 시스템 데이터 공급자가 Mixed Reality 도구 키트 리포지토리에 제출되는 경우 네임스페이스는 Microsoft.MixedReality.Toolkit(예: Microsoft.MixedReality.Toolkit.WindowsMixedReality)로 시작해야 하며, 코드는 MRTK/Providers(예: MRTK/Providers/WindowsMixedReality) 아래의 폴더에 있어야 합니다.

네임스페이스

데이터 공급자는 잠재적인 이름 충돌을 완화하기 위해 네임스페이스가 있어야 합니다. 네임스페이스에는 다음 구성 요소가 포함되어 있는 것이 좋습니다.

  • 회사 이름
  • 기능 영역

예를 들어 Contoso 회사에서 만든 입력 데이터 공급자는 "Contoso.MixedReality.Toolkit.Input"일 수 있습니다.

다음 이미지와 같이 데이터 공급자의 소스 코드를 폴더 계층 구조에 배치하는 것이 좋습니다.

폴더 구조의 예

ContosoInput에 데이터 공급자의 구현이 포함된 경우 Editor 폴더에는 검사기(및 기타 Unity 편집기 관련 코드)가 포함되며 Textures 폴더에는 지원되는 컨트롤러의 이미지가 포함되며 프로필에는 미리 만들어진 프로필이 하나 이상 포함되어 있습니다.

참고

몇 가지 일반적인 컨트롤러 이미지는 MixedRealityToolkit\StandardAssets\Textures 폴더에서 찾을 수 있습니다.

데이터 공급자 구현

인터페이스 및/또는 기본 클래스 상속 지정

모든 입력 시스템 데이터 공급자는 입력 시스템에 필요한 최소 기능을 지정하는 인터페이스를 구현 IMixedRealityInputDeviceManager 해야 합니다. MRTK 파운데이션에는 이 필수 기능의 기본 구현을 제공하는 클래스가 포함되어 BaseInputDeviceManager 있습니다. Unity의 UInput 클래스를 기반으로 하는 디바이스의 경우 클래스를 UnityJoystickManager 기본 클래스로 사용할 수 있습니다.

참고

UnityJoystickManager 클래스는 BaseInputDeviceManager 필요한 IMixedRealityInputDeviceManager 구현을 제공합니다.

public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityCapabilityCheck 는 특히 관절식 손, 시선 제스처 음성 손 및 모션 컨트롤러와 같은 입력 기능 집합에 대한 지원을 제공한다는 것을 나타내기 위해 에서 사용됩니다 WindowsMixedRealityDeviceManager .

MixedRealityDataProvider 특성 적용

입력 시스템 데이터 공급자를 만드는 주요 단계는 특성을 클래스에 MixedRealityDataProvider 적용하는 것입니다. 이 단계에서는 입력 시스템 프로필에서 선택할 때 공급자에 대한 기본 프로필 및 플랫폼을 설정할 수 있습니다.

[MixedRealityDataProvider(
    typeof(IMixedRealityInputSystem),
    SupportedPlatforms.WindowsUniversal,
    "Windows Mixed Reality Device Manager")]
public class WindowsMixedRealityDeviceManager :
    BaseInputDeviceManager,
    IMixedRealityCapabilityCheck
{ }

IMixedRealityDataProvider 메서드 구현

클래스가 정의되면 다음 단계는 인터페이스의 IMixedRealityDataProvider 구현을 제공하는 것입니다.

참고

클래스를 BaseInputDeviceManager 통해 클래스는 메서드에 BaseService 대한 IMixedRealityDataProvider 빈 구현만 제공합니다. 이러한 메서드의 세부 정보는 일반적으로 데이터 공급자에 따라 다릅니다.

데이터 공급자가 구현해야 하는 메서드는 다음과 같습니다.

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

데이터 공급자 논리 구현

다음 단계는 지원되는 컨트롤러를 포함하여 입력 디바이스를 관리하기 위한 논리를 추가하는 것입니다.

컨트롤러 클래스 구현

WindowsMixedRealityDeviceManager 예제는 다음 컨트롤러 클래스를 정의하고 구현합니다.

이러한 각 클래스의 소스 코드는 MRTK/Providers/WindowsMixedReality 폴더에서 찾을 수 있습니다.

  • WindowsMixedRealityArticulatedHand.cs
  • WindowsMixedRealityController.cs
  • WindowsMixedRealityGGVHand.cs

참고

모든 디바이스 관리자가 여러 컨트롤러 유형을 지원하지는 않습니다.

MixedRealityController 특성 적용

다음으로 특성을 클래스에 적용 MixedRealityController 합니다. 이 특성은 컨트롤러 유형(예: 관절 손), 손수(예: 왼쪽 또는 오른쪽) 및 선택적 컨트롤러 이미지를 지정합니다.

[MixedRealityController(
    SupportedControllerType.WindowsMixedReality,
    new[] { Handedness.Left, Handedness.Right },
    "StandardAssets/Textures/MotionController")]
{ }

상호 작용 매핑 구성

다음 단계는 컨트롤러에서 지원하는 상호 작용 매핑 집합을 정의하는 것입니다. Unity의 Input 클래스를 통해 데이터를 수신하는 디바이스의 경우 컨트롤러 매핑 도구 는 상호 작용에 할당할 올바른 축 및 단추 매핑을 확인하는 데 유용한 리소스입니다.

다음 예제는 MRTK/Providers/OpenVR 폴더에 있는 클래스에서 GenericOpenVRController 약어입니다.

public override MixedRealityInteractionMapping[] DefaultLeftHandedInteractions => new[]
{
    // Controller Pose
    new MixedRealityInteractionMapping(0, "Spatial Pointer", AxisType.SixDof, DeviceInputType.SpatialPointer, MixedRealityInputAction.None),
    // Left Trigger Squeeze
    new MixedRealityInteractionMapping(1, "Trigger Position", AxisType.SingleAxis, DeviceInputType.Trigger, ControllerMappingLibrary.AXIS_9),
    // Left Trigger Press (Select)
    new MixedRealityInteractionMapping(2, "Trigger Press (Select)", AxisType.Digital, DeviceInputType.TriggerPress, KeyCode.JoystickButton14),
};

참고

클래스는 ControllerMappingLibrary Unity 입력 축 및 단추 정의에 대한 기호 상수를 제공합니다.

알림 이벤트 발생

애플리케이션이 사용자의 입력에 응답할 수 있도록 데이터 공급자는 및 IMixedRealityInputHandler<T> 인터페이스에 IMixedRealityInputHandler 정의된 컨트롤러 상태 변경에 해당하는 알림 이벤트를 발생합니다.

디지털(단추) 형식 컨트롤의 경우 OnInputDown 및 OnInputUp 이벤트를 발생합니다.

// inputAction is the input event that is to be raised.
if (interactionSourceState.touchpadPressed)
{
    InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, inputAction);
}
else
{
    InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, inputAction);
}

아날로그 컨트롤(예: 터치패드 위치)의 경우 InputChanged 이벤트가 발생해야 합니다.

InputSystem?.RaisePositionInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, interactionSourceState.touchpadPosition);

Unity Profiler 계측 추가

성능은 혼합 현실 애플리케이션에서 매우 중요합니다. 모든 구성 요소는 애플리케이션이 고려해야 하는 약간의 오버헤드를 추가합니다. 이를 위해 모든 입력 데이터 공급자는 내부 루프에 Unity Profiler 계측을 포함하고 자주 사용하는 코드 경로를 포함하는 것이 중요합니다.

사용자 지정 공급자를 계측할 때 MRTK에서 활용하는 패턴을 구현하는 것이 좋습니다.

        private static readonly ProfilerMarker GetOrAddControllerPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealityDeviceManager.GetOrAddController");

        private async void GetOrAddController(InteractionSourceState interactionSourceState)
        {
            using (GetOrAddControllerPerfMarker.Auto())
            {
                // Code to be measured.
            }
        }

참고

프로파일러 마커를 식별하는 데 사용되는 이름은 임의입니다. MRTK는 다음 패턴을 사용합니다.

"[product] className.methodName - 선택적 참고"

사용자 지정 데이터 공급자는 추적을 분석할 때 특정 구성 요소 및 메서드의 식별을 간소화하기 위해 유사한 패턴을 따르는 것이 좋습니다.

프로필 및 검사기 만들기

Mixed Reality 도구 키트에서 데이터 공급자는 프로필을 사용하여 구성됩니다.

추가 구성 옵션(예: InputSimulationService)이 있는 데이터 공급자는 고객이 애플리케이션의 요구에 가장 적합한 동작을 수정할 수 있도록 프로필 및 검사기를 만들어야 합니다.

이 섹션의 예제에 대한 전체 코드는 MRTK에서 찾을 수 있습니다. Services/InputSimulation 폴더.

프로필 정의

프로필 콘텐츠는 관찰자의 액세스 가능한 속성(예: 업데이트 간격)을 미러 합니다. 각 인터페이스에 정의된 모든 사용자 구성 가능 속성은 프로필에 포함되어야 합니다.

[CreateAssetMenu(
    menuName = "Mixed Reality Toolkit/Profiles/Mixed Reality Simulated Input Profile",
    fileName = "MixedRealityInputSimulationProfile",
    order = (int)CreateProfileMenuItemIndices.InputSimulation)]
public class MixedRealityInputSimulationProfile : BaseMixedRealityProfile
{ }

CreateAssetMenu 고객이 자산 > 만들기 > Mixed Reality 도구 키트 프로필 메뉴를 사용하여 프로필 instance 만들 수 있도록 프로필 클래스에 > 특성을 적용할 수 있습니다.

검사기 구현

프로필 검사자는 프로필 콘텐츠를 구성하고 보기 위한 사용자 인터페이스입니다. 각 프로필 검사기는 'BaseMixedRealityToolkitConfigurationProfileInspector 클래스를 확장해야 합니다.

[CustomEditor(typeof(MixedRealityInputSimulationProfile))]
public class MixedRealityInputSimulationProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

특성은 CustomEditor 검사자가 적용되는 자산 유형을 Unity에 알릴 수 있습니다.

어셈블리 정의 만들기

Mixed Reality Toolkit은 어셈블리 정의(.asmdef) 파일을 사용하여 구성 요소 간의 종속성을 지정하고 Unity가 컴파일 시간을 줄이는 데 도움을 줍니다.

모든 데이터 공급자 및 해당 편집기 구성 요소에 대해 어셈블리 정의 파일을 만드는 것이 좋습니다.

이전 예제의 폴더 구조를 사용하면 ContosoInput 데이터 공급자에 대한 두 개의 .asmdef 파일이 있습니다.

첫 번째 어셈블리 정의는 데이터 공급자에 대한 것입니다. 이 예제에서는 ContosoInput이라고 하며 예제의 ContosoInput 폴더에 있습니다. 이 어셈블리 정의는 Microsoft.MixedReality.Toolkit 및 종속되는 다른 어셈블리에 대한 종속성을 지정해야 합니다.

ContosoInputEditor 어셈블리 정의는 프로필 검사기와 편집기별 코드를 지정합니다. 이 파일은 편집기 코드의 루트 폴더에 있어야 합니다. 이 예제에서 파일은 ContosoInput\Editor 폴더에 있습니다. 이 어셈블리 정의에는 ContosoInput 어셈블리에 대한 참조도 포함됩니다.

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

데이터 공급자 등록

데이터 공급자를 만든 후에는 입력 시스템에 등록하고 애플리케이션에서 사용할 수 있습니다.

등록된 입력 시스템 데이터 공급자

패키징 및 배포

타사 구성 요소로 배포되는 데이터 공급자에는 패키징 및 배포에 대한 구체적인 세부 정보가 개발자의 기본 설정에 남아 있습니다. 가장 일반적인 솔루션은 .unitypackage를 생성하고 Unity 자산 저장소를 통해 배포하는 것입니다.

데이터 공급자가 제출되고 Microsoft Mixed Reality 도구 키트 패키지의 일부로 수락되면 Microsoft MRTK 팀은 MRTK 제품의 일부로 패키지하고 배포합니다.

추가 정보