События ввода

В следующем списке перечислены все доступные интерфейсы входных событий, которые должны быть реализованы в пользовательском компоненте с нестандартным поведением. Эти интерфейсы будут вызываться входной системой МРТК для обработки пользовательской логики приложения на основе взаимодействия с пользовательским входом. События ввода указателя обрабатываются немного иначе, чем стандартные типы событий ввода, приведенные ниже.

Важно!

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

Обработчик События Description
IMixedRealitySourceStateHandler Источник обнаружен/потерян Возникает при обнаружении или утере источника входных данных, например при обнаружении или потере наподобие руки.
IMixedRealitySourcePoseHandler Исходное удаление изменено Возникает при изменениях исходного объекта. Исходная единица представляет собой общую часть источника входных данных. Конкретные удаления, например захват или указатель на шести ДОФ контроллере, можно получить с помощью IMixedRealityInputHandler<MixedRealityPose> .
IMixedRealityInputHandler Ввод вниз/вверх Возникает при изменениях бинарных входных данных, таких как кнопки.
IMixedRealityInputHandler<T> Ввод изменен Возникает при изменениях входных данных заданного типа. T может принимать следующие значения:
- float (например, возвращает Аналоговый триггер)
- Vector2 (например, Возвращает направление аналогового стика планшета)
- Vector3 (например, возвращаемое расположение отслеживания устройства)
- Кватернион (например, возвращает ориентацию отслеживающего устройства)
- Микседреалитипосе (например, возвращает полностью отслеживание устройства)
IMixedRealitySpeechHandler Распознанное ключевое слово речи Возникает при распознавании одного из ключевых слов, настроенных в профиле голосовых команд.
IMixedRealityDictationHandler Диктовка
Гипотеза
Результат
Завершить
Ошибка
Вызывается системами диктовки для передачи результатов сеанса диктовки.
IMixedRealityGestureHandler События жестов в:
Запуск
Обновленные возможности
Завершено
Отменено
Вызывается при обнаружении жеста.
IMixedRealityGestureHandler<T> Жест обновлен или завершен Возникает при обнаружении жестов, содержащих дополнительные данные заданного типа. Дополнительные сведения о возможных значениях для T см. в разделе события жестов .
IMixedRealityHandJointHandler Обновлено соединений с руки Генерируется с помощью манипуляторов контроллеров, когда обновляются соединения.
IMixedRealityHandMeshHandler Сетка "руки" обновлена Вызывается контроллерами с выявлением руки при обновлении сетки типа "рука".
IMixedRealityInputActionHandler Действие запущено/завершено Вызывает, чтобы указать начало и конец действия для входных данных, сопоставленных с действиями.

Входные события в действии

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

  1. Система ввода МРТК распознает, что произошло событие ввода.
  2. Входная система МРТК запускает соответствующую функцию интерфейса входного события во все зарегистрированные глобальные входные обработчики .
  3. Для каждого активного указателя, зарегистрированного в системе ввода:
    1. Входная система определяет, на какой GameObject фокус находится текущий указатель.
    2. Входная система использует систему событий Unity для запуска соответствующей функции интерфейса для всех совпадающих компонентов в фокусе GameObject.
    3. Если в любой момент входное событие было помечено как используемое, процесс завершится, а последующие объекты gameobject не получат обратные вызовы.
      • Пример. IMixedRealitySpeechHandler при распознавании речевой команды будет выполнен поиск компонентов, реализующих интерфейс.
      • Примечание. Система событий Unity будет выполнять поиск в родительском GameObject, если ни один из компонентов, соответствующих требуемому интерфейсу, не найден в текущем GameObject.
  4. Если не зарегистрированы глобальные входные обработчики и не найден GameObject с соответствующим компонентом или интерфейсом, то входная система будет вызывать каждый резервный обработчик входных данных.

Примечание

События ввода указателя обрабатываются немного иначе, чем указанные выше интерфейсы входных событий. В частности, входные события указателя обрабатываются только 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;
        }
    }
}

Примечание

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 от получения текущего события ввода, за исключением глобальных входных обработчиков.

Примечание

Компонент, вызывающий Use() метод, будет прекращать объекты gameobject от его получения. Однако другие компоненты текущего GameObject будут по-прежнему принимать входные события и срабатывать на любые связанные функции интерфейса.

См. также раздел