Eventos de entrada — MRTK2

A lista abaixo descreve todas as interfaces de eventos de entrada disponíveis para serem implementadas por um componente MonoBehaviour personalizado. Estas interfaces serão chamadas pelo sistema de entrada MRTK para processar a lógica da aplicação personalizada com base nas interações de entrada do utilizador. Os eventos de entrada do ponteiro são processados de forma ligeiramente diferente dos tipos de eventos de entrada padrão abaixo.

Importante

Por predefinição, um script só receberá eventos de entrada se for o GameObject em foco por um ponteiro ou elemento principal de um GameObject em foco.

Processador Evento Descrição
IMixedRealitySourceStateHandler Origem Detetada/Perdida Gerado quando uma origem de entrada é detetada/perdida, como quando uma mão articulada é detetada ou se perde o registo de.
IMixedRealitySourcePoseHandler Pose de Origem Alterada Gerado sobre as alterações de pose de origem. A pose de origem representa a pose geral da origem de entrada. As poses específicas, como a postura de aperto ou ponteiro num controlador DOF de seis, podem ser obtidas através de IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Entrada Para Baixo/Cima Gerado em alterações a entradas binárias, como botões.
IMixedRealityInputHandler<T> Entrada Alterada Gerado nas alterações às entradas do tipo especificado. O T pode utilizar os seguintes valores:
- float (por exemplo, devolve o acionador analógico)
- Vector2 (por exemplo, devolve a direção do manípulo do gamepad)
- Vector3 (por exemplo, a posição de retorno do dispositivo controlado)
- Quaternion (por exemplo, devolve a orientação do dispositivo controlado)
- MixedRealityPose (por exemplo, devolve um dispositivo totalmente controlado)
IMixedRealitySpeechHandler Palavra-chave de Voz Reconhecida Gerado sobre o reconhecimento de uma das palavras-chave configuradas no Perfil de Comandos de Voz.
IMixedRealityDictationHandler Ditado
Hipótese
Resultado
Concluído
Erro
Gerado por sistemas de ditado para comunicar os resultados de uma sessão de ditado.
IMixedRealityGestureHandler Eventos de gestos em:
Iniciado
Atualizado
Concluído
Cancelado
Gerado na deteção de gestos.
IMixedRealityGestureHandler<T> Gesto Atualizado/Concluído Gerado na deteção de gestos que contêm dados adicionais do tipo especificado. Veja eventos de gestos para obter detalhes sobre os valores possíveis para T.
IMixedRealityHandJointHandler Juntas de Mão Atualizadas Gerado por controladores de mão articulados quando as juntas manuás são atualizadas.
IMixedRealityHandMeshHandler Malha Manual Atualizada Gerado por controladores de mão articulados quando uma malha manual é atualizada.
IMixedRealityInputActionHandler Ação Iniciada/Terminada Gerar para indicar o início e o fim da ação para entradas mapeadas para ações.

Eventos de entrada em ação

Ao nível do script, os eventos de entrada podem ser consumidos ao implementar uma das interfaces de processador de eventos mostradas na tabela acima. Quando um evento de entrada é acionado através de uma interação do utilizador, ocorre o seguinte:

  1. O sistema de entrada MRTK reconhece que ocorreu um evento de entrada.
  2. O sistema de entrada MRTK aciona a função de interface relevante do evento de entrada para todos os processadores de entrada globais registados
  3. Para cada ponteiro ativo registado no sistema de entrada:
    1. O sistema de entrada determina que GameObject está em foco para o ponteiro atual.
    2. O sistema de entrada utiliza o sistema de eventos do Unity para acionar 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 utilizado, o processo terminará e nenhum outro GameObjects receberá chamadas de retorno.
      • Exemplo: os componentes que implementam a interface IMixedRealitySpeechHandler serão procurados quando for reconhecido um comando de voz.
      • Nota: o sistema de eventos do Unity irá aparecer para procurar o GameObject principal se não forem encontrados componentes que correspondam à interface pretendida no GameObject atual.
  4. Se não forem registados processadores de entrada globais e não for encontrado nenhum GameObject com um componente/interface correspondente, o sistema de entrada chamará cada processador de entrada registado de contingência

Nota

Os eventos de entrada do ponteiro são processados de uma forma ligeiramente diferente das interfaces de evento de entrada listadas acima. Em particular, os eventos de entrada do ponteiro são processados apenas pelo GameObject em foco pelo ponteiro que acionou o evento de entrada, bem como por quaisquer processadores de entrada globais. Os eventos de entrada regulares são processados por GameObjects em foco para todos os ponteiros ativos.

Exemplo de interface de evento de entrada

O código abaixo demonstra a utilização da IMixedRealitySpeechHandler interface. Quando o utilizador diz as palavras "mais pequeno" ou "maior" enquanto se concentra num GameObject com esta ShowHideSpeechHandler classe, o GameObject será dimensionado para 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;
        }
    }
}

Nota

IMixedRealitySpeechHandler os eventos de entrada requerem que as palavras-chave pretendidas estejam pré-registadas no Perfil de Comandos de Voz do MRTK.

Registar-se para eventos de entrada globais

Para criar um componente que escuta eventos de entrada globais, ignorando o que o GameObject pode estar em foco, um componente tem de se registar no Sistema de Entrada. Depois de registadas, todas as instâncias deste MonoBehaviour receberão eventos de entrada juntamente com quaisquer GameObject(s) atualmente em foco e outros serviços de escuta registados globais.

Se um evento de entrada tiver sido marcado como utilizado, os processadores registados globais continuarão a receber chamadas de retorno. No entanto, nenhum GameObjects focado receberá o evento.

Exemplo de registo 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);
        }
    }
}

Registar-se para eventos de entrada de contingência

Os processadores de entrada de contingência são semelhantes aos processadores de entrada globais registados, mas são tratados como um último recurso para processamento de eventos de entrada. Só se não forem encontrados processadores de entrada globais e não existirem GameObjects em foco serão utilizados processadores de entradas de contingência.

Exemplo de processador de entrada de contingência

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 parar 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. Este objeto de dados de evento expande-se a partir do próprio AbstractEventData.

Para impedir que um evento de entrada se propague através da respetiva execução, conforme descrito, um componente pode chamar AbstractEventData.Use() para marcar o evento como utilizado. Isto impedirá que quaisquer outros GameObjects recebam o evento de entrada atual, com exceção dos processadores de entrada globais.

Nota

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

Ver também