Compartilhar via


Eventos de entrada — MRTK2

A lista a seguir descreve todas as interfaces de evento de entrada disponíveis a serem implementadas por um componente MonoBehaviour personalizado. Essas interfaces serão chamadas pelo sistema de entrada MRTK para lidar com a lógica de aplicativo personalizada com base nas interações de entrada do usuário. Os eventos de entrada de ponteiro são tratados de maneira ligeiramente diferente dos tipos de evento de entrada padrão abaixo.

Importante

Por padrão, um script receberá eventos de entrada somente se for o GameObject em foco por um ponteiro ou pai de um GameObject em foco.

Manipulador Eventos Descrição
IMixedRealitySourceStateHandler Origem Detectada/Perdida Gerado quando uma fonte de entrada é detectada/perdida, como quando uma mão articulada é detectada ou perdida.
IMixedRealitySourcePoseHandler Pose de origem alterada Gerado nas alterações de pose de origem. A pose de origem representa a pose geral da origem de entrada. Poses específicas, como a alça ou a pose do ponteiro em um controlador DOF de seis, podem ser obtidas por meio de IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Entrada para baixo/para cima Gerado em alterações em entradas binárias, como botões.
IMixedRealityInputHandler<T> Entrada Alterada Gerado em alterações nas entradas do tipo fornecido. T pode usar os seguintes valores:
- float (por exemplo, retorna gatilho analógico)
- Vector2 (por exemplo, retorna a direção do botão do gamepad)
- Vector3 (por exemplo, posição de retorno do dispositivo rastreado)
- Quatérnion (por exemplo, retorna a orientação do dispositivo rastreado)
- MixedRealityPose (por exemplo, retorna um dispositivo totalmente controlado)
IMixedRealitySpeechHandler Palavra-chave de Fala Reconhecida Gerado no reconhecimento de uma das palavras-chave configuradas no Perfil de Comandos de Fala.
IMixedRealityDictationHandler Ditado
Hipótese
Resultado
Concluir
Erro
Gerado por sistemas de ditado para relatar os resultados de uma sessão de ditado.
IMixedRealityGestureHandler Eventos de gesto em:
Iniciado
Atualizado
Concluído
Canceled
Gerado na detecção de gestos.
IMixedRealityGestureHandler<T> Gesto atualizado/concluído Gerado na detecção de gestos que contêm dados adicionais do tipo fornecido. Consulte eventos de gestos para obter detalhes sobre os valores possíveis para T.
IMixedRealityHandJointHandler Articulações m mão atualizadas Gerado por controladores de mão articulados quando as articulações das mãos são atualizadas.
IMixedRealityHandMeshHandler Malha Manual Atualizada Gerado por controladores de mão articulados quando uma malha manual é atualizada.
IMixedRealityInputActionHandler Ação Iniciada/Encerrada Gere para indicar o início e o fim da ação para entradas mapeadas para ações.

Eventos de entrada em ação

No nível do script, os eventos de entrada podem ser consumidos implementando uma das interfaces do manipulador de eventos mostradas na tabela acima. Quando um evento de entrada é acionado por meio de uma interação do usuário, ocorre o seguinte:

  1. O sistema de entrada do MRTK reconhece que ocorreu um evento de entrada.
  2. O sistema de entrada MRTK dispara a função de interface relevante do evento de entrada para todos os manipuladores de entrada globais registrados
  3. Para cada ponteiro ativo registrado com o sistema de entrada:
    1. O sistema de entrada determina qual GameObject está em foco para o ponteiro atual.
    2. O sistema de entrada utiliza o sistema de eventos do Unity para disparar a função de interface relevante para todos os componentes correspondentes no GameObject focado.
    3. Se em algum momento um evento de entrada tiver sido marcado como usado, o processo terminará e nenhum GameObjects receberá retornos de chamada.
      • Exemplo: os componentes que implementam a interface IMixedRealitySpeechHandler serão pesquisados quando um comando de fala for reconhecido.
      • Observação: o sistema de eventos do Unity aparecerá para pesquisar o GameObject pai se nenhum componente correspondente à interface desejada for encontrado no GameObject atual.
  4. Se nenhum manipulador de entrada global for registrado e nenhum GameObject for encontrado com um componente/interface correspondente, o sistema de entrada chamará cada manipulador de entrada registrado de fallback

Observação

Os eventos de entrada de ponteiro são tratados de maneira um pouco diferente das interfaces de evento de entrada listadas acima. Em particular, os eventos de entrada de ponteiro são manipulados apenas pelo GameObject em foco pelo ponteiro que disparou o evento de entrada, bem como por qualquer manipulador de entrada global. Eventos de entrada regulares são tratados por GameObjects em foco para todos os ponteiros ativos.

Exemplo de interface de evento de entrada

O código a seguir demonstra o uso da IMixedRealitySpeechHandler interface . Quando o usuário diz as palavras "menor" ou "maior" ao se concentrar em um GameObject com essa ShowHideSpeechHandler classe, o GameObject se dimensionará pela metade ou duas vezes mais.

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

Observação

IMixedRealitySpeechHandler Os eventos de entrada exigem que as palavras-chave desejadas sejam pré-registradas no Perfil de Comandos de Fala do MRTK.

Registrar-se para eventos de entrada globais

Para criar um componente que escuta eventos de entrada globais, desconsiderando o que GameObject pode estar em foco, um componente deve se registrar no Sistema de Entrada. Depois de registradas, todas as instâncias desse MonoBehaviour receberão eventos de entrada junto com qualquer GameObject(s) atualmente em foco e outros ouvintes registrados globais.

Se um evento de entrada tiver sido marcado como usado, os manipuladores registrados globais ainda receberão retornos de chamada. No entanto, nenhum GameObjects focado receberá o evento.

Exemplo de registro de entrada global

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

Registrar-se para eventos de entrada de fallback

Manipuladores de entrada de fallback são semelhantes aos manipuladores de entrada globais registrados, mas são tratados como último recurso para manipulação de eventos de entrada. Somente se nenhum manipulador de entrada global for encontrado e nenhum GameObjects estiver em foco, os manipuladores de entrada de fallback serão aproveitados.

Exemplo de manipulador de entrada de fallback

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)
    {
        ...
    }
}

Como interromper eventos de entrada

Cada interface de evento de entrada fornece um BaseInputEventData objeto de dados como um parâmetro para cada função na interface. Esse objeto de dados de evento se estende do próprio AbstractEventDataUnity.

Para impedir que um evento de entrada se propague por meio de sua execução , conforme descrito, um componente pode chamar AbstractEventData.Use() para marcar o evento como usado. Isso impedirá que qualquer outro GameObjects receba o evento de entrada atual, com exceção dos manipuladores de entrada globais.

Observação

Um componente que chama o Use() método impedirá que outros GameObjects o recebam. No entanto, outros componentes no GameObject atual ainda receberão o evento de entrada e dispararão quaisquer funções de interface relacionadas.

Confira também