Version: 2023.2
언어: 한국어
모바일 키보드
2D 게임 개발

Unity XR 입력

이 Unity 사용자 매뉴얼 섹션에서는 가상 현실, 증강 현실, Windows Mixed Reality 애플리케이션을 위한 모든 Unity 지원 입력 기기의 정보를 제공합니다. 이 페이지는 다음 주제를 다룹니다.

XR 플랫폼은 개발자들이 사용자 상호작용을 디자인할 때 활용할 수 있도록 다양한 입력 기능을 제공합니다. 애플리케이션은 포지션, 회전, 터치, 버튼, 조이스틱, 손가락 센서를 참조하는 특정 데이터를 사용할 수 있습니다. 하지만 이러한 입력 기능에 액세스하는 방식은 플랫폼마다 크게 다릅니다. 예를 들어 Vive와 Oculus Rift 간의 차이는 작지만, VR 지원 데스크톱 플랫폼과 모바일 플랫폼(예: Daydream) 간의 차이는 매우 큽니다.

Unity는 InputFeatureUsage라고 불리는 C# 구조체를 제공합니다. 이 구조체는 물리 기기 컨트롤(예: 버튼, 트리거)의 표준 집합을 정의하여 플랫폼의 사용자 입력에 액세스하도록 지원합니다. 이를 통해 이름을 기준으로 입력 타입을 식별할 수 있습니다. 각 InputFeatureUsage의 정의는 XR.Input.CommonUsages을 참조하십시오.

InputFeatureUsage는 공통 입력 액션 또는 타입에 해당합니다. 예를 들어 Unity는 사용하는 XR 플랫폼에 관계없이 trigger라고 불리는 InputFeatureUsage를 검지손가락이 제어하는 단일 축 입력으로 정의합니다. InputFeatureUsage를 사용하여 해당 이름으로 trigger 상태를 가져올 수 있으므로 기존 Unity 입력 시스템에 대해 축(또는 일부 XR 플랫폼의 버튼)을 설정할 필요가 없습니다.

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.InputDevices 클래스를 사용하여 현재 XR 시스템과 연결된 입력 기기에 액세스할 수 있습니다. 연결된 모든 기기의 리스트를 가져오려면 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가 여전히 활성화된 컨트롤러를 나타내는지 확인하십시오.

다음을 기준으로 입력 기기에 액세스할 수 있습니다.

  • 특성
  • 역할
  • XR 노드

특성별로 입력 기기에 액세스

기기 특성은 기기의 기능이나 용도(예: 헤드 마운트 여부)를 설명합니다. 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 노드는 XR 시스템의 물리적 레퍼런스 포인트를 나타냅니다. 사용자의 머리 포지션, 오른손과 왼손, 추적 참조(예: Oculus 카메라)를 예로 들 수 있습니다.

XRNode 열거형은 다음 노드를 정의합니다.

XR 노드 설명
CenterEye 사용자 동공 사이의 중간 지점입니다.
GameController 콘솔 스타일 게임 컨트롤러입니다. 앱이 여러 개의 게임 컨트롤러 기기를 보유할 수 있습니다.
HardwareTracker 대개 사용자 또는 물리 제품에 연결되는 하드웨어 추적 기기입니다. 다수의 하드웨어 트래커 노드가 존재할 수 있습니다.
Head 사용자 머리의 중앙 지점(XR 시스템의 계산에 기반)입니다.
LeftEye 사용자의 왼쪽 눈입니다.
LeftHand 사용자의 왼손입니다.
RightEye 사용자의 오른쪽 눈입니다.
RightHand 사용자의 오른손입니다.
TrackingReference Oculus 카메라 등과 같은 추적 레퍼런스 포인트입니다. 다수의 추적 레퍼런스 노드가 존재할 수 있습니다.

