Контроллеры движения в Unity

Существует два основных способа выполнения действий с вашим взглядом в Unity: жесты рук и контроллеры движения в HoloLens и иммерсивный HMD. Доступ к данным для обоих источников пространственного ввода осуществляется через одни и те же API в Unity.

Unity предоставляет два основных способа доступа к пространственным входным данным для Windows Mixed Reality. Общие API Input.GetButton/Input.GetAxis работают в нескольких пакетах SDK для Unity XR, а API InteractionManager/GestureRecognizer, характерный для Windows Mixed Reality, предоставляет полный набор пространственных входных данных.

Интерфейсы API ввода XR Unity

Для новых проектов мы рекомендуем использовать новые входные API XR с самого начала.

Дополнительные сведения об API XR можно найти здесь.

Таблица сопоставления кнопок и осей Unity

Диспетчер ввода Unity для контроллеров движения Windows Mixed Reality поддерживает идентификаторы кнопок и осей, перечисленные ниже с помощью API Input.GetButton/GetAxis. Столбец Windows MR относится к свойствам, доступным вне типа InteractionSourceState . Каждый из этих API подробно описан в разделах ниже.

Сопоставления идентификаторов кнопок и осей для Windows Mixed Reality обычно соответствуют идентификаторам кнопки или оси Oculus.

Сопоставления идентификаторов кнопок и осей для Windows Mixed Reality отличаются от сопоставлений OpenVR двумя способами:

  1. В сопоставлении используются идентификаторы сенсорной панели, отличные от стиков, для поддержки контроллеров как с стиками, так и с сенсорной панелью.
  2. Сопоставление позволяет избежать перегрузки идентификаторов кнопок A и X для кнопок Меню, чтобы сделать их доступными для физических кнопок ABXY.
Входные данныеРаспространенные API Unity
(Input.GetButton/GetAxis)
API ввода для windows MR
(XR. WSA. Входные данные)
Левая рука Правая рука
Выбор нажатого триггера Ось 9 = 1,0 Ось 10 = 1,0 SelectPressed
Выбор аналогового значения триггера Ось 9 Ось 10 selectPressedAmount
Выбор частично нажатого триггера Кнопка 14 (геймпад compat) Кнопка 15 (геймпад compat) selectPressedAmount > 0.0
Нажатая кнопка меню Кнопка 6* Кнопка 7* menuPressed
Нажатие кнопки захвата Ось 11 = 1,0 (без аналоговых значений)
Кнопка 4 (совместимость геймпада)
Ось 12 = 1,0 (без аналоговых значений)
Кнопка 5 (совместимость геймпада)
Понял
Thumbstick X (слева: -1.0, справа: 1.0) Ось 1 Ось 4 thumbstickPosition.x
Thumbstick Y (вверху: -1.0, внизу: 1.0) Ось 2 Ось 5 thumbstickPosition.y
Нажатый стик Кнопка 8 Кнопка 9 thumbstickPressed
Сенсорная панель X (слева: -1.0, справа: 1.0) Ось 17* Ось 19* touchpadPosition.x
Сенсорная панель Y (вверху: -1.0, внизу: 1.0) Ось 18* Ось 20* touchpadPosition.y
Касание сенсорной панели Кнопка 18* Кнопка 19* touchpadTouched
Нажата сенсорная панель Кнопка 16* Кнопка 17* touchpadPressed
Положение захвата 6DoF или положение указателя Только положение захвата : XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Передача захвата или указателя в качестве аргумента: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Отслеживание состояния Точность положения и риск потери источника доступны только через API для mr-specific sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Примечание

Эти идентификаторы кнопок и осей отличаются от идентификаторов, используемых Unity для OpenVR, из-за конфликтов в сопоставлениях, используемых геймпадами, Oculus Touch и OpenVR.

OpenXR

Чтобы узнать об основах взаимодействия смешанной реальности в Unity, ознакомьтесь с руководством по Unity для ввода XR Unity. В этой документации по Unity рассматриваются сопоставления входных данных контроллера с более универсальными входными данными InputFeatureUsage, способы определения и классификации доступных входных данных XR, чтение данных из этих входных данных и многое другое.

