Version: 2022.1
언어: 한국어
하위 시스템의 런타임 발견 및 활성화
XR SDK 디스플레이 하위 시스템

XR SDK 입력 하위 시스템

XR SDK 입력 하위 시스템은 버튼, 축 및 트래킹 기기 정보를 보고하기 위한 인터페이스입니다. 이는 사용자가 제어하는 ​​데이터를 Unity 엔진의 다양한 입력 엔드포인트로 가져오기 위한 핵심 하위 시스템입니다. Unity는 사용 가능한 정보 타입에 따라 입력 정보를 InputDevicesInput System에 보고합니다.

기본 XR 입력 공급자 생성

기본 작동 XR 입력 공급자를 생성하려면 다음 단계를 따르십시오.

  1. 기기 연결과 연결 해제를 보고합니다.
  2. 모든 연결 기기의 정의 정보를 입력합니다.
  3. Unity가 요청할 때마다 기기의 상태를 업데이트합니다.
  4. 모든 관련 이벤트 및 쿼리에 응답합니다.
  5. 새로운 입력 시스템에 기기 레이아웃을 보고합니다.

용어

이 가이드에서는 다음 용어를 사용합니다.

기기

대부분의 입력 하위 시스템 API는 기기에 의존합니다. 기기는 선택한 고유 ID로 참조되는 입력 기능의 컨테이너입니다. 기기는 게임패드 또는 헤드셋과 같은 구체적인 오브젝트일 수도 있고, 감지된 손 골격 등과 같은 추상적인 오브젝트를 나타낼 수도 있습니다. 기기에는 기기가 연결된 동안 변경할 수 없는 고정된 개수의 기능이 있습니다.

기능

입력 기능은 센서 또는 사용자 수정 데이터를 가져올 수 있는 모든 것입니다. 버튼, 위치 트래킹 요소 또는 배터리 수명일 수 있습니다. 다양한 타입의 데이터로 그룹화되며, UnityXRInputFeatureType으로 식별됩니다. 다음은 입력 기기에서 현재 지원되는 데이터 타입입니다.

UnityXRInputFeatureType 데이터 타입
kUnityXRInputFeatureTypeCustom char[] (up to 1024 elements)
kUnityXRInputFeatureTypeBinary bool
kUnityXRInputFeatureTypeDiscreteStates unsigned int
kUnityXRInputFeatureTypeAxis1D float
kUnityXRInputFeatureTypeAxis2D UnityXRVector2
kUnityXRInputFeatureTypeAxis3D UnityXRVector3
kUnityXRInputFeatureTypeRotation UnityXRVector4
kUnityXRInputFeatureTypeHand UnityXRHand
kUnityXRInputFeatureTypeBone UnityXRBone
kUnityXRInputFeatureTypeEyes UnityXREyes

사용법

용도(usage)는 기능에 대한 컨텍스트를 제공하고, 개발자가 기능을 사용하는 방식을 식별합니다. 예를 들어 기능은 2D 축일 수 있지만, 용도는 개발자에게 터치패드라고 알려줍니다. 또한 개발자에게 1차원 축 기능이 배터리 수명을 보고하고 있음을 알릴 수도 있습니다. 고유한 용도를 만들 수도 있지만, Unity에서 개발한 용도를 최대한 많이 사용해야 합니다. 이는 개발자용 크로스 플랫폼 유틸리티를 지원하기 때문입니다. 모두가 사용할 수 있는 일반적인 용도 리스트는 아래의 기능 용도 섹션을 참조하십시오.

UnityXRInternalInputDeviceId

UnityXRInternalInputDeviceId는 모든 기기를 식별합니다. 이러한 식별자는 Unity와 공급자가 특정 기기를 참조하기 위해 공유하는 고유 ID로 간주됩니다. 각 기기에 매핑되는 ID를 정의할 수 있지만, 동시에 연결된 두 기기에 대해 동일한 ID를 사용할 수 없다는 것이 유일한 제약 조건입니다. 특정 ID를 연결 중으로 보고하면 Unity는 기기가 실행할 수 있는 기능과 해당 ID를 사용하는 기기의 현재 상태에 대한 정보를 요청하고, 해당 ID를 사용하여 기기별 이벤트를 전송합니다.

기기 연결과 연결 해제

IUnityXRInputInterface의 두 API는 기기 연결과 연결 해제를 처리합니다.

IUnityXRInputInterface.InputSubsystem_DeviceConnected

새로운 기기를 보고합니다. 공급자가 제공하는 UnityXRInternalInputDeviceId는 무슨 값이든 될 수 있습니다. 단 내부적으로 고유한 ID를 나타내야 하고, 두 개의 기기가 동일한 공급자의 동일한 ID로 연결되지 않아야 합니다. 기기는 입력 공급자 라이프사이클의 시작 및 중지 이벤트 간에만 연결될 수 있습니다. IUnityXRInputProvider.Start가 호출될 때 이미 연결된 모든 기기는 해당 콜백 동안 보고되어야 합니다.