InputDevices.GetDevicesAtXRNode를 사용하여 특정 XRNode와 연결된 기기 리스트를 가져옵니다. 예를 들어 다음은 왼손잡이용 컨트롤러를 가져오는 방법의 예시입니다.

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.deviceConnectedInputDevices.deviceDisconnected를 사용하여 기기가 연결되거나 연결 해제될 때 애플리케이션에 알릴 수 있습니다. 또한 새로 연결된 입력 기기에 대한 레퍼런스도 제공합니다.

이러한 레퍼런스는 여러 프레임에 걸쳐 유지할 수 있으므로 기기가 연결 해제되거나, 더 이상 이용할 수 없게 될 수 있습니다. 기기의 입력을 여전히 사용할 수 있는지 확인하려면 InputDevice.isValid를 사용하십시오. 입력 기기에 액세스하는 스크립트는 해당 기기를 사용하기 전에 각 프레임 시작 시 이러한 점을 확인해야 합니다.

입력 기기의 입력 기능에 액세스

특정 InputDevice에서 트리거 버튼 상태 등과 같은 입력 기능을 읽을 수 있습니다. 예를 들어 올바른 트리거 상태를 확인하려면 다음 절차를 따르십시오.

  1. InputDeviceRole.RightHanded 또는 XRNode.RightHand를 사용하여 오른손잡이용 기기의 인스턴스를 가져옵니다.
  2. 올바른 기기가 있으면 InputDevice.TryGetFeatureValue 메서드를 사용하여 현재 상태에 액세스합니다.

TryGetFeatureValue()는 기능의 현재 값에 액세스하려고 시도하며 다음을 반환합니다.

  • 특정 기능 값을 검색해서 가져오면 true를 반환합니다.
  • 현재 기기가 특정 기능을 지원하지 않거나, 기기가 유효하지 않은 경우(예: 컨트롤러 비활성) false를 반환합니다.

특정 버튼, 터치 입력 또는 조이스틱 축 값을 가져오려면 CommonUsages 클래스를 사용하십시오. CommonUsages는 포지션, 회전 등과 같은 트래킹 기능을 비롯하여 각 InputFeatureUsageXR 입력 매핑 테이블에 포함합니다. 다음 예제 코드는 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()));
            }
        }
    }
}

primaryButton 예시

다양한 컨트롤러 설정을 통해 다양한 기능에 액세스할 수 있습니다. 예를 들어 한 시스템에 여러 개의 컨트롤러가 있거나, 여러 개의 시스템에 여러 개의 컨트롤러가 있거나, 여러 개의 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 공간의 위치, 개별 눈이 깜박이는 횟수로 구성됩니다. 눈 트래킹의 데이터는 Eyes입니다. 기기에서 이 데이터를 검색해서 가져오려면 CommonUsages.eyesData를 사용하십시오.

XRInputSubsystem 및 InputDevice 연결

Unity는 두 가지의 입력 시스템, 즉 레거시 입력 시스템과 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는 다음의 원점 추적 모드를 지원합니다.

  • Device: 원점이 기본 디스플레이 기기(때때로 HMD 또는 전화기)의 첫 번째 알려진 위치에 있습니다.
  • Floor: 원점이 바닥의 알려진 위치에 있습니다.
  • Tracking Reference: 원점이 TrackingReference 특성 집합이 있는 InputDevice에 있습니다.
  • Unknown: 알 수 없는 원점 추적 타입입니다. 이는 시스템 장애 또는 추적 원점 모드 지원 부재 때문일 수 있습니다.

다음의 세 가지 API를 사용하여 원점 추적 모드를 관리할 수 있습니다.

레거시 입력 시스템을 통한 XR 입력

InputXR.InputTracking으로 구성된 레거시 입력 시스템을 사용하여 XR 입력 기능을 검색해서 가져올 수 있습니다. 이렇게 하려면 이 페이지의 XR 입력 매핑 표에서 적절한 레거시 입력 인덱스를 사용하십시오. Player SettingsInput 섹션(메뉴: 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);
            }
    }
}
모바일 키보드
2D 게임 개발