Eventi di input - MRTK2

L'elenco seguente descrive tutte le interfacce eventi di input disponibili da implementare da un componente MonoBehaviour personalizzato. Queste interfacce verranno chiamate dal sistema di input MRTK per gestire la logica dell'app personalizzata in base alle interazioni di input utente. Gli eventi di input del puntatore vengono gestiti leggermente diversamente dai tipi di eventi di input standard riportati di seguito.

Importante

Per impostazione predefinita, uno script riceverà eventi di input solo se è il GameObject in stato attivo da un puntatore o un padre di un GameObject in stato attivo.

Gestore Eventi Descrizione
IMixedRealitySourceStateHandler Origine rilevata/persa Generato quando viene rilevata o persa un'origine di input, ad esempio quando viene rilevata o perduta una mano articolata.
IMixedRealitySourcePoseHandler Posizione di origine modificata Generato in base alle modifiche apportate alla posizione di origine. La posizione di origine rappresenta la posizione generale dell'origine di input. Le posizioni specifiche, come la presa o la posa del puntatore in un controller DOF di sei, possono essere ottenute tramite IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Input down/up Generato sulle modifiche agli input binari come i pulsanti.
IMixedRealityInputHandler<T> Input modificato Generato sulle modifiche agli input del tipo specificato. T può accettare i valori seguenti:
- float (ad esempio restituisce trigger analogico)
- Vector2 (ad esempio restituisce la direzione della tastiera del gamepad)
- Vector3 (ad esempio, posizione restituita del dispositivo monitorato)
- Quaternione (ad esempio restituisce l'orientamento del dispositivo monitorato)
- MixedRealityPose (ad esempio, restituisce un dispositivo completamente monitorato)
IMixedRealitySpeechHandler Parola chiave vocale riconosciuta Generato sul riconoscimento di una delle parole chiave configurate nel profilo comandi vocali.
IMixedRealityDictationHandler Dettatura
Hypothesis
Risultato
Operazione completata
Errore
Generato dai sistemi di dettatura per segnalare i risultati di una sessione di dettatura.
IMixedRealityGestureHandler Eventi di movimento su:
Avviato
Aggiornato
Completato
Cancellati
Generato nel rilevamento dei movimenti.
IMixedRealityGestureHandler<T> Movimento aggiornato/completato Generato nel rilevamento dei movimenti contenente dati aggiuntivi del tipo specificato. Per informazioni dettagliate sui valori possibili per T, vedere eventi di movimento.
IMixedRealityHandJointHandler Articolazioni mano aggiornate Sollevato da controller di mano articolati quando le articolazioni della mano vengono aggiornate.
IMixedRealityHandMeshHandler Mesh mano aggiornata Generato dai controller di mano articolati quando viene aggiornata una mesh di mano.
IMixedRealityInputActionHandler Azione avviata/terminata Generare per indicare l'inizio dell'azione e la fine per gli input mappati alle azioni.

Eventi di input in azione

A livello di script, gli eventi di input possono essere usati implementando una delle interfacce del gestore eventi visualizzate nella tabella precedente. Quando un evento di input viene generato tramite un'interazione utente, si verifica quanto segue:

  1. Il sistema di input MRTK riconosce che si è verificato un evento di input.
  2. Il sistema di input MRTK attiva la funzione di interfaccia pertinente dell'evento di input a tutti i gestori di input globali registrati
  3. Per ogni puntatore attivo registrato con il sistema di input:
    1. Il sistema di input determina quale GameObject è attivo per il puntatore corrente.
    2. Il sistema di input usa il sistema di eventi di Unity per attivare la funzione di interfaccia pertinente per tutti i componenti corrispondenti nel GameObject incentrato.
    3. Se in qualsiasi momento un evento di input è stato contrassegnato come usato, il processo terminerà e non verranno ricevuti altri CallObjects.
      • Esempio: i componenti che implementano l'interfaccia IMixedRealitySpeechHandler verranno cercati quando viene riconosciuto un comando vocale.
      • Nota: il sistema di eventi Unity verrà visualizzato fino a cercare GameObject padre se non sono presenti componenti corrispondenti all'interfaccia desiderata nel GameObject corrente.
  4. Se non vengono registrati gestori di input globali e non viene trovato GameObject con un componente/interfaccia corrispondente, il sistema di input chiamerà ogni gestore di input registrato con fallback

Nota

Gli eventi di input del puntatore vengono gestiti in modo leggermente diverso rispetto alle interfacce dell'evento di input elencate sopra. In particolare, gli eventi di input del puntatore vengono gestiti solo dal GameObject in stato attivo dal puntatore che ha attivato l'evento di input, nonché da tutti i gestori di input globali. Gli eventi di input regolari vengono gestiti da GameObjects nello stato attivo per tutti i puntatori attivi.

Esempio di interfaccia evento di input

Il codice seguente illustra l'uso dell'interfaccia IMixedRealitySpeechHandler . Quando l'utente dice le parole "più piccole" o "più grandi" mentre si concentra su un GameObject con questa ShowHideSpeechHandler classe, GameObject si ridimensiona per metà o due volte.

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 gli eventi di input richiedono che le parole chiave desiderate siano preregistrati nel profilo comandi vocali MRTK.

Registrare gli eventi di input globali

Per creare un componente in ascolto degli eventi di input globali, ignorando ciò che GameObject può essere attivo, un componente deve registrarsi con il sistema di input. Dopo la registrazione, tutte le istanze di questo MonoBehaviour riceveranno eventi di input insieme a qualsiasi GameObject attualmente in stato attivo e altri listener registrati globali.

Se un evento di input è stato contrassegnato come usato, i gestori registrati globali riceveranno comunque tutti i callback. Tuttavia, nessun GameObjects incentrato riceverà l'evento.

Esempio di registrazione di input globale

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

Registrare gli eventi di input di fallback

I gestori di input di fallback sono simili ai gestori di input globali registrati, ma vengono considerati come un'ultima risorsa per la gestione degli eventi di input. Solo se non sono stati trovati gestori di input globali e non sono presenti gestori di input gameObjects verranno sfruttati i gestori di input di fallback.

Esempio di gestore di input di 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)
    {
        ...
    }
}

Come arrestare gli eventi di input

Ogni interfaccia evento di input fornisce un BaseInputEventData oggetto dati come parametro per ogni funzione nell'interfaccia. Questo oggetto dati evento si estende dal proprio AbstractEventDataoggetto di Unity.

Per interrompere la propagazione di un evento di input attraverso l'esecuzione come descritto, un componente può chiamare AbstractEventData.Use() per contrassegnare l'evento come usato. Ciò impedirà ad altri GameObject di ricevere l'evento di input corrente, ad eccezione dei gestori di input globali.

Nota

Un componente che chiama il Use() metodo interromperà la ricezione di altri GameObjects. Tuttavia, altri componenti nel GameObject corrente riceveranno comunque l'evento di input e attiveranno tutte le funzioni di interfaccia correlate.

Vedi anche