기기가 연결되었다고 보고되면 Unity는 해당 기기에 대한 특정 정보를 얻기 위해 제공된 UnityXRInternalInputDeviceId를 사용하여 다음 입력 업데이트 루프에서 IUnityXRInputProvider.FillDeviceDefinition을 호출합니다.

IUnityXRInputInterface.InputSubsystem_DeviceDisconnected

입력 기기가 더 이상 이용할 수 없음을 보고합니다. 연결되었다고 이미 보고한 후에만 ​​입력 기기의 연결이 해제되었다고 보고할 수 있습니다. IUnityXRInputProvider.Stop을 수신하면 현재 연결된 모든 입력 기기의 연결이 해제되었다고 보고해야 합니다.

위의 두 호출은 스레드에 안전하게 사용할 수 있고, 언제든지 호출할 수 있습니다.

기기 정의

기기 정의는 기기가 Unity에 보고할 수 있는 기능을 설명합니다. 기능은 기기 이름, 역할, 제조업체, 일련번호 등과 같은 기기 식별 정보로 구성됩니다. 기기 정의에는 사용 가능한 모든 개별 입력 기능의 색인 리스트도 포함되어 있습니다.

기기가 연결 중으로 보고되면 Unity는 IUnityXRInputProvider.FillDeviceDefinition을 통해 공급자를 호출합니다. UnityXRInputDeviceDefinition 파라미터는 IUnityXRInputInterfaceDeviceDefinition 접두사가 붙은 모든 메서드에 전달할 수 있는 핸들 역할을 합니다. 해당 메서드는 다음과 같습니다.

식별 정보 설정

개발자는 기기의 일부 데이터를 사용하여 특정 기기 또는 새로 연결된 기기의 일반 기능을 식별합니다.

IUnityXRInputInterface.DeviceDefinition_SetName

공급자가 기기 이름을 설정할 수 있습니다. 이름은 명확하고, 간결하고, 일반 시장 소비자들이 알아볼 수 있어야 합니다. 여기에 제조업체 이름은 포함되지 않아야 합니다. 이 이름은 UnityEngine.XR.InputDevice.name을 통해 그리고 입력 시스템에서 InputDevice.product로 개발자에게 제공됩니다. 이 설정을 공백으로 두지 마십시오.

IUnityXRInputInterface.DeviceDefinition_SetCharacteristics

공급자가 연결된 기기 타입을 지정할 수 있습니다. UnityXRInputDeviceCharacteristics는 기기의 기능을 정의하는 데 도움이 되는 일련의 플래그입니다. 이로 인해 InputDevice의 입력 시스템 사용이 변경됩니다.

IUnityXRInputInterface.DeviceDefinition_SetManufacturer

공급자가 기기 제조업체를 설정할 수 있습니다. 제조업체는 명확하고, 간결하고, 일반 시장 소비자들이 알아볼 수 있어야 합니다. 이 문자열은 UnityEngine.XR.InputDevice.manufacturer를 통해 그리고 입력 시스템에서 InputDevice.manufacturer로 개발자에게 제공됩니다. 이 설정을 공백으로 두지 마십시오.

IUnityXRInputInterface.DeviceDefinition_SetSerialNumber

공급자가 기기 일련번호를 설정할 수 있습니다. 이 문자열은 UnityEngine.XR.InputDevice.serialNumber를 통해 그리고 입력 시스템에서 InputDevice.serialNumber로 개발자에게 제공됩니다. 기기별로 고유한 식별자여야 합니다. 또는 공백으로 둘 수 있습니다.

기능 추가

다음 API 호출을 통해 기기 정의에 입력 기능을 추가할 수 있습니다.

IUnityXRInputInterface.DeviceDefinition_AddFeature

이렇게 하면 집합 타입의 기능(kUnityXRInputFeatureTypeCustom 제외)이 추가되고, 새로운 기능의 UnityXRInputFeatureIndex가 반환됩니다.

IUnityXRInputInterface.DeviceDefinition_AddCustomFeature

kUnityXRInputFeatureTypeCustom 기능을 추가합니다. 이는 최대 1024바이트의 가변 버퍼입니다. 이 기능을 사용하여 Unity에 알려지지 않은 커스텀 타입을 만들 수 있으며, 명시적인 크기를 필요로 합니다. 이 메서드는 새로운 기능의 UnityXRInputFeatureIndex를 반환합니다.

IUnityXRInputInterface.DeviceDefinition_AddFeatureWithUsage

기능을 추가할 뿐만 아니라, 하나의 기능 용도도 포함합니다. 이 메서드는 DeviceDefinition_AddFeatureDeviceDefinition_AddUsageAtIndex를 결합하는 도우미이며, 새로운 기능의 UnityXRInputFeatureIndex를 반환합니다.

IUnityXRInputInterface.DeviceDefinition_AddUsageAtIndex

기능 용도를 기존 기능에 추가합니다. 기능을 추가하는 메서드 중 하나에서 UnityXRInputFeatureIndex를 가져옵니다. 필요에 따라 단일 기능에 원하는 만큼 용도를 추가할 수 있습니다.

