Поделиться через


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

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

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

API входных данных Unity XR

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

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

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

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

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

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

  1. В сопоставлении используются идентификаторы сенсорной панели, отличные от палец, для поддержки контроллеров с палец и сенсорной панели.
  2. Сопоставление позволяет избежать перегрузки идентификаторов кнопок "Меню" и "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 (геймпад compat)
Ось 12 = 1.0 (без аналоговых значений)
Кнопка 5 (геймпад compat)
схваченный
Thumbstick X (слева: -1.0, справа: 1.0) Ось 1 Ось 4 thumbstickPosition.x
Отпечаток 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 sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Примечание.

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

OpenXR

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

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

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

Сцепление позы и положение указателя

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

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

Сцепление позу

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

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

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

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

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

Поза указателя

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

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

В настоящее время указатель доступен в 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");

Хаптики

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

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

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

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

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

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

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

Отслеживание состояния SourceLossRisk PositionAccuracy TryGetPosition
Высокая точность < 1.0 Высокий true
Высокая точность (риск потери) == 1.0 Высокий true
Приблизительная точность == 1.0 Приблизительный true
Нет позиции == 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 Смешанная реальность, включая руки и контроллеры движения. Если приложение использует эти API для ввода, оно может легко поддерживать контроллеры движения в нескольких пакетах SDK XR, включая Windows Смешанная реальность.

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

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

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

InputManager Unity
Unity InputManager

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

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

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

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

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

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

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

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

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

Примечание.

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

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

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 Смешанная реальность (для HoloLens) и контроллерах движения, можно использовать API-интерфейсы пространственных входных данных Windows в пространстве имен UnityEngine.XR.WSA.Input. Это позволяет получить доступ к дополнительным сведениям, таким как точность положения или тип источника, что позволяет сообщать рукам и контроллерам друг от друга.

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

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

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

Каждый элемент InteractionSourceState , который вы возвращаете, представляет источник взаимодействия в текущий момент времени. Функция InteractionSourceState предоставляет такие сведения, как:

  • Какие типы нажатий происходят (select/Menu/Grasp/Touchpad/Thumbstick)

    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

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

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

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

MR Input 213 — контроллер движения
MR Input 213 — контроллер движения

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

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

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

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

См. также