title | description | author | ms.author | ms.date | keywords | ms.openlocfilehash | ms.sourcegitcommit | ms.translationtype | ms.contentlocale | ms.lasthandoff | ms.locfileid |
---|---|---|---|---|---|---|---|---|---|---|---|
События ввода |
Документация по Инпутевентс в МРТК |
keveleigh |
kurtie |
01/12/2021 |
Unity, HoloLens, HoloLens 2, смешанная реальность, разработка, мртк, события |
25ac5bd4a4f5d5678a80ec362512ce7daac791a17e93944aa4832d9d09c02ee2 |
a1c086aa83d381129e62f9d8942f0fc889ffcab0 |
MT |
ru-RU |
08/05/2021 |
115208336 |
В следующем списке перечислены все доступные интерфейсы входных событий, которые должны быть реализованы в пользовательском компоненте с нестандартным поведением. Эти интерфейсы будут вызываться входной системой МРТК для обработки пользовательской логики приложения на основе взаимодействия с пользовательским входом. События ввода указателя обрабатываются немного иначе, чем стандартные типы событий ввода, приведенные ниже.
Important
По умолчанию скрипт будет получать входные события только в том случае, если это GameObject фокус на указатель или родительский элемент GameObject в фокусе.
Обработчик | События | Description |
---|---|---|
IMixedRealitySourceStateHandler |
Источник обнаружен/потерян | Возникает при обнаружении или утере источника входных данных, например при обнаружении или потере наподобие руки. |
IMixedRealitySourcePoseHandler |
Исходное удаление изменено | Возникает при изменениях исходного объекта. Исходная единица представляет собой общую часть источника входных данных. Конкретные удаления, например захват или указатель на шести ДОФ контроллере, можно получить с помощью IMixedRealityInputHandler<MixedRealityPose> . |
IMixedRealityInputHandler |
Ввод вниз/вверх | Возникает при изменениях бинарных входных данных, таких как кнопки. |
IMixedRealityInputHandler<T> |
Ввод изменен | Возникает при изменениях входных данных заданного типа. T может принимать следующие значения: - float (например, возвращает Аналоговый триггер) - Vector2 (например, Возвращает направление аналогового стика планшета) - Vector3 (например, возвращаемое расположение отслеживания устройства) - Кватернион (например, возвращает ориентацию отслеживающего устройства) - Микседреалитипосе (например, возвращает полностью отслеживание устройства) |
IMixedRealitySpeechHandler |
Распознанное ключевое слово речи | Возникает при распознавании одного из ключевых слов, настроенных в профиле голосовых команд. |
IMixedRealityDictationHandler |
Диктовка Гипотеза Результат Завершить Ошибка |
Вызывается системами диктовки для передачи результатов сеанса диктовки. |
IMixedRealityGestureHandler |
События жестов в: Запуск Обновленные возможности Завершено Отменено |
Вызывается при обнаружении жеста. |
IMixedRealityGestureHandler<T> |
Жест обновлен или завершен | Возникает при обнаружении жестов, содержащих дополнительные данные заданного типа. Дополнительные сведения о возможных значениях для T см. в разделе события жестов . |
IMixedRealityHandJointHandler |
Обновлено соединений с руки | Генерируется с помощью манипуляторов контроллеров, когда обновляются соединения. |
IMixedRealityHandMeshHandler |
Сетка "руки" обновлена | Вызывается контроллерами с выявлением руки при обновлении сетки типа "рука". |
IMixedRealityInputActionHandler |
Действие запущено/завершено | Вызывает, чтобы указать начало и конец действия для входных данных, сопоставленных с действиями. |
На уровне скрипта входные события могут быть использованы путем реализации одного из интерфейсов обработчика событий, показанных в приведенной выше таблице. Когда событие ввода вызывается через взаимодействие с пользователем, происходит следующее:
- Система ввода МРТК распознает, что произошло событие ввода.
- Входная система МРТК запускает соответствующую функцию интерфейса входного события во все зарегистрированные глобальные входные обработчики .
- Для каждого активного указателя, зарегистрированного в системе ввода:
- Входная система определяет, на какой GameObject фокус находится текущий указатель.
- Входная система использует систему событий Unity для запуска соответствующей функции интерфейса для всех совпадающих компонентов в фокусе GameObject.
- Если в любой момент входное событие было помечено как используемое, процесс завершится, а последующие объекты gameobject не получат обратные вызовы.
- Пример.
IMixedRealitySpeechHandler
при распознавании речевой команды будет выполнен поиск компонентов, реализующих интерфейс. - Примечание. Система событий Unity будет выполнять поиск в родительском GameObject, если ни один из компонентов, соответствующих требуемому интерфейсу, не найден в текущем GameObject.
- Пример.
- Если не зарегистрированы глобальные входные обработчики и не найден GameObject с соответствующим компонентом или интерфейсом, то входная система будет вызывать каждый резервный обработчик входных данных.
Note
События ввода указателя обрабатываются немного иначе, чем указанные выше интерфейсы входных событий. В частности, входные события указателя обрабатываются только GameObject фокусом указателя, который активировал событие ввода, а также любыми глобальными обработчиками ввода. Обычные события ввода обрабатываются объекты gameobject в фокусе для всех активных указателей.
В приведенном ниже коде показано использование IMixedRealitySpeechHandler
интерфейса. Когда пользователь говорит слова «меньше» или «больше» при GameObjectе с этим ShowHideSpeechHandler
классом, GameObject будет масштабироваться вдвое или вдвое больше.
public class ShowHideSpeechHandler : MonoBehaviour, IMixedRealitySpeechHandler
{
...
void IMixedRealitySpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
{
if (eventData.Command.Keyword == "smaller")
{
transform.localScale *= 0.5f;
}
else if (eventData.Command.Keyword == "bigger")
{
transform.localScale *= 2.0f;
}
}
}
Note
IMixedRealitySpeechHandler
для входных событий требуется, чтобы требуемые ключевые слова были предварительно зарегистрированы в профиле голосовых команд мртк.
Чтобы создать компонент, который прослушивает глобальные входные события, не относящийся к GameObject, компонент должен зарегистрироваться в системе ввода. После регистрации все экземпляры этого одноименного поведения будут получать события ввода и все GameObject, на данный момент находящиеся в фокусе, и другие глобальные зарегистрированные прослушиватели.
Если событие ввода было помечено как используемое, глобальные зарегистрированные обработчики все равно будут принимать обратные вызовы. Однако ни один из объекты gameobject не получит событие.
public class GlobalHandListenerExample : MonoBehaviour,
IMixedRealitySourceStateHandler, // Handle source detected and lost
IMixedRealityHandJointHandler // handle joint position updates for hands
{
private void OnEnable()
{
// Instruct Input System that we would like to receive all input events of type
// IMixedRealitySourceStateHandler and IMixedRealityHandJointHandler
CoreServices.InputSystem?.RegisterHandler<IMixedRealitySourceStateHandler>(this);
CoreServices.InputSystem?.RegisterHandler<IMixedRealityHandJointHandler>(this);
}
private void OnDisable()
{
// This component is being destroyed
// Instruct the Input System to disregard us for input event handling
CoreServices.InputSystem?.UnregisterHandler<IMixedRealitySourceStateHandler>(this);
CoreServices.InputSystem?.UnregisterHandler<IMixedRealityHandJointHandler>(this);
}
// IMixedRealitySourceStateHandler interface
public void OnSourceDetected(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
// Only react to articulated hand input sources
if (hand != null)
{
Debug.Log("Source detected: " + hand.ControllerHandedness);
}
}
public void OnSourceLost(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
// Only react to articulated hand input sources
if (hand != null)
{
Debug.Log("Source lost: " + hand.ControllerHandedness);
}
}
public void OnHandJointsUpdated(
InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
{
MixedRealityPose palmPose;
if (eventData.InputData.TryGetValue(TrackedHandJoint.Palm, out palmPose))
{
Debug.Log("Hand Joint Palm Updated: " + palmPose.Position);
}
}
}
Резервные обработчики ввода похожи на зарегистрированные глобальные обработчики ввода, но обрабатываются как Последнее средство обработки входных событий. Только если не найдены глобальные входные обработчики и в фокусе нет объекты gameobject, будут использоваться резервные обработчики ввода.
public class GlobalHandListenerExample : MonoBehaviour,
IMixedRealitySourceStateHandler // Handle source detected and lost
{
private void OnEnable()
{
CoreServices.InputSystem?.PushFallbackInputHandler(this);
}
private void OnDisable()
{
CoreServices.InputSystem?.PopFallbackInputHandler();
}
// IMixedRealitySourceStateHandler interface
public void OnSourceDetected(SourceStateEventData eventData)
{
...
}
public void OnSourceLost(SourceStateEventData eventData)
{
...
}
}
Каждый интерфейс входных событий предоставляет BaseInputEventData
объект данных в качестве параметра для каждой функции в интерфейсе. Этот объект данных события дополняется собственным объектом Unity AbstractEventData
.
Чтобы предотвратить распространение события ввода через его выполнение, как описано, компонент может вызвать, AbstractEventData.Use()
чтобы пометить событие как используемое. Это приведет к отмене всех остальных объекты gameobject от получения текущего события ввода, за исключением глобальных входных обработчиков.
Note
Компонент, вызывающий Use()
метод, будет прекращать объекты gameobject от его получения. Однако другие компоненты текущего GameObject будут по-прежнему принимать входные события и срабатывать на любые связанные функции интерфейса.