참고: 반환된 UnityXRInputFeatureIndex 값은 모두 추가된 순서대로 나열됩니다.

기기 상태

기기 상태는 기기의 현재 상태를 포함하는 데이터 구조입니다. UnityXRInputDeviceState의 구조는 UnityXRInputDeviceDefinition에 설명되어 있습니다.

참고: 기기 상태 내에 포함된 기능은 기기 정의에서 해당 기능을 선언할 때 UnityXRInputFeatureIndex가 보고된 상태로 액세스됩니다.

기기 상태 업데이트 타입

정의가 선언되면 Unity는 IUnityXRInputProvider.UpdateDeviceState를 통해 프레임당 기기 상태를 두 번 요청합니다. UnityXRInputUpdateType 파라미터는 Unity에서 예상하는 업데이트 유형을 지정합니다.

  • kUnityXRInputUpdateTypeDynamic은 Unity가 MonoBehaviour.Update 호출 및 코루틴 연속을 반복하기 전의 업데이트입니다. 현재 기기가 있는 위치를 나타내야 합니다.
  • kUnityXRInputUpdateTypeBeforeRender는 Unity가 헤드셋으로의 렌더링을 준비하기 직전, 그리고 Application.OnBeforeRender가 호출되기 바로 전에 호출됩니다. 이러한 호출은 전방 예측 트래킹 포지션을 사용하고, 씬을 표시하는 데 걸리는 시간에 씬을 렌더링할 위치를 나타내야 합니다.

기기 상태 메서드

UnityXRInputDeviceState 파라미터는 IUnityXRInputInterfaceDeviceState 접두사가 붙은 모든 메서드에 전달할 수 있는 핸들 역할을 합니다.

IUnityXRInputInterface.DeviceState_SetCustomValue

제공된 UnityXRInputFeatureIndex에서 kUnityXRInputFeatureTypeCustom 타입의 기능을 설정합니다. 커스텀 값 기능을 설정하는 경우 공급자는 항상 선언된 기능의 전체 크기로 값을 설정해야 합니다. 부분 값 설정은 없습니다. 또한 포함하는 데이터 종류와 다른 개별 기능 타입을 사용할 수 없는 이유에 대한 상세 설명과 함께 제출 중에 모든 커스텀 기능을 Unity에 선언해야 합니다.

IUnityXRInputInterface.DeviceState_SetBinaryValue

kUnityXRInputFeatureTypeBinary 타입의 부울(켜기/끄기) 기능을 설정합니다. 이 기능의 기본, 휴식 또는 미사용 상태는 false여야 합니다.

IUnityXRInputInterface.DeviceState_SetDiscreteStateValue

32비트 부호 없는 정수 값을 설정합니다. 열거형을 나타내는 데 사용할 수도 있습니다. 기본 미사용 값은 0이어야 합니다. 열거에 사용되는 경우 0은 null, none, unset 또는 invalid 값을 나타내야 합니다.

IUnityXRInputInterface.DeviceState_SetAxis1DValue

32비트 부동 소수점 값을 설정합니다. 기본 미사용 값은 0.0이어야 합니다.

IUnityXRInputInterface.DeviceState_SetAxis2DValue

UnityXRVector2 타입의 값을 설정합니다. UnityXRVector2 구조는 (X, Y) 32비트 플로트 페어입니다. 기본 미사용 값은 (0.0, 0.0)이어야 합니다.

IUnityXRInputInterface.DeviceState_SetAxis3DValue

UnityXRVector3 타입의 값을 설정합니다. UnityXRVector2 구조는 (X, Y, Z) 32비트 플로트 페어입니다. 기본 미사용 값은 (0.0, 0.0, 0.0)이어야 합니다.

IUnityXRInputInterface.DeviceState_SetRotationValue

쿼터니언 포맷이 지정된 UnityXRVector4 타입의 값을 설정합니다. 기본 미사용 값은 (0, 0, 0, 1)이어야 합니다. 자세한 내용은 쿼터니언 문서를 참조하십시오.

IUnityXRInputInterface.DeviceState_SetBoneValue

UnityXRBone 타입의 값을 설정합니다.

IUnityXRInputInterface.DeviceState_SetHandValue

UnityXRHand 타입의 값을 설정합니다.

IUnityXRInputInterface.DeviceState_SetEyesValue

UnityXREyes 타입의 값을 설정합니다.

참고: 전달된 UnityXRInputFeatureUsageIndexUnityXRInputFeatureDefinition 작성 시 기기 정의에 해당 개별 기능을 추가할 때 반환된 값과 동일합니다.

기능별 구조체

다음의 고급 타입은 여러 데이터 소스의 데이터를 포함하는 데 사용되는 특수 기능 타입입니다.

UnityXRBone

