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

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

Важно!

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

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

Если входное событие отмечено как использованное, глобальные зарегистрированные обработчики по-прежнему будут получать обратные вызовы. Однако события не будут получаться в фокусе 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);
        }
    }
}

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

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

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

Примечание

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

См. также статью