이 Unity 사용자 매뉴얼 섹션에서는 가상 현실, 증강 현실, Windows Mixed Reality 애플리케이션을 위한 모든 Unity 지원 입력 기기의 정보를 제공합니다. 이 페이지는 다음의 항목을 다룹니다.
XR 플랫폼에는 사용자 상호 작용을 설계할 때 활용할 수 있는 다양한 입력 기능이 있습니다. 애플리케이션은 위치, 회전, 터치, 버튼, 조이스틱, 손가락 센서를 참조하는 특정 데이터를 사용할 수 있습니다. 하지만 이러한 입력 기능에 대한 액세스는 플랫폼마다 매우 다를 수 있습니다. 예를 들어 Vive와 Oculus Rift 간에는 약간의 차이가 있지만, VR이 활성화된 데스크톱 플랫폼과 Daydream 같은 모바일 플랫폼은 훨씬 더 다릅니다.
Unity는 모든 플랫폼에서 사용자 입력에 액세스하기 위한 표준 물리적 기기 컨트롤 세트(예: 버튼, 트리거)를 정의하는 InputFeatureUsage라는 C# 구조체를 제공합니다. 이를 통해 이름을 기준으로 입력 유형을 식별할 수 있습니다. 각 InputFeatureUsage의 정의는 XR.Input.CommonUsages를 참조하십시오.
각 InputFeatureUsage는 공통 입력 동작 또는 유형에 해당합니다. 예를 들어 Unity는 사용하는__ XR__XR은 VR(가상 현실), AR(증강 현실)과 MR(혼합 현실) 애플리케이션을 모두 포함하는 포괄적인 용어입니다. 이러한 형태의 인터랙티브 애플리케이션을 지원하는 기기를 XR 기기라고 합니다. 자세한 정보
See in Glossary 플랫폼에 관계없이 trigger라는 InputFeatureUsage를 검지 손가락으로 제어하는 단일 축 입력으로 정의합니다. InputFeatureUsage로 이름을 사용하여 trigger 상태를 가져올 수 있으므로 기존 Unity Input System에 축(또는 일부 XR 플랫폼의 버튼)을 설정할 필요가 없습니다.
다음 표에는 표준 컨트롤러 InputFeatureUsage 이름과 인기 XR 시스템의 컨트롤러에 매핑되는 방식이 나와 있습니다.
| InputFeatureUsage | 기능 유형 | 레거시 입력 인덱스(왼쪽 컨트롤러/오른쪽 컨트롤러) | WMR | Oculus | GearVR | Daydream | OpenVR (Full) | Vive | OpenVR을 통한 Oculus | OpenVR을 통한 WMR | |:—|:—|:—|:—|:—|:—|:—|:—|:—|:—|:—| | primary2DAxis | 2D 축 | [(1,2)/(4,5)] | 터치패드 | 조이스틱 | 터치패드 | 터치패드 | 트랙패드/조이스틱 | 트랙패드 | 조이스틱 | 조이스틱 | | trigger | 축 | [9/10] | 트리거 | 트리거 | 트리거 | 트리거 | 트리거 | 트리거 | 트리거 | 트리거 | | grip | 축 | [11/12] | 그립 | 그립 | | 범퍼 | 그립 | 그립 | 그립 | 그립 | | secondary2DAxis | 2D 축 | [(17,18)/(19,20)] | 조이스틱 | | | | | | | 터치패드 | | secondary2DAxisClick|버튼|[18/19]|조이스틱 - 클릭| | | | | | | | | primaryButton | 버튼 | [2/0] | | [X/A] - 누르기 | | 앱 | 기본 | 기본 (샌드위치 버튼)(1) | 기본 (Y/B) | 메뉴 | | primaryTouch | 버튼 | [12/10] | | [X/A] - 터치 | | | | | | | | secondaryButton | 버튼 | [3/1] | | [Y/B] - 누르기 | | | 대체 | | 대체 (X/A) | | | secondaryTouch | 버튼 | [13/11] | | [Y/B] - 터치 | | | | | | | | gripButton | 버튼 | [4/5] | 그립 - 누르기 | 그립 - 누르기 | | | 그립 - 누르기 | 그립 - 누르기 | 그립 - 누르기 | 그립 - 누르기 | | triggerButton | 버튼 | [14/15] | 트리거 - 누르기 | 트리거 - 누르기 | 트리거 - 누르기 | 트리거 - 누르기 | 트리거 - 누르기 | 트리거 - 누르기 | 트리거 - 터치 | 트리거 - 누르기 | | menuButton | 버튼 | [6/7] | 메뉴 | 시작 (왼쪽 컨트롤러 전용) | | | | | | | | primary2DAxisClick | 버튼 | [8/9] | 터치패드 - 클릭 | 썸스틱 - 누르기 | 터치패드 - 누르기 | 터치패드 - 누르기 | 트랙패드/조이스틱 - 누르기 | 트랙패드 - 누르기 | 조이스틱 - 누르기 | 터치패드 - 누르기 | | primary2DAxisTouch | 버튼 | [16/17] | 터치패드 - 터치 | 썸스틱 - 터치 | 터치패드 - 터치 | 터치패드 - 터치 | 트랙패드/조이스틱 - 터치 | 트랙패드 - 터치 | 조이스틱 - 터치 | 터치패드 - 터치 | | batteryLevel| 축| | 배터리 잔량 | | | | | | | | | userPresence| 버튼 | | 사용자 존재 | 사용자 존재 | | | | | | |
(1) 샌드위치 버튼은 Vive 메뉴 버튼을 나타냅니다. 크로스 플랫폼 애플리케이션을 효과적으로 처리하기 위해 이 버튼은 menuButton이 아닌 primaryButton에 매핑됩니다.
각 InputFeatureUsage의 정의는 XR.Input.CommonUsages를 참조하십시오.
InputDevice는 컨트롤러, 휴대폰 또는 헤드셋과 같은 모든 물리적 기기를 나타냅니다. 기기 추적, 버튼, 조이스틱, 기타 입력 컨트롤에 대한 정보가 포함될 수 있습니다. InputDevice API에 대한 자세한 내용은 InputDevice 기술 자료를 참조하십시오.
현재 XR 시스템에 연결된 입력 기기에 액세스하려면 XR.InputDevices 클래스를 사용합니다. 연결된 모든 기기 목록을 가져오려면 다음과 같이 InputDevices.GetDevices를 사용합니다.
var inputDevices = new List<UnityEngine.XR.InputDevice>();
UnityEngine.XR.InputDevices.GetDevices(inputDevices);
foreach (var device in inputDevices)
{
Debug.Log(string.Format("Device found with name '{0}' and role '{1}'", device.name, device.role.ToString()));
}
입력 기기는 XR 시스템이 연결을 해제할 때까지 프레임에 걸쳐 유효합니다. InputDevice.IsValid 프로퍼티를 사용하여 InputDevice가 여전히 활성 컨트롤러를 나타내는지 확인합니다.
다음을 기준으로 입력 기기에 액세스할 수 있습니다.
기기 특성은 기기가 무엇을 할 수 있는지, 또는 기기가 무엇에 사용되는지(예: 헤드 마운트 여부)를 설명합니다. InputDeviceCharacteristics는 특정 사양에 맞는 기기를 검색하기 위해 코드에 추가할 수 있는 일련의 플래그입니다. 다음 특성을 기준으로 기기를 필터링할 수 있습니다.
| 기기 | 특성 |
|---|---|
| HeadMounted | 기기가 사용자의 머리에 연결됩니다. 기기 추적과 시선 중앙 추적이 있습니다 이 플래그는 HMD(헤드 마운트 디스플레이)를 식별하는 데 가장 자주 사용됩니다. |
| Camera | 기기에 카메라 추적 기능이 있습니다. |
| HeldInHand | 사용자가 기기를 손으로 잡습니다. |
| HandTracking | 이 기기는 물리적으로 추적되는 손을 나타냅니다. 기기 추적 기능이 있으며, 손과 뼈대 데이터가 포함될 수 있습니다. |
| EyeTracking | 이 기기는 시선 추적을 수행할 수 있으며 EyesData 기능이 있습니다. |
| TrackedDevice | 기기를 3D 공간에서 추적할 수 있습니다. 기기 추적 기능이 있습니다. |
| Controller | 기기에 버튼 및 축에 대한 입력 데이터가 있으며, 컨트롤러로 사용할 수 있습니다. |
| TrackingReference | 이 기기는 정적 추적 레퍼런스 오브젝트를 나타냅니다. 기기 추적 기능이 있지만 추적 데이터가 변경되어선 안 됩니다. |
| Left | 이 특성을 HeldInHand 또는 HandTracking 특성과 함께 사용하여 왼손에 연결된 기기를 식별할 수 있습니다. |
| Right | 이 특성을 HeldInHand 또는 HandTracking 특성과 함께 사용하여 오른손에 연결된 기기를 식별할 수 있습니다. |
| Simulated6DOF | 이 기기는 6DOF 데이터를 보고하지만 3DOF 센서만 있습니다. Unity가 위치 데이터를 시뮬레이션합니다. |
기본 XR SDK는 이러한 특성을 보고합니다. InputDevice.Characteristics로 검색할 수 있습니다. 기기에는 비트 플래그를 사용하여 필터링하고 액세스할 수 있는 여러 특성이 있을 수 있으며, 있어야 하는 경우가 많습니다.
InputDevices.GetDevicesWithCharacteristics는 특정 특성 세트를 가진 모든 기기를 검색하는 방법을 제공합니다. 예를 들어 다음 코드를 사용하여 시스템에서 사용 가능한 Left, HeldInHand, Controller InputDevices를 검색할 수 있습니다.
var leftHandedControllers = new List<UnityEngine.XR.InputDevice>();
var desiredCharacteristics = UnityEngine.XR.InputDeviceCharacteristics.HeldInHand | UnityEngine.XR.InputDeviceCharacteristics.Left | UnityEngine.XR.InputDeviceCharacteristics.Controller;
UnityEngine.XR.InputDevices.GetDevicesWithCharacteristics(desiredCharacteristics, leftHandedControllers);
foreach (var device in leftHandedControllers)
{
Debug.Log(string.Format("Device name '{0}' has characteristics '{1}'", device.name, device.characteristics.ToString()));
}
이 함수가 찾는 기기에는 지정된 특성이 포함되는데, 추가 특성이 포함될 수 있습니다. 예를 들어 왼손잡이 컨트롤러를 찾으려면 InputDeviceCharacteristic.Controller가 아닌 InputDeviceCharacteristic.Left만 찾으면 됩니다.
기기 역할은 입력 기기의 일반적인 기능을 설명합니다. 기기 역할을 지정하려면 InputDeviceRole 열거형을 사용합니다. 정의된 역할은 다음과 같습니다.
| 역할 | 설명 |
|---|---|
| GameController | 콘솔 스타일 게임 컨트롤러입니다. |
| Generic | HMD, 모바일 기기 같은 핵심 XR 기기를 나타내는 기기입니다. |
| HardwareTracker | 추적 기기입니다. |
| LeftHanded | 왼손잡이 사용자를 위한 기기입니다. |
| RightHanded | 오른손잡이 사용자를 위한 기기입니다. |
| TrackingReference | Oculus 추적 카메라 같은 다른 기기를 추적하는 기기입니다. |
기본 XR SDK는 이러한 역할을 보고하는데, 제공 업체마다 기기 역할을 다르게 구성할 수 있습니다. 또한 사용자가 손을 전환할 수 있으므로 역할 할당이 사용자가 입력 기기를 잡는 손과 일치하지 않을 수 있습니다. 예를 들어 사용자는 Daydream 컨트롤러를 오른손이나 왼손으로 설정해야 하지만, 컨트롤러를 반대쪽 손으로 잡을 수도 있습니다.
GetDevicesWithRole은 특정 InputDeviceRole이 있는 모든 기기 목록을 제공합니다. 예를 들어, InputDeviceRole.GameController를 사용하여 연결된 모든 GameController 기기를 가져올 수 있습니다.
var gameControllers = new List<UnityEngine.XR.InputDevice>();
UnityEngine.XR.InputDevices.GetDevicesWithRole(UnityEngine.XR.InputDeviceRole.GameController, gameControllers);
foreach (var device in gameControllers)
{
Debug.Log(string.Format("Device name '{0}' has role '{1}'", device.name, device.role.ToString()));
}
XR 노드는 XR 시스템의 물리적 레퍼런스 포인트를 나타냅니다. 사용자의 머리 위치, 오른손과 왼손, 추적 참조(예: Oculus 카메라)를 예로 들 수 있습니다.
XRNode 열거형은 다음 노드를 정의합니다.
| XR 노드 | 설명 |
|---|---|
| CenterEye | 사용자 동공 사이의 중간 지점입니다. |
| GameController | 콘솔 스타일 게임 컨트롤러입니다. 앱이 여러 개의 게임 컨트롤러 기기를 보유할 수 있습니다. |
| HardwareTracker | 대개 사용자 또는 물리 제품에 연결되는 하드웨어 추적 기기입니다. 여러 하드웨어 트래커 노드가 존재할 수 있습니다. |
| Head | 사용자 머리의 중앙 지점(XR 시스템의 계산에 기반)입니다. |
| LeftEye | 사용자의 왼쪽 눈입니다. |
| LeftHand | 사용자의 왼손입니다. |
| RightEye | 사용자의 오른쪽 눈입니다. |
| RightHand | 사용자의 오른손입니다. |
| TrackingReference | Oculus 카메라 같은 추적 레퍼런스 지점입니다. 여러 추적 레퍼런스 노드가 존재할 수 있습니다. |
특정 XRNode와 연결된 기기 목록을 가져오려면 InputDevices.GetDevicesAtXRNode를 사용합니다. 다음 예시에서는 왼손잡이 컨트롤러를 가져오는 방법을 보여 줍니다.
var leftHandDevices = new List<UnityEngine.XR.InputDevice>();
UnityEngine.XR.InputDevices.GetDevicesAtXRNode(UnityEngine.XR.XRNode.LeftHand, leftHandDevices);
if(leftHandDevices.Count == 1)
{
UnityEngine.XR.InputDevice device = leftHandDevices[0];
Debug.Log(string.Format("Device name '{0}' with role '{1}'", device.name, device.role.ToString()));
}
else if(leftHandDevices.Count > 1)
{
Debug.Log("Found more than one left hand!");
}
입력 기기는 프레임에서 프레임까지 일관되지만 언제든지 연결하거나 연결 해제할 수 있습니다. 기기가 플랫폼에 연결되었는지 반복적으로 확인하지 않으려면 InputDevices.deviceConnected 및 InputDevices.deviceDisconnected를 사용하여 기기가 연결되거나 연결 해제되면 애플리케이션에 알립니다. 또한 새로 연결된 입력 기기에 대한 레퍼런스도 제공합니다.
여러 프레임에 걸쳐 이러한 레퍼런스를 유지할 수 있으므로 기기 연결이 해제되거나 더 이상 사용할 수 없을 수 있습니다. 기기의 입력을 계속 사용할 수 있는지 확인하려면 InputDevice.isValid를 사용하십시오. 입력 기기에 액세스하는 스크립트는 해당 기기를 사용하기 전에 각 프레임의 시작 부분에서 이를 확인해야 합니다.
특정 InputDevice에서 트리거 버튼의 상태 같은 입력 기능을 읽을 수 있습니다. 예를 들어 오른쪽 트리거의 상태를 읽으려면 다음 단계를 따르십시오.
TryGetFeatureValue()는 기능의 현재 값에 액세스하려고 시도하며 다음을 반환합니다.
특정 버튼, 터치 입력 또는 조이스틱 축 값을 가져오려면 CommonUsages 클래스를 사용합니다. CommonUsages에는 각 InputFeatureUsage가 XR 입력 매핑 표에 포함되며 위치 및 회전 같은 추적 기능도 포함됩니다. 다음 코드 예시는 CommonUsages.triggerButton을 사용하여 사용자가 특정 InputDevice 인스턴스에서 현재 트리거 버튼을 누르고 있는지 감지합니다.
bool triggerValue;
if (device.TryGetFeatureValue(UnityEngine.XR.CommonUsages.triggerButton, out triggerValue) && triggerValue)
{
Debug.Log("Trigger button is pressed.");
}
InputDevice.TryGetFeatureUsages 메서드를 사용하여 기기가 제공하는 모든 InputFeatureUsage 목록을 가져올 수도 있습니다. 이 함수는 기능을 설명하는 유형과 이름 프로퍼티가 있는 InputFeatureUsage 항목 목록을 반환합니다. 다음 예시는 특정 입력 기기가 제공하는 모든 부울 기능을 열거합니다.
var inputFeatures = new List<UnityEngine.XR.InputFeatureUsage>();
if (device.TryGetFeatureUsages(inputFeatures))
{
foreach (var feature in inputFeatures)
{
if (feature.type == typeof(bool))
{
bool featureValue;
if (device.TryGetFeatureValue(feature.As<bool>(), out featureValue))
{
Debug.Log(string.Format("Bool feature {0}'s value is {1}", feature.name, featureValue.ToString()));
}
}
}
}
컨트롤러 설정에 따라 다양한 기능에 액세스할 수 있습니다. 예를 들어 하나의 시스템에 여러 개의 컨트롤러가 있거나, 다른 시스템에 여러 개의 컨트롤러가 있거나, 다른 SDK를 사용하는 동일한 컨트롤러에 여러 개의 버튼이 있을 수 있습니다. 이러한 다양성으로 인해 다양한 XR 시스템의 입력을 지원하기가 더 복잡해집니다. Unity InputFeatureUsage API를 사용하면 플랫폼에 의존하지 않는 입력을 얻을 수 있습니다.
다음 예시에서는 컨트롤러나 입력 기기에 관계없이 primaryButton이라는 InputFeatureUsage에 액세스합니다. 예시에는 기기를 연결할 때 primaryButton에 사용 가능한 기기를 검색하는 클래스가 포함되어 있습니다. 이 클래스는 연결된 기기에서 기능의 값을 모니터링하고 값이 변경되면 클래스가 UnityEvent를 디스패치합니다.
이 클래스를 사용하려면 씬의 모든 게임 오브젝트에 컴포넌트로 추가하십시오. 예시:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.XR;
[System.Serializable]
public class PrimaryButtonEvent : UnityEvent<bool> { }
public class PrimaryButtonWatcher : MonoBehaviour
{
public PrimaryButtonEvent primaryButtonPress;
private bool lastButtonState = false;
private List<InputDevice> devicesWithPrimaryButton;
private void Awake()
{
if (primaryButtonPress == null)
{
primaryButtonPress = new PrimaryButtonEvent();
}
devicesWithPrimaryButton = new List<InputDevice>();
}
void OnEnable()
{
List<InputDevice> allDevices = new List<InputDevice>();
InputDevices.GetDevices(allDevices);
foreach(InputDevice device in allDevices)
InputDevices_deviceConnected(device);
InputDevices.deviceConnected += InputDevices_deviceConnected;
InputDevices.deviceDisconnected += InputDevices_deviceDisconnected;
}
private void OnDisable()
{
InputDevices.deviceConnected -= InputDevices_deviceConnected;
InputDevices.deviceDisconnected -= InputDevices_deviceDisconnected;
devicesWithPrimaryButton.Clear();
}
private void InputDevices_deviceConnected(InputDevice device)
{
bool discardedValue;
if (device.TryGetFeatureValue(CommonUsages.primaryButton, out discardedValue))
{
devicesWithPrimaryButton.Add(device); // Add any devices that have a primary button.
}
}
private void InputDevices_deviceDisconnected(InputDevice device)
{
if (devicesWithPrimaryButton.Contains(device))
devicesWithPrimaryButton.Remove(device);
}
void Update()
{
bool tempState = false;
foreach (var device in devicesWithPrimaryButton)
{
bool primaryButtonState = false;
tempState = device.TryGetFeatureValue(CommonUsages.primaryButton, out primaryButtonState) // did get a value
&& primaryButtonState // the value we got
|| tempState; // cumulative result from other controllers
}
if (tempState != lastButtonState) // Button state changed since last frame
{
primaryButtonPress.Invoke(tempState);
lastButtonState = tempState;
}
}
}
다음 PrimaryReactor 클래스는 PrimaryButtonWatcher를 사용하여 기본 버튼을 누르고 누름에 대한 응답으로 해당 부모 게임 오브젝트를 회전할 때를 감지합니다. 이 클래스를 사용하려면 큐브 같이 눈에 보이는 게임 오브젝트에 추가하고 PrimaryButtonWatcher 레퍼런스를 Watcher 프로퍼티로 드래그합니다.
using System.Collections;
using UnityEngine;
public class PrimaryReactor : MonoBehaviour
{
public PrimaryButtonWatcher watcher;
public bool IsPressed = false; // used to display button state in the Unity Inspector window
public Vector3 rotationAngle = new Vector3(45, 45, 45);
public float rotationDuration = 0.25f; // seconds
private Quaternion offRotation;
private Quaternion onRotation;
private Coroutine rotator;
void Start()
{
watcher.primaryButtonPress.AddListener(onPrimaryButtonEvent);
offRotation = this.transform.rotation;
onRotation = Quaternion.Euler(rotationAngle) * offRotation;
}
public void onPrimaryButtonEvent(bool pressed)
{
IsPressed = pressed;
if (rotator != null)
StopCoroutine(rotator);
if (pressed)
rotator = StartCoroutine(AnimateRotation(this.transform.rotation, onRotation));
else
rotator = StartCoroutine(AnimateRotation(this.transform.rotation, offRotation));
}
private IEnumerator AnimateRotation(Quaternion fromRotation, Quaternion toRotation)
{
float t = 0;
while (t < rotationDuration)
{
transform.rotation = Quaternion.Lerp(fromRotation, toRotation, t / rotationDuration);
t += Time.deltaTime;
yield return null;
}
}
}
InputDevices는 손 추적 기기를 지원합니다. 손 추적 기기는 항상 다음과 같습니다.
손 추적 데이터는 손 오브젝트와 최대 21개의 뼈대 입력 기능으로 구성됩니다. 각 뼈대에는 위치와 방향이 있으며 계층 구조에 부모 뼈대와 자식 뼈대에 대한 레퍼런스도 있습니다. 손 오브젝트는 루트 뼈대나 각 손가락의 뼈대 목록을 가져올 수 있습니다.
Hand.TryGetRootBone이 루트 뼈대를 가져오면 손목 바로 위에 있는 뼈대를 나타내는 오브젝트를 검색합니다. 각 손가락을 나타내는 뼈대 목록도 가져올 수 있습니다. Hand.TryGetFingerBones를 호출하면 손가락 관절에서 손가락 끝까지 해당 손가락을 나타내는 뼈대의 목록이 반환됩니다.
입력 기기는 눈 추적 기기와 손 추적 기기를 지원합니다. 눈 추적은 왼쪽 및 오른쪽 눈 위치, 사용자가 바라보는 3D 공간의 위치, 각각의 눈이 깜박이는 정도로 구성됩니다. 해당 데이터 유형은 눈입니다. 기기에서 가져오려면 CommonUsages.eyesData를 사용하십시오.
Unity는 레거시 Input System과 2019.2에 도입된 XR 플러그인 아키텍처 같은 두 가지 입력 시스템을 제공합니다. 새 설정에서 각 InputDevice는 XRInputSubsystem과 연결됩니다. 이러한 보조 시스템 오브젝트는 특정 입력 기기와 관련이 없는 전역 입력 동작을 제어합니다(예: 추적 원점 관리, 추적된 기기의 원점 재설정).
각 InputDevice에는 연결된 보조 시스템에 대한 레퍼런스가 포함되어 있습니다. 기기가 연동된 플랫폼에서 제공된 경우 이 레퍼런스는 null입니다. SubsystemManager.GetInstances<XRInputSubsystem>으로 모든 활성 XRInputSubsystem 오브젝트를 가져올 수도 있으며, 각 XRInputSubsystem은 XRInputSubsystem.TryGetInputDevices로 해당 기기를 가져올 수도 있습니다.
입력 하위 시스템을 사용하여 UnityEngine.XR.XRInputSubsystem을 사용해 기기의 원점을 재설정할 수 있습니다. 원점 재설정은 HMD의 현재 위치를 모든 기기의 새로운 원점으로 설정하는 것입니다. 원점으로 재설정할 수 없는 기기나 플랫폼이 원점 재설정을 지원하지 않는 경우에는 false를 반환합니다.
추적 경계를 가져오려면 TryGetBoundaryPoints를 사용합니다. 이는 일련의 시계 방향으로 정렬된 3D 지점으로 구성되며, y 값은 바닥 수준에 있으며, 콘텐츠와 상호 작용을 배치하기 위해 사용자가 지정한 ‘안전 영역’을 표시합니다. XRInputSubsystem.boundaryChanged를 사용하여 이 경계의 변경 사항을 수신할 수 있습니다.
또한 XRInputSubsystem은 추적 월드의 원점 위치에 대한 컨텍스트를 제공하는 추적 원점 모드를 담당합니다. Unity는 다음의 추적 원점 모드를 지원합니다.
다음의 세 가지 API를 사용하여 원점 추적 모드를 관리할 수 있습니다.
여전히 Input 및 XR.InputTracking으로 구성된 레거시 입력 시스템을 사용하여 XR 입력 기능을 검색할 수 있습니다. 이렇게 하려면 이 페이지의 XR 입력 매핑 표에서 적절한 레거시 입력 인덱스를 사용하십시오. Player Settings 의 Input 섹션(메뉴: Edit > Project Settings > Input)에서 플랫폼 기기의 기능에 맞게 입력 이름과 축 인덱스를 연결하는 축 매핑을 생성합니다. 버튼 또는 축 값을 가져오려면 Input.GetAxis 또는 Input.GetButton을 사용하고 현재 매핑된 축 또는 버튼 이름을 전달합니다.
버튼 및 조이스틱 축을 사용하는 방법에 관한 자세한 내용은 InputManager에 대한 기술 자료를 참조하십시오.
햅틱 이벤트를 InputDevice로 전송할 수 있습니다. 햅틱은 진폭과 지속 시간이 있는 임펄스 형태입니다.
모든 플랫폼이 모든 햅틱 유형을 지원하지는 않지만, 햅틱 기능을 기기에 쿼리할 수 있습니다. 다음 예시는 오른손잡이용 입력 기기를 가져온 후 해당 기기가 햅틱 기능을 지원하는지 확인하고, 지원하는 경우 임펄스를 재생합니다.
List<UnityEngine.XR.InputDevice> devices = new List<UnityEngine.XR.InputDevice>();
UnityEngine.XR.InputDevices.GetDevicesWithRole(UnityEngine.XR.InputDeviceRole.RightHanded, devices);
foreach (var device in devices)
{
UnityEngine.XR.HapticCapabilities capabilities;
if (device.TryGetHapticCapabilities(out capabilities))
{
if (capabilities.supportsImpulse)
{
uint channel = 0;
float amplitude = 0.5f;
float duration = 1.0f;
device.SendHapticImpulse(channel, amplitude, duration);
}
}
}