공간에서 뼈대, 또는 계층적 포즈의 한 요소를 나타냅니다. position 멤버는 Y가 위쪽인 왼쪽 좌표를 사용하여 미터 단위의 3차원 포지션을 나타냅니다. rotation 멤버는 라디안 단위의 정규화된 쿼터니언으로 표시되는 해당 뼈대의 공간 방향을 나타냅니다. parentBoneIndex는 계층 구조 위쪽의 UnityXRBone을 가리키는 UnityXRInputFeatureIndex이거나, kUnityInvalidXRInputFeatureIndex(이 골격의 루트인 경우)여야 합니다.

UnityXRHand

뼈대의 손 모양 구조를 나타냅니다. 간편한 이동을 위해 뼈대 계층 구조를 손가락 및 루트로 구성합니다. rootBoneIndex는 항상 kUnityXRInputFeatureTypeBone 타입의 유효한 인덱스를 가리켜야 합니다. 이 타입은 손바닥 또는 손 중앙을 나타냅니다. fingerBoneIndicesUnityXRHandFinger 열거형 값에 따라 첫 번째 차원 또는 배열이 개별 손가락에 매핑되고, 배열의 두 번째 차원은 루트에서 끝까지의 개별 손가락 뼈대가 되도록 스태킹되어야 합니다.

UnityXREyes

한 쌍의 눈, 고정 점 및 현재 깜박임 데이터를 나타냅니다. leftEyePoserightEyePoseUnityXRPose 타입입니다. 여기서 position 멤버는 Y가 위쪽인 왼쪽 좌표를 사용하여 미터 단위의 3차원 포지션을 나타내고, rotation 멤버는 라디안 단위의 정규화된 쿼터니언을 나타냅니다. fixationPoint는 왼쪽 눈과 오른쪽 눈이 수렴하는 위치를 나타내며, Y가 위쪽인 왼쪽 좌표를 사용하는 미터 단위의 3차원 포지션이기도 합니다. leftOpenAmountrightOpenAmount는 눈의 열림을 나타냅니다(0은 감은 상태, 1은 완전히 뜬 상태). 값은 [0,1] 범위를 초과할 수 없습니다.

이벤트 처리

기기 상태 및 정의 업데이트 외에 Unity는 사용자가 다양한 이벤트에 반응하고 응답하기를 기대합니다.

일반 이벤트

UnityXRInputProvider.HandleEvent

이 공급자에게만 해당되는 프라이빗 이벤트를 위한 것입니다. eventType 파라미터는 페이로드 식별에 사용되는 커스텀 코드입니다. 공급자가 해당 이벤트를 이해하지 못하는 경우 kUnitySubsystemErrorCodeFailure를 반환해야 합니다.

트래킹 원점 이벤트

트래킹 원점은 트래킹된 기기의 기준이 되는 현실 공간의 특정 지점입니다. 또한 기기가 (0, 0, 0) 포지션을 보고하는 현실 공간의 실제 지점입니다. Unity는 다양한 트래킹 원점 모드를 지원하며, 공급자는 지원되는 모드를 선택할 수 있습니다. 트래킹 원점 모드는 UnityXRInputTrackingOriginModeFlags에 나열되어 있습니다.

kUnityXRInputTrackingOriginModeDevice는 시작 시 기본 기기의 위치와 요(yaw)에 또는 마지막 UnityXRInputProvider.HandleRecenter 이벤트의 위치에 원점을 배치합니다.

kUnityXRInputTrackingOriginModeFloor는 바닥의 특정 지점에 원점을 배치합니다. 바닥의 위치는 개발자의 선택에 달렸습니다. 단 개발자는 바닥과 다양한 기기 간의 높이 차이를 이해하고 있어야 합니다.

kUnityXRInputTrackingOriginModeTrackingReferencekUnityXRInputDeviceCharacteristicsTrackingReference 특성을 지닌 특정 InputDevice의 위치에 원점을 배치합니다.

마지막으로 kUnityXRInputTrackingOriginModeUnknown은 오류 상황이므로, 공급자가 참조해서는 안 됩니다.

UnityXRInputProvider.HandleRecenter

트래킹 원점 모드가 kUnityXRInputTrackingOriginModeDevice*로 설정되면 리센터링 호출을 통해 기본 기기의 위치를 새 원점으로 설정해야 합니다.

UnityXRInputProvider.QueryTrackingOriginMode

공급자가 사용 중인 현재 트래킹 원점 모드를 가져오기 위한 Unity의 요청입니다. 공급자는 trackingOriginMode 파라미터를 설정하고 kUnitySubsystemErrorCodeSuccess를 반환해야 합니다. 반환된 파라미터는 단일 플래그 값이어야 합니다.

UnityXRInputProvider.QuerySupportedTrackingOriginModes

트래킹 원점 모드가 지원되는 요청입니다. 공급자는 supportedTrackingOriginModes 파라미터를 설정하고 kUnitySubsystemErrorCodeSuccess를 반환해야 합니다. 반환된 파라미터는 UnityXRInputProvider.HandleSetTrackingOriginMode가 지원할 수 있는 모든 UnityXRInputTrackingOriginModeFlags의 누적 리스트여야 합니다.

UnityXRInputProvider.HandleSetTrackingOriginMode