Подключаемый модуль OpenXR Смешанная реальность предоставляет дополнительные профили взаимодействия с входными данными, сопоставленные со стандартными входными интерфейсами InputFeatureUsage, как описано ниже.

InputFeatureUsage Контроллер HP Reverb G2 (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Джойстик
primary2DAxisClick Джойстик — щелкните
триггер Триггер
Ручки Ручки Касание или сжатие воздуха
primaryButton [X/A] - Нажмите Жест касания
secondaryButton [Y/B] - Нажмите
gripButton Сцепление — нажатие
triggerButton Триггер — нажатие
menuButton Меню

Положение захвата и положение указателя

Windows Mixed Reality поддерживает контроллеры движения в различных форм-факторах. Дизайн каждого контроллера отличается по своей связи между положением руки пользователя и естественным направлением вперед, которое приложения должны использовать для указания при отрисовке контроллера.

Чтобы лучше представить эти контроллеры, существует два типа поз, которые можно исследовать для каждого источника взаимодействия: позу захвата и позу указателя. Координаты положения захвата и положения указателя выражаются всеми API Unity в глобальных мировых координатах Unity.

Поза захвата

Поза захвата представляет расположение ладони пользователя, обнаруженного HoloLens или удерживающего контроллер движения.

На иммерсивных гарнитурах позу захвата лучше всего использовать для отрисовки руки пользователя или объекта, удерживаемого в руке пользователя. Положение захвата также используется при визуализации контроллера движения. Модель для просмотра, предоставляемая Windows для контроллера движения, использует позу захвата в качестве источника и центра вращения.

Положение захвата определяется следующим образом:

  • Положение сцепления. Центроид ладони при естественном удержании контроллера регулируется влево или вправо, чтобы отцентрировать положение внутри сцепления. На Windows Mixed Reality контроллере движения это положение обычно совпадает с кнопкой Захвата.
  • Правая ось захвата: когда вы полностью открываете руку, чтобы сформировать плоскую позу 5 пальцами, луч, который является нормальным для вашей ладони (вперед с левой ладони, назад от правой ладони)
  • Прямая ось ориентации захвата: при частичном закрытии руки (как бы удерживая контроллер), луч, указывающий "вперед" через трубку, сформированную пальцами без большого пальца.
  • Ось вверх для ориентации захвата: ось вверх, подразумеваемая определениями справа и вперед.

Вы можете получить доступ к позе захвата с помощью API ввода между поставщиками Unity (XR. InputTracking. GetLocalPosition/Rotation) или через API windows MR (sourceState.sourcePose.TryGetPosition/Rotation, запрашивающий данные о позе для узла Grip ).

Положение указателя

Положение указателя представляет кончик контроллера, указывающего вперед.

Предоставленное системой положение указателя лучше всего использовать для луча при отрисовке самой модели контроллера. При отрисовке другого виртуального объекта вместо контроллера, например виртуального пистолета, следует указать луч, который наиболее естественный для этого виртуального объекта, например луч, который проходит вдоль ствола модели пистолета, определяемой приложением. Так как пользователи могут видеть виртуальный объект, а не физический контроллер, указатель на виртуальный объект, скорее всего, будет более естественным для пользователей вашего приложения.

В настоящее время положение указателя доступно в Unity только через API windows MR sourceState.sourcePose.TryGetPosition/Rotation, передавая в качестве аргумента InteractionSourceNode.Pointer .

OpenXR

У вас есть доступ к двум наборам поз с помощью входных взаимодействий OpenXR:

  • Захват поз для отрисовки объектов в руке
  • Цель указывает на мир.

Дополнительные сведения об этой структуре и различиях между двумя позами можно найти в разделе Спецификация OpenXR — входные подпутьи.

Позы, предоставляемые InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity и DeviceAngularVelocity , представляют собой позу захвата OpenXR. InputFeatureUsages, связанные с позами захвата, определяются в CommonUsages Unity.

Позы, предоставляемые inputFeatureUsages PointerPosition, PointerRotation, PointerVelocity и PointerAngularVelocity , представляют собой позу цели OpenXR. Эти inputFeatureUsages не определены ни в одном из включенных файлов C#, поэтому вам потребуется определить собственные inputFeatureUsages следующим образом:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Haptics

Сведения об использовании тактильной формы в системе ввода XR Unity см. в разделе Руководство по Unity для входных данных XR Unity — haptics.

Состояние отслеживания контроллера

Как и гарнитуры, контроллер движения Windows Mixed Reality не требует настройки внешних датчиков отслеживания. Вместо этого контроллеры отслеживаются датчиками в самой гарнитуре.

Если пользователь перемещает контроллеры из поля зрения гарнитуры, Windows в большинстве случаев продолжает выводить положения контроллера. Если контроллер достаточно долго терял визуальное отслеживание, позиции контроллера опустятся до приблизительной точности.

На этом этапе система будет блокировать контроллер для пользователя, отслеживая его положение при перемещении, при этом предоставляя истинную ориентацию контроллера с помощью его внутренних датчиков ориентации. Многие приложения, использующие контроллеры для указания и активации элементов пользовательского интерфейса, могут работать нормально и с приблизительной точностью, не замечая пользователя.

Явное обоснование состояния отслеживания

Приложения, которые хотят обрабатывать позиции по-разному в зависимости от состояния отслеживания, могут идти дальше и проверять свойства состояния контроллера, такие как SourceLossRisk и PositionAccuracy:

Отслеживание состояния SourceLossRisk PositionAccuracy TryGetPosition
Высокая точность < 1.0 Высокий Да
Высокая точность (с риском потери) == 1.0 Высокий Да
Приблизительная точность == 1.0 Приблизительна Да
Без позиции == 1.0 Приблизительна false

Эти состояния отслеживания контроллера движения определяются следующим образом:

  • Высокая точность: Хотя контроллер движения находится в поле зрения гарнитуры, он, как правило, обеспечивает высокоточных позиций на основе визуального отслеживания. Движущийся контроллер, который на мгновение покидает поле зрения или на мгновение скрывается от датчиков гарнитуры (например, другой рукой пользователя), будет продолжать возвращать высокоточных поз в течение короткого времени на основе инерционного отслеживания самого контроллера.
  • Высокая точность (с риском потери): Когда пользователь перемещает контроллер движения за край поля зрения гарнитуры, гарнитура скоро не сможет визуально отслеживать положение контроллера. Приложение знает, когда контроллер достиг этой границы FOV, просматривая , что SourceLossRisk достигает 1.0. На этом этапе приложение может приостановить жесты контроллера, требующие постоянного потока высококачественных поз.
  • Приблизительная точность: Если контроллер достаточно долго терял визуальное отслеживание, позиции контроллера опустятся до приблизительной точности. На этом этапе система будет блокировать контроллер для пользователя, отслеживая его положение при перемещении, при этом предоставляя истинную ориентацию контроллера с помощью его внутренних датчиков ориентации. Многие приложения, использующие контроллеры для указания и активации элементов пользовательского интерфейса, могут работать в обычном режиме с приблизительной точностью, не замечая пользователя. Приложения с более высокими требованиями к входным данным могут понять это падение от высокой точности до приблизительной точности, проверив свойство PositionAccuracy , например, чтобы предоставить пользователю более щедрый список попаданий на цели вне экрана в течение этого времени.
  • Без позиции: Хотя контроллер может работать с приблизительной точностью в течение длительного времени, иногда система знает, что даже положение с блокировкой тела в данный момент не имеет смысла. Например, контроллер, который был включен, возможно, никогда не наблюдался визуально, или пользователь может поместить контроллер, который затем был выбран кем-то другим. В это время система не предоставляет никакой позиции приложению, а TryGetPosition вернет значение false.

Распространенные API Unity (Input.GetButton/GetAxis)

Пространство имен:UnityEngine, UnityEngine.XR
Типы: Входные данные, XR. InputTracking

В настоящее время Unity использует общие API Input.GetButton/Input.GetAxis для предоставления входных данных для пакета SDK Oculus, пакета SDK OpenVR и Windows Mixed Reality, включая руки и контроллеры движения. Если ваше приложение использует эти API для ввода, оно может легко поддерживать контроллеры движения в нескольких пакетах SDK XR, включая Windows Mixed Reality.

Получение состояния нажатия логической кнопки

Чтобы использовать общие интерфейсы API ввода Unity, вы обычно начинаете с подключения кнопок и осей к логическим именам в диспетчере ввода Unity, привязывая идентификаторы кнопок или осей к каждому имени. Затем можно написать код, который ссылается на это логическое имя кнопки или оси.

Например, чтобы сопоставить кнопку триггера левого контроллера движения с действием Отправить, перейдите в раздел Изменение > входных > данных параметров проекта в Unity и разверните свойства раздела Отправить в разделе Оси. Измените свойство Positive Button или Alt Positive Button для чтения кнопки джойстика 14 следующим образом:

InputManager Unity
Unity InputManager

Затем скрипт может проверка для действия Отправить с помощью Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

Вы можете добавить дополнительные логические кнопки, изменив свойство Размер в разделе Оси.

Получение состояния нажатия физической кнопки напрямую

Вы также можете получить доступ к кнопкам вручную по их полному имени с помощью Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

Получение положения руки или контроллера движения

Вы можете получить доступ к положению и повороту контроллера с помощью XR. InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Примечание

Приведенный выше код представляет позу захвата контроллера (когда пользователь держит контроллер), которая полезна для отрисовки меча или пистолета в руке пользователя или модели самого контроллера.

Связь между этой позой захвата и положением указателя (где указывает кончик контроллера) может отличаться в разных контроллерах. На данный момент доступ к позе указателя контроллера возможен только через API ввода, относящегося к смешанной реальности, как описано в разделах ниже.

API для Windows (XR. WSA. Входные данные)

Внимание!

Если в проекте используется любой из XR. Интерфейсы API WSA, они постепенно выступают в пользу пакета SDK XR в будущих выпусках Unity. Для новых проектов рекомендуется использовать пакет SDK для XR с самого начала. Дополнительные сведения о системе ввода XR и API см. здесь.

Пространство имен:UnityEngine.XR.WSA.Input
Типы: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Чтобы получить более подробные сведения о Windows Mixed Reality ручном вводе (для HoloLens) и контроллерах движения, можно использовать API пространственного ввода windows в пространстве имен UnityEngine.XR.WSA.Input. Это позволяет получить доступ к дополнительным сведениям, таким как точность положения или тип источника, позволяя вам отличить руки и контроллеры друг от друга.

Опрос состояния рук и контроллеров движений

Вы можете опросить состояние этого кадра для каждого источника взаимодействия (руки или контроллера движения) с помощью метода GetCurrentReading .

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Каждый возвращаемой объект InteractionSourceState представляет источник взаимодействия в текущий момент времени. InteractionSourceState предоставляет следующие сведения:

  • Какие типы нажатий происходят (Выберите/Меню/Захват/Сенсорная панель/стик)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Другие данные, относящиеся к контроллерам движения, например координаты XY сенсорной панели и /или стик и состояние касания

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • InteractionSourceKind, чтобы узнать, является ли источник рукой или контроллером движения

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Опрос для прогнозируемых позиций отрисовки

  • При опросе данных источника взаимодействия из рук и контроллеров позы, которые вы получаете, прогнозируются вперед на момент времени, когда фотоны этого кадра достигнут глаз пользователя. Прогнозируемые позы лучше всего использовать для отрисовки контроллера или удерживаемого объекта для каждого кадра. Если вы ориентируетесь на определенное нажатие или выпуск с помощью контроллера, это будет наиболее точным, если вы используете ОПИСАННЫе ниже API исторических событий.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Вы также можете получить прогнозируемую вперед позу головы для текущего кадра. Как и в случае с исходной позой, это полезно для отрисовки курсора, хотя ориентация на определенное нажатие или выпуск будет наиболее точным при использовании API исторических событий, описанных ниже.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Обработка событий источника взаимодействия

Для обработки входных событий по мере их возникновения с точными данными об их исторических позах можно обрабатывать события источника взаимодействия, а не опрашивать.

Для обработки событий источника взаимодействия:

  • Зарегистрируйтесь для получения входного события InteractionManager . Для каждого интересующего вас типа события взаимодействия необходимо подписаться на него.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Обработка события. Подписавшись на событие взаимодействия, вы получите обратный вызов при необходимости. В примере SourcePressed это происходит после обнаружения источника и перед его освобождением или потерей.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

Как остановить обработку события

Необходимо прекратить обработку события, если вы больше не заинтересованы в событии или уничтожаете объект, который подписался на событие. Чтобы прекратить обработку события, отмените подписку на событие.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Список событий источника взаимодействия

Доступные события источника взаимодействия:

  • InteractionSourceDetected (источник становится активным)
  • InteractionSourceLost (становится неактивным)
  • InteractionSourcePressed (касание, нажатие кнопки или фраза "Выбрать")
  • InteractionSourceReleased (конец касания, отпущена кнопка или в конце фразы "Выбрать")
  • InteractionSourceUpdated (перемещает или иным образом изменяет состояние)

События для исторических позиций нацеливания, которые наиболее точно соответствуют прессе или релизу

Описанные выше API опроса дают приложению прогнозируемые положения. Хотя эти прогнозируемые позы лучше всего подходит для отрисовки контроллера или виртуального портативного объекта, будущие позы не являются оптимальными для нацеливания по двум ключевым причинам:

  • Когда пользователь нажимает кнопку на контроллере, может быть около 20 мс беспроводной задержки по Bluetooth, прежде чем система получит нажатие.
  • Затем, если вы используете прогнозируемую вперед позу, будет применено еще 10–20 мс прогноза вперед, чтобы определить время, когда фотоны текущего кадра достигнут глаз пользователя.

Это означает, что опрос дает исходное положение или позу головы, которая составляет 30–40 мс вперед от того места, где на самом деле голова и руки пользователя были назад, когда произошла пресса или освобождение. Для ручного ввода HoloLens, хотя задержка беспроводной передачи отсутствует, существует аналогичная задержка обработки для обнаружения нажатия.

Чтобы точно определить целевой объект на основе первоначального намерения пользователя для нажатия руки или контроллера, следует использовать историческую позу источника или позу головы из этого входного события InteractionSourcePressed или InteractionSourceReleased .

Вы можете выбрать прессу или выпуск с данными о позе за прошлыми данными из головы пользователя или его контроллера:

  • Положение головы в момент нажатия жеста или контроллера, которое можно использовать для нацеливания , чтобы определить , на что смотрит пользователь:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • Исходное положение в момент нажатия контроллера движения, которое можно использовать для нацеливания , чтобы определить, на что пользователь указывал контроллер. Это будет состояние контроллера, который испытал нажатие. Если вы отрисовываете сам контроллер, вы можете запросить позу указателя, а не позу захвата, чтобы стрелять целевой луч из того, что пользователь будет считать естественным кончиком этого отрисованного контроллера:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Пример обработчиков событий

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Контроллеры движения в MRTK

Вы можете получить доступ к жестам и контроллеру движения из диспетчера ввода.

Обучение по руководствам

Пошаговые руководства с более подробными примерами настройки доступны в Смешанная реальность Академии:

Входные данные смешанной реальности 213 — контроллер движения
Входные данные смешанной реальности 213 — контроллер движения

Следующий этап разработки

Если вы следите за путь разработки Unity, который мы изложили, вы находитесь в разгаре изучения основных стандартных блоков MRTK. Отсюда вы можете перейти к следующему стандартному блоку:

Или перейдите к возможностям и API платформы смешанной реальности:

Вы можете в любой момент вернуться к этапам разработки для Unity.

См. также статью