Eventos de entrada: MRTK2

En la lista siguiente se describen todas las interfaces de eventos de entrada disponibles que va a implementar un componente monoBehaviour personalizado. El sistema de entrada de MRTK llamará a estas interfaces para controlar la lógica de la aplicación personalizada en función de las interacciones de entrada del usuario. Los eventos de entrada de puntero se controlan ligeramente de forma diferente a los tipos de eventos de entrada estándar siguientes.

Importante

De forma predeterminada, un script recibirá eventos de entrada solo si es gameObject en el foco por un puntero o elemento primario de un GameObject en el foco.

Controlador Eventos Descripción
IMixedRealitySourceStateHandler Origen detectado o perdido Se genera cuando se detecta o pierde un origen de entrada, como cuando se detecta o se pierde un seguimiento de una mano articulada.
IMixedRealitySourcePoseHandler Posición de origen modificada Se genera en los cambios de posición de origen. La posición de origen representa la posición general del origen de entrada. Las posturas específicas, como la posición de agarre o puntero en un controlador DOF, se pueden obtener a través IMixedRealityInputHandler<MixedRealityPose>de .
IMixedRealityInputHandler Entrada hacia abajo o hacia arriba Se genera en cambios en entradas binarias como botones.
IMixedRealityInputHandler<T> Entrada modificada Se genera en cambios en las entradas del tipo especificado. T puede tomar los siguientes valores:
- float (por ejemplo, devuelve un desencadenador analógico)
- Vector2 (por ejemplo, devuelve la dirección del stick de mando del controlador para juegos)
- Vector3 (por ejemplo, posición de retorno del dispositivo con seguimiento)
- Cuaternión (por ejemplo, devuelve la orientación del dispositivo con seguimiento)
- MixedRealityPose (por ejemplo, devuelve un dispositivo de seguimiento completo)
IMixedRealitySpeechHandler Palabra clave speech reconocida Se genera al reconocer una de las palabras clave configuradas en el perfil de comandos de voz.
IMixedRealityDictationHandler Dictado
Hipótesis
Resultado
Completo
Error
Se genera mediante sistemas de dictado para notificar los resultados de una sesión de dictado.
IMixedRealityGestureHandler Eventos de gestos en:
Iniciado
Actualizado
Completado
Canceled
Se genera en la detección de gestos.
IMixedRealityGestureHandler<T> Gesto actualizado/completado Se genera al detectar gestos que contienen datos adicionales del tipo especificado. Consulte eventos de gestos para obtener más información sobre los valores posibles de T.
IMixedRealityHandJointHandler Articulaciones de mano actualizadas Elevado por controladores de mano articulados cuando se actualizan las juntas de mano.
IMixedRealityHandMeshHandler Hand Mesh Updated Elevado por controladores de mano articulados cuando se actualiza una malla de mano.
IMixedRealityInputActionHandler Acción iniciada/finalizada Genere para indicar el inicio y el final de la acción para las entradas asignadas a las acciones.

Eventos de entrada en acción

En el nivel de script, los eventos de entrada se pueden consumir mediante la implementación de una de las interfaces de controlador de eventos que se muestran en la tabla anterior. Cuando se desencadena un evento de entrada a través de una interacción del usuario, se produce lo siguiente:

  1. El sistema de entrada de MRTK reconoce que se ha producido un evento de entrada.
  2. El sistema de entrada MRTK activa la función de interfaz pertinente del evento de entrada a todos los controladores de entrada globales registrados.
  3. Para cada puntero activo registrado con el sistema de entrada:
    1. El sistema de entrada determina qué GameObject está en foco para el puntero actual.
    2. El sistema de entrada utiliza el sistema de eventos de Unity para activar la función de interfaz pertinente para todos los componentes coincidentes en el GameObject centrado.
    3. Si en cualquier momento un evento de entrada se ha marcado como usado, el proceso finalizará y ningún gameObjects recibirá devoluciones de llamada.
      • Ejemplo: Los componentes que implementan la interfaz IMixedRealitySpeechHandler se buscarán cuando se reconozca un comando de voz.
      • Nota: El sistema de eventos de Unity se propagará hasta buscar el gameObject primario si no se encuentra ningún componente que coincida con la interfaz deseada en el gameObject actual.
  4. Si no se registran controladores de entrada globales y no se encuentra gameObject con un componente o interfaz coincidente, el sistema de entrada llamará a cada controlador de entrada registrado de reserva.

Nota

Los eventos de entrada de puntero se controlan de una manera ligeramente diferente a las interfaces de eventos de entrada enumeradas anteriormente. En concreto, los eventos de entrada de puntero solo los controla GameObject en el foco mediante el puntero que desencadenó el evento de entrada, así como cualquier controlador de entrada global. Los eventos de entrada normales se controlan mediante GameObjects en el foco para todos los punteros activos.

Ejemplo de interfaz de eventos de entrada

El código siguiente muestra el uso de la IMixedRealitySpeechHandler interfaz . Cuando el usuario dice las palabras "más pequeñas" o "más grandes" mientras se centra en un GameObject con esta ShowHideSpeechHandler clase, gameObject se escalará por mitad o dos veces más.

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 los eventos de entrada requieren que las palabras clave deseadas estén registradas previamente en el perfil de comandos de voz de MRTK.

Registro para eventos de entrada globales

Para crear un componente que escuche eventos de entrada globales, sin tener en cuenta lo que gameObject puede estar centrado, un componente debe registrarse en el sistema de entrada. Una vez registrados, las instancias de este MonoBehaviour recibirán eventos de entrada junto con cualquier GameObject(s) actualmente en foco y otros agentes de escucha registrados globales.

Si se ha marcado un evento de entrada como usado, los controladores registrados globales seguirán recibiendo devoluciones de llamada. Sin embargo, ningún GameObjects centrado recibirá el evento.

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

Registro para eventos de entrada de reserva

Los controladores de entrada de reserva son similares a los controladores de entrada globales registrados, pero se tratan como un último recurso para el control de eventos de entrada. Solo si no se encontraron controladores de entrada globales y no hay gameObjects en el foco se aprovecharán los controladores de entrada de reserva.

Ejemplo del controlador de entrada de reserva

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

Cómo detener eventos de entrada

Cada interfaz de eventos de entrada proporciona un BaseInputEventData objeto de datos como parámetro a cada función de la interfaz. Este objeto de datos de evento se extiende desde la propia AbstractEventDatapropiedad de Unity.

Para evitar que un evento de entrada se propague a través de su ejecución como se describe, un componente puede llamar AbstractEventData.Use() a para marcar el evento como se usa. Esto impedirá que cualquier otro objeto GameObjects reciba el evento de entrada actual, con la excepción de los controladores de entrada globales.

Nota

Un componente que llama al Use() método impedirá que otros GameObjects lo reciban. Sin embargo, otros componentes del gameObject actual seguirán recibiendo el evento de entrada y activarán las funciones de interfaz relacionadas.

Consulta también