현재 트래킹 원점 모드를 변경하라는 Unity의 요청입니다. trackingOriginMode 파라미터는 원하는 트래킹 원점 모드입니다. 공급자는 원점이 변경될 수 있는 경우 kUnitySubsystemErrorCodeSuccess를 반환하고, 그렇지 않으면 kUnitySubsystemErrorCodeSuccess를 반환해야 합니다. 트래킹 원점 모드가 이미 원하는 모드이면 공급자는 아무 작업도 하지 않고 kUnitySubsystemErrorCodeSuccess를 반환해야 합니다.

IUnityXRInputInterface.InputSubsystem_TrackingOriginUpdated

공급자가 Unity에 트래킹 원점의 위치가 변경되었음을 알릴 때 전송할 수 있는 이벤트입니다. UnityXRInputProvider.HandleSetTrackingOriginMode가 성공하고 원점을 이동할 때 호출되어야 합니다. 또한 전체 트래킹정보가 변경되어 공급자가 원점을 변경해야 하는 경우에도 호출할 수 있습니다.

IUnityXRInputInterface.InputSubsystem_SetTrackingBoundary

공급자가 Unity에 사용 가능한 트래킹 경계가 있거나 트래킹 경계가 변경되었음을 알릴 때 전송할 수 있는 이벤트입니다. 경계가 있거나, 원점 트래킹이 변경되어 경계의 기준 포지션이 이동했을 때 호출되어야 합니다. 기존 트래킹 경계를 제거하기 위해 null과 0 포인트로도 호출할 수 있습니다.

햅틱 이벤트

UnityXRInputProvider.QueryHapticCapabilities

공급자가 입력하는 특정 기기의 햅틱 기능에 대한 요청입니다. supportsImpulse를 true로 설정하면 UnityXRInputProvider.HandleHapticImpulse에 대한 이벤트가 활성화됩니다. supportsBuffer를 true로 설정하면 UnityXRInputProvider.HandleHapticBuffer에 대한 이벤트가 활성화됩니다.

참고: 기능 구조를 통해 공급자는 채널 인덱스가 포함된 햅틱을 시작 및 중지하기 위한 채널 및 요청 수를 설정할 수 있습니다. 또한 단일 기기 내 여러 모터가 독립적으로 진동되도록 만들 수 있습니다. 첫 번째 채널은 가장 자주 사용되는 모터여야 하지만, 이후 순서는 공급자에 따라 다릅니다.

UnityXRInputProvider.HandleHapticImpulse

기기가 설정된 시간 동안 특정 진폭으로 진동하도록 만들기 위한 요청입니다. Unity는 이 요청에 대한 데이터를 입력합니다. 버퍼 파라미터는 UnityXRHapticImpulse 타입입니다.

UnityXRInputProvider.HandleHapticBuffer

기기가 설정된 버퍼에 따라 특정 패턴으로 진동하도록 만들기 위한 요청입니다. Unity는 이 요청에 대한 데이터를 입력합니다. 버퍼 파라미터는 UnityXRHapticUpdate 타입입니다.

bufferSize는 UnityXRInputProvider.QueryHapticCapabilities 이벤트에서 반환된 UnityXRHapticCapabilities.bufferMaxSize보다 크지 않습니다.

UnityXRInputProvider.HandleHapticStop

햅틱 효과를 중지하기 위한 Unity의 요청입니다. 이 경우 제공된 UnityXRInternalInputDeviceId에 대한 임펄스 또는 버퍼링된 햅틱 효과가 중지됩니다.

기능 용도

기능 용도(feature usage)는 기능에 대한 컨텍스트를 제공하고 Unity 개발자가 일반적인 방식으로 기기에 액세스하도록 도와주는 간단한 문자열 태그입니다. 기기에 트리거, 기기 포지션, 메뉴 버튼 또는 입력 기능의 기타 공통 개념이 있다고 선언할 수 있습니다. 개발자는 이러한 요소가 정확히 무엇인지 몰라도 액세스하고, 기기와 상호작용할 수 있습니다. 또한 입력 데이터를 UnityEngine.InputUnityEngine.XR.InputTracking으로 라우팅하고 인덱스를 결정하는 데에도 사용됩니다. 단일 입력 기능은 여러 용도로 사용할 수 있지만, 선언하는 각 입력 기능에는 하나 이상의 용도가 할당되어 있어야 합니다. Unity가 기본적으로 제공하는 용도를 사용하지 않기로 선택한 경우 인증을 위한 제출 시 Unity에 사용한 요소에 대해 알리고, Unity의 피드백에 따라 용도 문자열을 업데이트해야 합니다.

모든 월드 공간 용도는 미터, m/s, m/s2, 또는 라디안 단위입니다. 공간은 왼쪽, z-전방, y-위쪽 방향이어야 합니다. 공간 원점은 연결 시 기기의 포지션이어야 합니다. 이 공간은 자체 소유이며, Unity 월드 공간에 직접 매핑되지 않습니다.

Unity에서 제공되는 일반적인 용도는 다음과 같습니다.

