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:
- O sistema de entrada do MRTK reconhece que ocorreu um evento de entrada.
- O sistema de entrada MRTK dispara a função de interface relevante do evento de entrada para todos os manipuladores de entrada globais registrados
- Para cada ponteiro ativo registrado com o sistema de entrada:
- O sistema de entrada determina qual GameObject está em foco para o ponteiro atual.
- 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.
- 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.
- Exemplo: os componentes que implementam a interface
- 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 AbstractEventData
Unity.
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.