XRОбщий термин, охватывающий приложения виртуальной реальности (VR), дополненной реальности (AR) и смешанной реальности (MR). . Устройства, поддерживающие эти формы интерактивных приложений, можно назвать устройствами XR. Подробнее
См. в Словарь Подсистема ввода SDK — это интерфейс для кнопки отчета, оси и информация об устройстве слежения. Это основная подсистема для передачи управляемых пользователем данных в различные входные конечные точки движка Unity. Unity передает вашу входную информацию на InputDevices и Система ввода в зависимости от типа доступной информации.
Создание базового поставщика ввода XR
Чтобы создать базовый работающий поставщик входных данных XR, выполните следующие действия:
- Сообщайте о подключениях и отключениях вашего устройства
- Заполните информацию об определениях всех подключенных устройств
- Обновлять состояние устройства каждый раз, когда Unity запрашивает это
- Отвечать на все соответствующие события и запросы
- Передайте макеты вашего устройства в новую систему ввода
Условия
В этом руководстве используются следующие термины:
Устройства
Большинство API-интерфейсов подсистемы ввода зависят от устройств. Устройство — это контейнер входных функций, на которые ссылается уникальный идентификатор, который вы выбираете. Это может быть что-то конкретное, например, геймпад или гарнитура, или он может представлять абстрактные объекты, такие как обнаруженный скелет руки. Устройство имеет фиксированное количество функций, которые нельзя изменить, пока устройство подключено.
Функция
Входные объекты — это все, из чего вы можете получить данные, измененные датчиками или пользователем. Это может быть кнопка, элемент слежения за положением или время автономной работы. Они сгруппированы в различные типы данных, определяемые 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 |
Использование
Использование обеспечивает контекст функции. Он определяет, как разработчик должен использовать эту функцию. Например, функция может быть двухмерной осью, но использование говорит разработчику, что это тачпад. Использование также может информировать разработчика о том, что функция одномерной оси сообщает о времени автономной работы. Вы можете создавать свои собственные варианты использования, но вам нужно использовать как можно больше вариантов использования, разработанных Unity, потому что они обеспечивают кроссплатформенную полезность для разработчиков. Список общих способов использования, доступных для всех, см. в разделе использования функций ниже.
UnityXRInternalInputDeviceId
UnityXRInternalInputDeviceId идентифицирует все устройства. Считайте эти идентификаторы уникальными идентификаторами, которые Unity и поставщик совместно используют для ссылки на конкретное устройство. Вы определяете, какие идентификаторы сопоставляются с какими устройствами, с единственным ограничением, заключающимся в том, что вы не можете использовать один и тот же идентификатор для двух устройств, подключенных одновременно. Когда вы сообщаете о подключении определенного идентификатора, Unity запрашивает информацию о возможностях устройства и текущем состоянии этого устройства, используя этот идентификатор, и отправляет события для конкретного устройства, используя этот идентификатор.
Подключение и отключение устройства
Два API в интерфейсе IUnityXRInputInterface обрабатывают подключение и отключение устройства:
IUnityXRInputInterface.InputSubsystem_DeviceConnected
Это сообщает о новом устройстве. UnityXRInternalInputDeviceId
, предоставляемый провайдером, может иметь любое значение, если оно представляет внутренне уникальное устройство и никакие два устройства не подключены к одному и тому же идентификатору от одного и того же провайдера. Устройства могут быть подключены только между событиями Start и Stop жизненного цикла поставщика ввода. Любое устройство, которое уже подключено при вызове IUnityXRInputProvider.Start, должно быть сообщено во время этого обратного вызова.
После сообщения о подключении устройства Unity вызывает IUnityXRInputProvider.FillDeviceDefinition в следующем цикле обновления ввода с предоставленным UnityXRInternalInputDeviceId, чтобы получить конкретную информацию об этом устройстве.
IUnityXRInputInterface.InputSubsystem_DeviceDisconnected
Сообщает, что устройство ввода больше недоступно. Вы можете сообщить об устройстве ввода как об отключенном только после того, как вы уже сообщили о нем как о подключенном. Когда вы получаете IUnityXRInputProvider.Stop, вы должны сообщать обо всех подключенных в настоящее время устройствах ввода как об отключенных.
Вышеуказанные два вызова являются потокобезопасными и могут быть вызваны в любое время.
Определения устройств
Определение устройства описывает функции, о которых ваше устройство может сообщать Unity. Функции состоят из информации, идентифицирующей устройство, такой как имя устройства, роль, производитель и серийный номер. Определение устройства также содержит индексированный список всех доступных функций ввода.
Когда сообщается, что устройство подключено, Unity звонит вашему провайдеру через IUnityXRInputProvider.FillDeviceDefinition. Параметр UnityXRInputDeviceDefinition действует как дескриптор, который можно передать в любые методы с префиксом DeviceDefinition в IUnityXRInputInterface. Эти методы следующие:
Установка идентификационной информации
Разработчики используют некоторые данные об устройстве для идентификации конкретных устройств или общей функциональности вновь подключенного устройства.
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_AddFeature и DeviceDefinition_AddUsageAtIndex и возвращает UnityXRInputFeatureIndex этой новой функции.
IUnityXRInputInterface.DeviceDefinition_AddUsageAtIndex
Это добавляет использование функции к существующей функции. Он берет UnityXRInputFeatureIndex из одного из методов, добавляющих функцию. Вы можете добавить столько вариантов использования одной функции, сколько потребуется.
Примечание. Возвращаемые значения UnityXRInputFeatureIndex расположены в порядке их добавления.
Состояния устройства
Состояния устройства — это структуры данных, содержащие текущее состояние устройства. Структура UnityXRInputDeviceState описывается UnityXRInputDeviceDefinition.
Примечание. Доступ к функциям, содержащимся в состоянии устройства, осуществляется с помощью UnityXRInputFeatureIndex, о чем сообщается при объявлении этой функции в определении устройства.
Типы обновления состояния устройства
После объявления определения Unity дважды за кадр запрашивает состояния устройства через IUnityXRInputProvider.UpdateDeviceState. Параметр UnityXRInputUpdateType указывает, какое обновление ожидает Unity:
- kUnityXRInputUpdateTypeDynamic – это обновление перед тем, как Unity перебирает вызовы MonoBehaviour.Update и продолжения сопрограммы. Они должны указывать, где в данный момент находится устройство.
-
kUnityXRInputUpdateTypeBeforeRender вызывается непосредственно перед тем, как Unity подготовится к рендерингу на гарнитуру, и непосредственно перед вызовом Application.OnBeforeRender. Эти вызовы должны использовать прогнозируемую позицию отслеживания вперед и представлять, где вы хотите отобразить сценуСцена содержит среды и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Посмотреть в Словарь в то время, которое требуется для его отображения.
Методы состояния устройства
Параметр UnityXRInputDeviceState действует как дескриптор, который может быть передан в любые методы с префиксом DeviceState в IUnityXRInputInterface.
IUnityXRInputInterface.DeviceState_SetCustomValue
Это устанавливает функцию типа kUnityXRInputFeatureTypeCustom с предоставленным UnityXRInputFeatureIndex. При настройке функций с пользовательскими значениями поставщик всегда должен устанавливать значение с полным размером объявленной функции; нет настройки частичного значения. Кроме того, вы должны объявлять все пользовательские функции в Unity во время отправки с подробным объяснением того, какие данные они содержат и почему они не могут существовать с другими отдельными типами функций.
IUnityXRInputInterface.DeviceState_SetBinaryValue
Это устанавливает логическую (вкл/выкл) функцию типа kUnityXRInputFeatureTypeBinary. Состояние по умолчанию, состояние покоя или неиспользования этой функции должно быть ложным.
IUnityXRInputInterface.DeviceState_SetDiscreteStateValue
Это устанавливает 32-битное целое число без знака. Это также можно использовать для представления перечислений. Неиспользуемое значение по умолчанию должно быть равно 0, а если используется для перечисления, 0 должно представлять значение null, none, unset или недопустимое.
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). См. документацию по кватернионамстандартному способу представления вращения в виде данных в Unity. . При написании кода, имеющего дело с поворотами, обычно следует использовать класс Quaternion и его методы. Подробнее
Дополнительную информацию см. в Словарь.
IUnityXRInputInterface.DeviceState_SetBoneValue
Это устанавливает значение типа UnityXRBone.
IUnityXRInputInterface.DeviceState_SetHandValue
Это устанавливает значение типа UnityXRHand.
IUnityXRInputInterface.DeviceState_SetEyesValue
Это устанавливает значение типа UnityXREyes.
Примечание. Переданный UnityXRInputFeatureUsageIndex совпадает с возвращаемым при добавлении этой отдельной функции в определение устройства при заполнении UnityXRInputFeatureDefinition.
Структуры для конкретных функций
Следующие расширенные типы представляют собой специальные типы функций, которые используются для хранения данных из нескольких источников данных.
UnityXRBone
Они представляют собой кость или один элемент иерархической позы в пространстве. Элемент position представляет трехмерное положение в метрах с использованием левых координат, где Y находится вверху. Член rotation представляет ориентацию в пространстве для этой кости, представленную нормализованным кватернионом в радианах. parentBoneIndex — это UnityXRInputFeatureIndex, который должен указывать на UnityXRBone, находящийся выше по иерархии, или kUnityInvalidXRInputFeatureIndex, если он является корнем для этого скелета.
UnityXRHand
Они представляют собой структуру костей, напоминающую руку. Они организуют иерархию костей в пальцы и корень для легкого перемещения. rootBoneIndex всегда должен указывать на допустимый индекс типа kUnityXRInputFeatureTypeBone, который представляет ладонь или центр руки. fingerBoneIndices должны быть сгруппированы таким образом, чтобы первое измерение или массив отображались на отдельные пальцы, следующие за значениями перечисления UnityXRHandFinger, а второе измерение массива представляло собой отдельные кости пальцев из корня дать чаевые.
UnityXREyes
Они представляют пару глаз, их точку фиксации и текущие данные о моргании. leftEyePose и rightEyePose имеют тип UnityXRPose, где член position представляет трехмерное положение в метрах, используя левосторонние координаты, где Y вверху, а элемент rotation представляет нормализованный кватернион в радианах. fixationPoint показывает, где сходятся левый и правый глаза, а также представляет собой трехмерное положение в метрах с использованием координат для левой руки, где Y находится вверху. leftOpenAmount и rightOpenAmount представляют степень открытости глаз, где 0 — закрыты, а 1 — полностью открыты. Они не могут превышать диапазон [0,1].
Обработка событий
Помимо состояния устройства и обновления определений, Unity ожидает, что вы будете реагировать и реагировать на различные события.
Общее событие
UnityXRInputProvider.HandleEvent
Это для частных мероприятий, специфичных для этого провайдера. Параметр eventType — это настраиваемый код, используемый для идентификации полезной нагрузки. Если провайдер не понимает это событие, он должен вернуть kUnitySubsystemErrorCodeFailure.
Отслеживание исходных событий
Исходная точка отслеживания — это точка в реальном пространстве, относительно которой находятся отслеживаемые устройства. По сути, это точка в реальном пространстве, где устройство сообщает о положении (0, 0, 0). Unity поддерживает различные режимы отслеживания происхождения, и провайдеры могут выбрать те из них, которые они поддерживают. Режимы источника отслеживания перечислены в разделе UnityXRInputTrackingOriginModeFlags.
kUnityXRInputTrackingOriginModeDevice размещает источник в местоположении основного устройства и рыскании во время запуска или в местоположении последнего события UnityXRInputProvider.HandleRecenter.
kUnityXRInputTrackingOriginModeFloor размещает источник где-то на полу. Расположение на полу зависит от поставщика, если оно позволяет разработчику понять разницу высот между полом и различными устройствами.
kUnityXRInputTrackingOriginModeTrackingReference размещает источник в расположении определенного InputDevice с характеристикой kUnityXRInputDeviceCharacteristicsTrackingReference.
Наконец, kUnityXRInputTrackingOriginModeUnknown является ошибкой и не должен возвращаться провайдером.
UnityXRInputProvider.HandleRecenter
Если в качестве исходного режима отслеживания задано значение kUnityXRInputTrackingOriginModeDevice, вызов метода переустановки должен установить текущее местоположение основного устройства в качестве нового исходного.
UnityXRInputProvider.QueryTrackingOriginMode
Это запрос от Unity на получение текущего режима источника отслеживания, который использует провайдер. Ожидается, что провайдер установит параметр trackingOriginMode и вернет kUnitySubsystemErrorCodeSuccess. Возвращаемый параметр должен быть только одним значением флага.
UnityXRInputProvider.QuerySupportedTrackingOriginModes
Это запрос, для которого поддерживаются режимы источника отслеживания. Ожидается, что поставщик установит параметр supportedTrackingOriginModes и вернет kUnitySubsystemErrorCodeSuccess. Возвращаемый параметр должен представлять собой совокупный список всех флагов UnityXRInputTrackingOriginModeFlags, которые UnityXRInputProvider.HandleSetTrackingOriginMode может поддерживать.
UnityXRInputProvider.HandleSetTrackingOriginMode
Это запрос от Unity на изменение текущего режима источника отслеживания. Параметр trackingOriginMode — это желаемый режим источника отслеживания. Ожидается, что провайдер вернет kUnitySubsystemErrorCodeSuccess, если источник можно было изменить, и kUnitySubsystemErrorCodeSuccess в противном случае. Если режим источника отслеживания уже задан, провайдер не должен ничего делать и возвращать kUnitySubsystemErrorCodeSuccess.
IUnityXRInputInterface.InputSubsystem_TrackingOriginUpdated
Это событие, которое поставщик может отправить, чтобы уведомить Unity об изменении местоположения источника отслеживания. Это должно быть вызвано, когда UnityXRInputProvider.HandleSetTrackingOriginMode завершается успешно и перемещает источник. Это также может быть вызвано, если поставщику пришлось изменить источник из-за изменения общей информации об отслеживании.
IUnityXRInputInterface.InputSubsystem_SetTrackingBoundary
Это событие, которое поставщик может отправить, чтобы уведомить Unity о наличии доступной границы отслеживания или об изменении границы отслеживания. Это должно быть вызвано, если есть граница, и источник отслеживания изменился таким образом, что он переместил относительное положение границы. Это можно вызвать с нулевым значением и 0 баллов, чтобы удалить существующую границу отслеживания.
Тактильные события
UnityXRInputProvider.QueryHapticCapabilities
Это запрос о тактильных возможностях данного устройства, который заполняет поставщик. Установка для параметра supportsImpulse значения true включает события для UnityXRInputProvider.HandleHapticImpulse. Установка для параметра supportsBuffer значения true включает события для UnityXRInputProvider.HandleHapticBuffer.
Примечание. Структура возможностей позволяет провайдеру устанавливать количество каналов и запросов для запуска и остановки тактильных сигналов, содержащих индекс канала. Это позволяет провайдеру иметь несколько двигателей внутри одного устройства, которые могут вращаться независимо друг от друга. Первый канал должен быть наиболее распространенным двигателем, но последующий порядок зависит от поставщика.
UnityXRInputProvider.HandleHapticImpulse
Это запрос устройства на вибрацию с заданной амплитудой в течение заданной продолжительности. Unity заполняет данные для этого запроса. Параметр буфера имеет тип UnityXRHapticImpulse.
UnityXRInputProvider.HandleHapticBuffer
Это запрос устройства на воспроизведение шаблона с заданным буфером. Unity заполняет данные для этого запроса. Параметр буфера имеет тип UnityXRHapticUpdate.
BufferSize никогда не превышает значение UnityXRHapticCapabilities.bufferMaxSize, возвращенное из события UnityXRInputProvider.QueryHapticCapabilities.
UnityXRInputProvider.HandleHapticStop
Это запрос от Unity на прекращение любых тактильных эффектов. Это должно остановить импульсные или буферизованные тактильные эффекты для предоставленного UnityXRInternalInputDeviceId.
Использование функций
Использование функций — это простые строковые теги, которые предоставляют контекст о ваших функциях и помогают разработчикам Unity получить общий доступ к вашему устройству. Вы можете объявить свое устройство как имеющее триггер, положение устройства, кнопку меню или другую общую концепцию функции ввода. Разработчики могут получить к ним доступ и взаимодействовать с вашим устройством, не зная точно, что это такое. Они также используются для направления входных данных в UnityEngine.Input и UnityEngine.XR.InputTracking и определения индексов. У одной входной функции может быть несколько применений, но каждая входная функция, которую вы объявляете, должна иметь по крайней мере одно назначенное использование. Если вы решили не использовать способы использования, предоставляемые Unity по умолчанию, вы должны сообщить Unity, что вы использовали при отправке на сертификацию, и быть готовыми обновить свои строки использования на основе отзывов Unity.
Все мировые значения пространства указаны в метрах, м/с, м/с2 или в радианах, где это уместно. Пространство должно быть ориентировано как левостороннее, z-вперед, y-вверх. Начало пробела должно быть положением устройства при подключении. Это пространство является вашим собственным и не связано напрямую с мировым пространством Unity.
В Unity доступны следующие варианты использования:
Поза и отслеживание
Следующие функции предназначены для устройств, обеспечивающих отслеживание в реальном мире. Они полезны для определения текущей возможности отслеживания:
kUnityXRInputFeatureUsageIsTracked — логическое значение, указывающее, правильно ли отслеживается устройство в данный момент. True означает полное отслеживание, false означает частичное отслеживание или отсутствие отслеживания.
kUnityXRInputFeatureUsageTrackingState – это функция дискретного состояния, поддерживаемая перечислением UnityXRInputTrackingStateFlags, которая определяет, какие фактические функции отслеживания доступны в настоящее время и обновляются. Это значение никогда не должно быть выше kUnityXRInputTrackingStateAll.
Остальные функции отслеживания передают отдельные данные об определенных «узлах», таких как устройство, левый глаз или цветная камераКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь. Они сгруппированы в наборы по шесть, в зависимости от типа данных. Их необходимо обновить вместе с текущим значением в kUnityXRInputFeatureUsageTrackingState. То есть, если в состоянии отслеживания указано, что позиция доступна, все ее использования должны корректно обновляться.
Префиксы использования следующие:
Префикс | Описание |
---|---|
kUnityXRInputFeatureUsageDevice | Generalized position of the input device |
kUnityXRInputFeatureUsageCenterEye | Centralized average of all eye rendering locations |
kUnityXRInputFeatureUsageLeftEye | Rendering location for a left eye |
kUnityXRInputFeatureUsageRightEye | Rendering location for a right eye |
kUnityXRInputFeatureUsageColorCamera | Location of any incoming camera feed |
Каждый из этих префиксов имеет ряд доступных суффиксов, представляющих различные атрибуты отслеживания, а именно:
* Position
* Rotation
* Velocity
* AngularVelocity
* Acceleration
* AngularAcceleration
Если их не включить в определение, они никогда не будут доступны. Включение их, но пометка их как недоступных с помощью функции kUnityXRInputFeatureUsageTrackingState означает, что эта функция недоступна в настоящее время, но может быть доступна позже.
Информация об устройстве
Они содержат общую информацию об устройстве, а не элементы управления, активируемые пользователем. Это функции устройства, над которыми пользователь не имеет прямого контроля.
kUnityXRInputFeatureUsageBatteryLevel – это функция одномерной оси, которая представляет текущий уровень заряда батареи устройства, где 0 означает отсутствие батареи, а 1 – полный заряд. Он всегда должен находиться в диапазоне [0–1].
kUnityXRInputFeatureUsageUserPresence – это логическое значение, которое возвращает значение true, когда пользователь в данный момент носит гарнитуру.
2D-оси
Это двумерные аналоговые плавающие значения, такие как сенсорные панели и джойстики. Эти элементы управления обычно перемещаются большим пальцем. Они содержат как X, так и Y и всегда должны быть в диапазоне ([–1,1],[–1,1]).
kUnityXRInputFeatureUsagePrimary2DAxis – это двухмерная ось, представляющая сенсорную панель или джойстик. 0,0 — это положение ожидания, а Y-+ — от пользователя контроллера.
kUnityXRInputFeatureUsageSecondary2DAxis – это двухмерная ось, представляющая второй джойстик или сенсорную панель, используемая в дополнение к kUnityXRInputFeatureUsagePrimary2DAxis. 0,0 — это положение ожидания, а Y-+ — от пользователя контроллера.
Одномерные оси
Все это одномерные аналоговые значения с плавающей запятой. Кнопки, триггеры и другие элементы управления, которые можно нажимать наполовину, обозначаются здесь.
kUnityXRInputFeatureUsageTrigger – это одномерная ось, которая сопоставляется с триггером, активируемым индексом. Это всегда должно быть в диапазоне [0,1], где 0 открыто, а 1 полностью сжато. Если это реализовано, устройство также должно реализовать kUnityXRInputFeatureUsageTriggerButton.
kUnityXRInputFeatureUsageGrip – это одномерная ось, которая сопоставляется с захватом, активируемым сжатием руки. Это всегда должно быть в диапазоне [0,1], где 0 открыто, а 1 полностью сжато. Если это реализовано, устройство также должно реализовать kUnityXRInputFeatureUsageGripButton.
Двоичный
Это одномерные цифровые значения. Они могут быть активированы или нет, но дополнительной детализации нет.
kUnityXRInputFeatureUsagePrimaryButton – это двоичная функция, представляющая основную кнопку на контроллере. Это обычно используется в качестве кнопки принятия или продвижения в меню. Если это активировано, то kUnityXRInputFeatureUsagePrimaryTouch также должен быть активирован, если он существует.
kUnityXRInputFeatureUsagePrimaryTouch – это двоичная функция, представляющая состояние касания основной кнопки на контроллере. Если это реализовано, устройство должно реализовать kUnityXRInputFeatureUsagePrimaryButton.
kUnityXRInputFeatureUsageSecondaryButton – это двоичная функция, представляющая дополнительную кнопку на контроллере. Это обычно используется как кнопка «Назад» или «Альтернативный». Если это активировано, то kUnityXRInputFeatureUsageSecondaryTouch также должен быть активирован, если он существует.
kUnityXRInputFeatureUsageSecondaryTouch – это двоичная функция, представляющая состояние касания дополнительной кнопки на контроллере. Если это реализовано, устройство должно реализовать kUnityXRInputFeatureUsageSecondaryButton.
kUnityXRInputFeatureUsageGripButton — это бинарная функция, определяющая, срабатывает ли сжатие вручную. Если это реализовано, устройство также должно реализовать kUnityXRInputFeatureUsageGrip.
kUnityXRInputFeatureUsageTriggerButton — это логическая функция, определяющая, срабатывает ли сжатие вручную. Если это реализовано, устройство также должно реализовать kUnityXRInputFeatureUsageTrigger.
kUnityXRInputFeatureUsageMenuButton – это бинарная функция, представляющая неигровую паузу или кнопку меню. Обычно это не так просто для пользователя.
kUnityXRInputFeatureUsagePrimary2DAxisClick – это двоичный объект, представляющий нажатие или щелчок на двумерной оси kUnityXRInputFeatureUsagePrimary2DAxis. Если это реализовано, устройство должно реализовать kUnityXRInputFeatureUsagePrimary2DAxis. Если это активировано, то kUnityXRInputFeatureUsagePrimary2DAxisTouch также должен быть активирован, если он существует.
kUnityXRInputFeatureUsagePrimary2DAxisTouch – это бинарная функция, представляющая легкое касание двухмерной оси kUnityXRInputFeatureUsagePrimary2DAxis. Если это реализовано, устройство должно реализовать kUnityXRInputFeatureUsagePrimary2DAxis.
kUnityXRInputFeatureUsageSecondary2DAxisClick – это двоичный объект, представляющий нажатие или щелчок по двумерной оси kUnityXRInputFeatureUsageSecondary2DAxis. Если это реализовано, устройство должно реализовать kUnityXRInputFeatureUsageSecondary2DAxis. Если это активировано, то kUnityXRInputFeatureUsageSecondary2DAxisTouch также должен быть активирован, если он существует.
kUnityXRInputFeatureUsageSecondary2DAxisTouch – это бинарная функция, представляющая легкое касание двухмерной оси kUnityXRInputFeatureUsageSecondary2DAxis. Если это реализовано, устройство должно реализовать kUnityXRInputFeatureUsageSecondary2DAxis.
Датчик
Они представляют отдельные типы датчиков. Они используются как сокращение для поиска данных о типах рук и глаз.
kUnityXRInputFeatureUsageHandData — это функция UnityXRHands, представляющая данные отслеживания рук. kUnityXRInputFeatureUsageEyesData — это функция UnityXREyes, представляющая данные отслеживания взгляда.
Чтобы пользователи могли привязываться и использовать код для доступа к свойствам вашего устройства при использовании новой системы ввода, вам необходимо предоставить описания макета устройства как часть поставщика ввода.
Вы должны предоставить макет устройства для каждого типа устройства, который вы определяете в поставщике ввода.
Если вы не предоставите явный макет устройства для регистрируемого устройства, пользователи не смогут использовать новую систему ввода UI(Пользовательский интерфейс) Позволяет пользователю взаимодействовать с вашим приложением. В настоящее время Unity поддерживает три системы пользовательского интерфейса. Подробнее
См. Словарь для привязки к функциям на вашем устройстве. Система ввода по-прежнему будет получать данные устройства, и пользователи смогут вручную создавать привязки к вашим новым функциям устройства.
Дополнительную информацию о макетах устройств системы ввода см. в разделе Система ввода документация. Ниже приведен пример для простоты реализации.
Пример макета устройства
В этом примере представлен макет нового примера контроллера виртуальной реальности. Определение макета XRSDK примера контроллера виртуальной реальности описывается как имеющее:
- Дополнительный kUnityXRInputFeatureTypeBinary
, который называется exampleButton
- Значение kUnityXRInputFeatureTypeAxis3D
с именем examplePosition
– Значение kUnityXRInputFeatureTypeRotation
, называемое exampleRotation
Чтобы пользователи могли привязывать устройство и управлять им с помощью новой системы ввода, вы должны предоставить макет устройства для своего нового примера контроллера виртуальной реальности.
Во-первых, необходимо предоставить атрибут InputControlLayout
, а также предоставить явное имя для использования с новым пользовательским интерфейсом системы ввода. Используйте атрибут [Preseve]
, чтобы гарантировать, что эти элементы не будут удалены на этапе компиляции.
[Preserve]
[InputControlLayout(displayName = "Example VR Controller")]
public class ExampleVRController : XRController
{
Затем укажите сопоставления InputControl
для различных элементов, определенных в макете XRSDK.
Используйте [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("exampleButton");
examplePosition = GetChildControl("examplePosition");
exampleRotation = GetChildControl("exampleRotation");
}
Регистрация макетов
Последний шаг, который необходимо выполнить, — это регистрация новых макетов устройств в новой системе ввода при запуске загрузчика XRSDK для этих устройств. Следующий код является примером такой реализации.
Вы должны заполнить раздел REGEX, СООТВЕТСТВУЮЩИЙ ВАШЕМУ УСТРОЙСТВУ
, указав правильные строки соответствия продукту или другие строки, предоставленные вашим поставщиком ввода XRSDK при подключении устройства.
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(
matches: new InputDeviceMatcher()
.WithInterface(XRUtilities.InterfaceMatchAnyVersion)
.WithProduct("")
);
Контрольный список для создания собственного поставщика ввода
- Настройте базовую регистрацию жизненного цикла:
- IUnityXRInputInterface.RegisterLifecycleProvider с указателями функций для Initialize, Start, Stop, Shutdown.
- IUnityXRInputInterface.RegisterInputProvider вызывается из обратного вызова UnityLifecycleProvider.Initialize с заполненными вызовами поставщика входных данных.
- Вызов IUnityXRInputInterface.InputSubsystem_DeviceConnected с уникальным идентификатором для каждого подключенного устройства.
- Заполните действительные определения устройств для каждого устройства в UnityXRInputProvider.FillDeviceDefinition:
- Добавьте действительное имя.
- Добавить допустимую роль.
- Добавьте хотя бы одну функцию ввода.
- Обновите состояние устройства в UnityXRInputProvider.UpdateDeviceState для каждого подключенного устройства.
- Если вы можете прогнозировать позиции отслеживания для отрисовки, делайте это, когда обновление имеет тип kUnityXRInputUpdateTypeBeforeRender.
- Вызывайте IUnityXRInputInterface.InputSubsystem_SetBoundaryPoints с любой ограничивающей рамкой.
- Реализовать UnityXRInputProvider.QueryTrackingOriginMode, UnityXRInputProvider.QuerySupportedTrackingOriginModes и UnityXRInputProvider.HandleSetTrackingOriginMode.
- Реализовать UnityXRInputProvider.TryRecenter.
- Предоставьте новые макеты устройств системы ввода для ваших устройств.