포즈 및 트래킹

다음은 현실 세계에서 트래킹을 제공하는 기기를 위한 기능입니다. 현재 트래킹 기능을 식별하는 데 유용합니다.

kUnityXRInputFeatureUsageIsTracked는 기기가 현재 제대로 트래킹 중인지 지정하는 부울입니다. true는 완전히 트래킹됨을 의미하고, false는 부분적으로 또는 전혀 트래킹되지 않음을 의미합니다.

kUnityXRInputFeatureUsageTrackingStateUnityXRInputTrackingStateFlags 열거형에서 지원되는 개별 상태 기능으로, 현재 사용 가능하고 업데이트되는 실제 트래킹 기능을 식별합니다. 이 값은 kUnityXRInputTrackingStateAll 보다 크면 안 됩니다.

나머지 트래킹 기능은 기기, 왼쪽 눈, 컬러 카메라 등과 같은 특정 ’노드’에 대한 개별 데이터를 전달합니다. 이는 데이터 타입에 따라 6개 집합으로 나뉩니다. kUnityXRInputFeatureUsageTrackingState의 현재 값과 함께 업데이트되어야 합니다. 즉 트래킹 상태에 포지션을 사용할 수 있다고 표시되면 모든 포지션 용도가 올바르게 업데이트되고 있는 것입니다.

용도 접두사는 다음과 같습니다.

접두사 설명
kUnityXRInputFeatureUsageDevice 입력 기기의 일반화된 포지션
kUnityXRInputFeatureUsageCenterEye 모든 눈 렌더링 위치의 중앙집중식 평균
kUnityXRInputFeatureUsageLeftEye 왼쪽 눈의 렌더링 위치
kUnityXRInputFeatureUsageRightEye 오른쪽 눈의 렌더링 위치
kUnityXRInputFeatureUsageColorCamera 들어오는 카메라 피드의 위치

이러한 각 접두사에는 다양한 트래킹 속성을 나타내는 일련의 사용 가능한 접미사가 있습니다. 다음은 그 예입니다. * Position * Rotation * Velocity * AngularVelocity * Acceleration * AngularAcceleration

정의에 포함하지 않으면 사용할 수 없습니다. 정의에 포함하지만, kUnityXRInputFeatureUsageTrackingState 기능을 통해 사용할 수 없음 태그를 지정하면 해당 기능을 지금은 사용할 수 없지만, 나중에는 사용할 수 있음을 의미합니다.

기기 정보

여기에는 사용자가 작동하는 컨트롤이 아니라 일반화된 기기 정보가 포함됩니다. 이는 사용자가 직접 제어할 수 없는 기기의 기능입니다.

kUnityXRInputFeatureUsageBatteryLevel은 기기의 현재 배터리 수준을 나타내는 1D 축 기능입니다. 여기서 0은 배터리 잔량이 없고 1은 완전히 충전되었음을 의미합니다. 항상 [0–1] 범위 내에 있어야 합니다.

kUnityXRInputFeatureUsageUserPresence는 사용자가 현재 헤드셋을 착용하고 있으면 ture를 반환합니다.

2D 축

터치패드, 조이스틱 등과 같은 2차원 아날로그 플로트 값입니다. 이러한 컨트롤은 일반적으로 엄지 손가락으로 움직입니다. X와 Y를 모두 제공하며, 항상 ([–1,1],[–1,1]) 범위 내에 있어야 합니다.

kUnityXRInputFeatureUsagePrimary2DAxis는 터치패드 또는 조이스틱을 나타내는 2D 축 기능입니다. 0,0은 대기 상태 포지션이고, 양의 Y는 컨트롤러 사용자로부터 떨어져 있습니다.

kUnityXRInputFeatureUsageSecondary2DAxiskUnityXRInputFeatureUsagePrimary2DAxis 외에 사용되는 또 다른 터치패드 또는 조이스틱을 나타내는 2D 축 기능입니다. 0,0은 대기 상태 포지션이고, 양의 Y는 컨트롤러 사용자로부터 떨어져 있습니다.

1D 축

모두 단일 차원의 아날로그 플로트 값입니다. ’반누름’할 수 있는 버튼, 트리거, 기타 컨트롤이 여기에서 식별됩니다.

kUnityXRInputFeatureUsageTrigger는 인덱스 작동 트리거에 매핑되는 1D 축입니다. 이 값은 항상 [0,1] 범위 내에 있어야 합니다. 여기서 0은 열려 있고 1은 완전히 압착되었음을 의미합니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageTriggerButton도 구현해야 합니다.

kUnityXRInputFeatureUsageGrip은 손 압착 작동 그립에 매핑되는 1D 축입니다. 이 값은 항상 [0,1] 범위 내에 있어야 합니다. 여기서 0은 열려 있고 1은 완전히 압착되었음을 의미합니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageGripButton도 구현해야 합니다.

바이너리

이것은 단일 차원의 디지털 값입니다. 작동하거나 작동하지 않을 수 있지만, 추가 세분화는 없습니다.

