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

В приведенном ниже списке перечислены все доступные интерфейсы событий ввода, которые будут реализованы пользовательским компонентом MonoBehaviour. Эти интерфейсы будут вызываться системой ввода MRTK для обработки пользовательской логики приложения на основе взаимодействия с пользователем. События ввода указателя обрабатываются немного иначе, чем стандартные типы событий ввода ниже.

Важно!

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

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

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

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

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

Примечание

События ввода указателя обрабатываются немного иначе, чем интерфейсы событий ввода, перечисленные выше. В частности, события ввода указателя обрабатываются только объектом GameObject в фокусе указателем, который вызвал событие ввода, а также любыми глобальными обработчиками входных данных. Регулярные события ввода обрабатываются GameObjects в фокусе для всех активных указателей.

Пример интерфейса события ввода

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

Регистрация для глобальных событий ввода

Чтобы создать компонент, прослушивающий глобальные события ввода, игнорируя то, что GameObject может находиться в фокусе, компонент должен зарегистрировать себя в системе ввода. После регистрации все экземпляры этого MonoBehaviour будут получать входные события вместе со всеми GameObject(s), которые в настоящее время находятся в фокусе, и другими глобальными зарегистрированными прослушивателями.

Если событие ввода помечено как используемое, глобальные зарегистрированные обработчики по-прежнему будут получать обратные вызовы. Тем не менее, события не будут получаться от ориентированных GameObjects.

Пример регистрации глобальных входных данных

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);
        }
    }
}

Регистрация для получения резервных входных событий

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

Пример резервного обработчика входных данных

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 объект данных в качестве параметра для каждой функции в интерфейсе. Этот объект данных события расширяется из собственного AbstractEventDataобъекта Unity .

Чтобы предотвратить распространение входного события через его выполнение, как описано, компонент может вызвать AbstractEventData.Use() , чтобы пометить событие как используемое. Это не позволит другим объектам GameObject получать текущее событие ввода, за исключением глобальных обработчиков входных данных.

Примечание

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

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