kUnityXRInputFeatureUsagePrimaryButton은 컨트롤러의 기본 버튼을 나타내는 바이너리 기능입니다. 이는 일반적으로 메뉴에서 수락 또는 진행 버튼으로 사용됩니다. 이 기능이 작동되면 kUnityXRInputFeatureUsagePrimaryTouch도 작동되어야 합니다(존재하는 경우).

kUnityXRInputFeatureUsagePrimaryTouch는 컨트롤러에 있는 기본 버튼의 터치 상태를 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsagePrimaryButton을 구현해야 합니다.

kUnityXRInputFeatureUsageSecondaryButton은 컨트롤러의 보조 버튼을 나타내는 바이너리 기능입니다. 이는 일반적으로 뒤로 또는 대체 버튼으로 사용됩니다. 이 기능이 작동되면 kUnityXRInputFeatureUsageSecondaryTouch도 작동되어야 합니다(존재하는 경우).

kUnityXRInputFeatureUsageSecondaryTouch는 컨트롤러에 있는 보조 버튼의 터치 상태를 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageSecondaryButton을 구현해야 합니다.

kUnityXRInputFeatureUsageGripButton은 손 작동 압착이 트리거되었는지 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageGrip도 구현해야 합니다.

kUnityXRInputFeatureUsageTriggerButton은 손 작동 압착이 트리거되었는지 나타내는 부울 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageTrigger도 구현해야 합니다.

kUnityXRInputFeatureUsageMenuButton은 게임플레이가 아닌 일시 정지 또는 메뉴 버튼을 나타내는 바이너리 기능입니다. 일반적으로 사용자가 쉽게 접근할 수 없습니다.

kUnityXRInputFeatureUsagePrimary2DAxisClickkUnityXRInputFeatureUsagePrimary2DAxis 2D 축의 누름 또는 클릭을 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsagePrimary2DAxis를 구현해야 합니다. 이 기능이 작동되면 kUnityXRInputFeatureUsagePrimary2DAxisTouch도 작동되어야 합니다(존재하는 경우).

kUnityXRInputFeatureUsagePrimary2DAxisTouchkUnityXRInputFeatureUsagePrimary2DAxis 2D 축의 가벼운 터치를 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsagePrimary2DAxis를 구현해야 합니다.

kUnityXRInputFeatureUsageSecondary2DAxisClickkUnityXRInputFeatureUsageSecondary2DAxis 2D 축의 누름 또는 클릭을 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageSecondary2DAxis를 구현해야 합니다. 이 기능이 작동되면 kUnityXRInputFeatureUsageSecondary2DAxisTouch도 작동되어야 합니다(존재하는 경우).

kUnityXRInputFeatureUsageSecondary2DAxisTouchkUnityXRInputFeatureUsageSecondary2DAxis 2D 축의 가벼운 터치를 나타내는 바이너리 기능입니다. 이 기능이 구현된 경우 기기는 kUnityXRInputFeatureUsageSecondary2DAxis를 구현해야 합니다.

센서 기반

개별 센서 타입을 나타냅니다. 손 및 눈 타입 데이터를 찾기 위한 짧은 표기로 사용됩니다.

kUnityXRInputFeatureUsageHandData는 손 트래킹 데이터를 나타내는 UnityXRHands 기능입니다. kUnityXRInputFeatureUsageEyesData는 눈 트래킹 데이터를 나타내는 UnityXREyes 기능입니다.

새로운 입력 시스템 기기 레이아웃

새로운 입력 시스템을 사용하는 경우 기기 프로퍼티에 액세스하기 위해 사용자가 코드를 바인딩하고 사용할 수 있도록 지원하려면 입력 공급자의 일부로 기기 레이아웃 설명을 제공해야 합니다.

입력 공급자에서 정의한 각 기기 타입에 대한 기기 레이아웃을 제공해야 합니다. 등록한 기기에 대한 명시적인 기기 레이아웃을 제공하지 않으면 사용자가 새로운 입력 시스템 UI를 사용하여 기기의 기능에 바인딩할 수 없습니다. 입력 시스템은 기기 데이터를 여전히 ​​수신하며, 사용자는 새로운 기기 기능에 대한 바인딩을 수동으로 생성할 수 있습니다.

입력 시스템 기기 레이아웃에 대한 자세한 내용은 입력 시스템 문서를 참조하십시오. 아래에는 구현 용의성을 위한 예제가 나와 있습니다.

예제 기기 레이아웃

이 예제는 새로운 예제 VR 컨트롤러의 레이아웃을 제공합니다. 예제 VR 컨트롤러의 XRSDK 레이아웃 정의는 다음을 포함하는 것으로 설명됩니다. - exampleButton이라고 불리는 추가 kUnityXRInputFeatureTypeBinary - examplePosition이라고 불리는 kUnityXRInputFeatureTypeAxis3D 값 - exampleRotation이라고 불리는 kUnityXRInputFeatureTypeRotation

사용자가 새로운 입력 시스템을 사용하여 기기를 바인딩하고 제어하도록 허용하려면 새로운 예제 VR 컨트롤러에 대한 기기 레이아웃을 제공해야 합니다.

먼저 InputControlLayout 속성을 제공하고, 새로운 입력 시스템 UI에 사용할 명시적인 이름도 제공해야 합니다. [Preseve] 속성을 사용하여 이러한 요소들이 컴파일 단계에서 스트리핑되지 않았는지 확인하십시오.

[Preserve]
[InputControlLayout(displayName = "Example VR Controller")]
public class ExampleVRController : XRController
{

그런 다음, XRSDK 레이아웃에서 정의된 다양한 요소에 대한 InputControl 매핑을 제공합니다. [Preserve]를 다시 사용하여 이러한 요소들이 빌드 단계에서 스트리핑되지 않았는지 확인하십시오. aliases 키워드를 사용하면 새로운 입력 시스템이 제공되는 별칭을 기반으로 일반 매칭을 수행할 수 있습니다.

        [Preserve]
                [InputControl(aliases = new[] { "PrimaryButton" })]
                public ButtonControl exampleButton { get; private set; }
                [Preserve]
                [InputControl]
                public Vector3Control examplePosition { get; private set; }
                [Preserve]
                [InputControl]
                public QuaternionControl exampleRotation { get; private set; }

마지막으로, 컨트롤 매핑을 컨트롤의 인스턴스에 바인딩하는 FinishSetup 메서드의 구현을 제공합니다. 기본 클래스의 FinishSetup도 호출해야 합니다. 그렇지 않으면 기본 컨트롤이 바인딩되지 않습니다.

        protected override void FinishSetup()
                {
                    base.FinishSetup();

                    exampleButton = GetChildControl<ButtonControl>("exampleButton");
                    examplePosition = GetChildControl<Vector3Control>("examplePosition");
                    exampleRotation = GetChildControl<QuaternionControl>("exampleRotation");            
                }

레이아웃 등록

수행해야 하는 마지막 단계는 이러한 기기에 대해 XRSDK Loader를 시작할 때 새로운 입력 시스템에 새로운 기기 레이아웃을 등록하는 것입니다. 다음 코드는 이러한 구현의 예입니다.

제품과 일치하는 올바른 문자열, 또는 기기 연결 시 XRSDK Input Provider에서 제공하는 다른 문자열로 REGEX THAT MATCHES YOUR DEVICE 섹션을 채워야 합니다.

        public override bool Initialize()
                {
        # if UNITY_INPUT_SYSTEM
                    InputLayoutLoader.RegisterInputLayouts();
        # endif

        # if UNITY_INPUT_SYSTEM
        # if UNITY_EDITOR
            [InitializeOnLoad]
        # endif
            static class InputLayoutLoader
            {
                static InputLayoutLoader()
                {
                    RegisterInputLayouts();
                }

                public static void RegisterInputLayouts()
                {
                    UnityEngine.InputSystem.InputSystem.RegisterLayout<ExampleVRController>(
                        matches: new InputDeviceMatcher()
                            .WithInterface(XRUtilities.InterfaceMatchAnyVersion)
                            .WithProduct("<REGEX THAT MATCHES YOUR DEVICE>")
                    );


자체 입력 공급자를 생성하기 위한 체크리스트

  • 기본 라이프사이클 등록을 설정합니다.
    • Initialize, Start, Stop, Shutdown을 위한 함수 포인터가 포함된 IUnityXRInputInterface.RegisterLifecycleProvider
    • Input Provider 호출이 채워진 UnityLifecycleProvider.Initialize 콜백에서 호출된 IUnityXRInputInterface.RegisterInputProvider
  • 각 연결 기기에 대한 고유한 ID를 사용하여 IUnityXRInputInterface.InputSubsystem_DeviceConnected를 호출합니다.
  • UnityXRInputProvider.FillDeviceDefinition에서 각 기기에 대한 유효한 기기 정의를 작성합니다.
    • 유효한 이름을 추가합니다.
    • 유효한 역할을 추가합니다.
    • 최소 하나의 입력 기능을 추가합니다.
  • 각 연결 기기에 대한 UnityXRInputProvider.UpdateDeviceState에서 기기 상태를 업데이트합니다.
    • 렌더링을 위한 트래킹 포지션을 예측할 수 있는 경우 업데이트가 kUnityXRInputUpdateTypeBeforeRender 타입일 때 해당 작업을 수행합니다.
  • 경계 상자를 사용하여 IUnityXRInputInterface.InputSubsystem_SetBoundaryPoints를 호출합니다.
  • UnityXRInputProvider.QueryTrackingOriginMode, UnityXRInputProvider.QuerySupportedTrackingOriginModesUnityXRInputProvider.HandleSetTrackingOriginMode를 구현합니다.
  • UnityXRInputProvider.TryRecenter를 구현합니다.
  • 기기에 대한 새로운 입력 시스템 기기 레이아웃을 제공합니다.
하위 시스템의 런타임 발견 및 활성화
XR SDK 디스플레이 하위 시스템