Eingabeereignisse – MRTK2

Die folgende Liste enthält alle verfügbaren Eingabeereignisschnittstellen, die von einer benutzerdefinierten MonoBehaviour-Komponente implementiert werden sollen. Diese Schnittstellen werden vom MRTK-Eingabesystem aufgerufen, um benutzerdefinierte App-Logik basierend auf Benutzereingabeinteraktionen zu verarbeiten. Zeigereingabeereignisse werden etwas anders behandelt als die unten angegebenen Standardeingabeereignistypen.

Wichtig

Standardmäßig empfängt ein Skript eingabeereignisse nur, wenn es sich um das GameObject im Fokus durch einen Zeiger oder ein übergeordnetes GameObject im Fokus handelt.

Handler Events BESCHREIBUNG
IMixedRealitySourceStateHandler Quelle erkannt/verloren Wird ausgelöst, wenn eine Eingabequelle erkannt/verloren geht, z. B. wenn eine artikulierte Hand erkannt wird oder den Überblick verloren hat.
IMixedRealitySourcePoseHandler Quellpose geändert Wird bei Änderungen der Quellposition ausgelöst. Die Quellposition stellt die allgemeine Pose der Eingabequelle dar. Bestimmte Posen, z. B. die Griff- oder Zeigerposition in einem sechs DOF-Controller, können über IMixedRealityInputHandler<MixedRealityPose>abgerufen werden.
IMixedRealityInputHandler Eingabe nach unten/nach oben Wird bei Änderungen an binären Eingaben wie Schaltflächen ausgelöst.
IMixedRealityInputHandler<T> Eingabe geändert Wird bei Änderungen an Eingaben des angegebenen Typs ausgelöst. T kann die folgenden Werte annehmen:
- float (z. B. gibt einen analogen Trigger zurück)
- Vector2 (gibt z. B. die Richtung des Gamepad-Daumensticks zurück)
- Vector3 (z.B. Rückgabeposition des nachverfolgten Geräts)
- Quaternion (z. B. gibt die Ausrichtung des nachverfolgten Geräts zurück)
- MixedRealityPose (gibt z. B. vollständig nachverfolgtes Gerät zurück)
IMixedRealitySpeechHandler Speech-Schlüsselwort erkannt Wird beim Erkennen eines der Schlüsselwörter ausgelöst, die im Sprachbefehlsprofil konfiguriert sind.
IMixedRealityDictationHandler Diktieren
Hypothesis
Ergebnis
Abgeschlossen
Fehler
Wird von Diktiersystemen ausgelöst, um die Ergebnisse einer Diktiersitzung zu melden.
IMixedRealityGestureHandler Gestenereignisse in:
Gestartet
Aktualisiert
Abgeschlossen
Canceled
Wird bei der Gestenerkennung ausgelöst.
IMixedRealityGestureHandler<T> Geste aktualisiert/abgeschlossen Wird bei der Erkennung von Gesten ausgelöst, die zusätzliche Daten des angegebenen Typs enthalten. Details zu möglichen Werten für T finden Sie unter Gestenereignisse.
IMixedRealityHandJointHandler Handgelenke aktualisiert Wird von handgelenkten Controllern ausgelöst, wenn Handgelenke aktualisiert werden.
IMixedRealityHandMeshHandler Handgitter aktualisiert Wird von handgelenkten Controllern ausgelöst, wenn ein Handgitter aktualisiert wird.
IMixedRealityInputActionHandler Aktion gestartet/beendet Auslösen, um den Start und das Ende der Aktion für Eingaben anzugeben, die Aktionen zugeordnet sind.

Eingabeereignisse in Aktion

Auf Skriptebene können Eingabeereignisse genutzt werden, indem eine der in der obigen Tabelle gezeigten Ereignishandlerschnittstellen implementiert wird. Wenn ein Eingabeereignis über eine Benutzerinteraktion ausgelöst wird, erfolgt Folgendes:

  1. Das MRTK-Eingabesystem erkennt, dass ein Eingabeereignis aufgetreten ist.
  2. Das MRTK-Eingabesystem löst die relevante Schnittstellenfunktion des Eingabeereignisses für alle registrierten globalen Eingabehandler aus.
  3. Für jeden aktiven Zeiger, der beim Eingabesystem registriert ist:
    1. Das Eingabesystem bestimmt, welches GameObject für den aktuellen Zeiger im Fokus steht.
    2. Das Eingabesystem verwendet das Ereignissystem von Unity , um die relevante Schnittstellenfunktion für alle übereinstimmenden Komponenten auf dem fokussierten GameObject auszulösen.
    3. Wenn zu irgendeinem Zeitpunkt ein Eingabeereignis als verwendet markiert wurde, wird der Prozess beendet, und es werden keine weiteren GameObjects-Rückrufe empfangen.
      • Beispiel: Komponenten, die die Schnittstelle IMixedRealitySpeechHandler implementieren, werden gesucht, wenn ein Sprachbefehl erkannt wird.
      • Hinweis: Das Unity-Ereignissystem durchsucht das übergeordnete GameObject, wenn im aktuellen GameObject keine Komponenten gefunden werden, die der gewünschten Schnittstelle entsprechen.
  4. Wenn keine globalen Eingabehandler registriert sind und kein GameObject mit einer übereinstimmenden Komponente/Schnittstelle gefunden wird, ruft das Eingabesystem jeden fallback-registrierten Eingabehandler auf.

Hinweis

Zeigereingabeereignisse werden etwas anders behandelt als die oben aufgeführten Eingabeereignisschnittstellen. Insbesondere Zeigereingabeereignisse werden nur vom GameObject im Fokus durch den Zeiger behandelt, der das Eingabeereignis ausgelöst hat, sowie alle globalen Eingabehandler. Reguläre Eingabeereignisse werden von GameObjects im Fokus für alle aktiven Zeiger behandelt.

Beispiel für die Eingabeereignisschnittstelle

Der folgende Code veranschaulicht die Verwendung der IMixedRealitySpeechHandler -Schnittstelle. Wenn der Benutzer die Wörter "kleiner" oder "größer" sagt, während er sich auf ein GameObject mit dieser ShowHideSpeechHandler Klasse konzentriert, skaliert sich das GameObject selbst um die Hälfte oder doppelt so viel.

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

Hinweis

IMixedRealitySpeechHandler Eingabeereignisse erfordern, dass die gewünschten Schlüsselwörter im MRTK-Sprachbefehlsprofil vorab registriert sind.

Registrieren für globale Eingabeereignisse

Um eine Komponente zu erstellen, die auf globale Eingabeereignisse lauscht und dabei nicht berücksichtigt, was GameObject im Fokus hat, muss sich eine Komponente beim Eingabesystem registrieren. Nach der Registrierung erhalten alle Instanzen dieses MonoBehaviour Eingabeereignisse zusammen mit allen GameObjects, die sich derzeit im Fokus befinden, und anderen global registrierten Listenern.

Wenn ein Eingabeereignis als verwendet markiert wurde, erhalten global registrierte Handler weiterhin alle Rückrufe. Das Ereignis wird jedoch von keinem fokussierten GameObjects empfangen.

Beispiel für die globale Eingaberegistrierung

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

Registrieren für Fallbackeingabeereignisse

Fallbackeingabehandler ähneln registrierten globalen Eingabehandlern, werden aber als letztes Mittel für die Verarbeitung von Eingabeereignissen behandelt. Nur wenn keine globalen Eingabehandler gefunden wurden und keine GameObjects im Fokus sind, werden Fallbackeingabehandler genutzt.

Beispiel für Fallbackeingabehandler

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

Beenden von Eingabeereignissen

Jede Eingabeereignisschnittstelle stellt ein BaseInputEventData Datenobjekt als Parameter für jede Funktion auf der Schnittstelle bereit. Dieses Ereignisdatenobjekt erstreckt sich über unity-eigene AbstractEventData.

Um zu verhindern, dass ein Eingabeereignis wie beschrieben durch seine Ausführung weitergegeben wird, kann eine Komponente aufrufen AbstractEventData.Use() , um das Ereignis als verwendet zu markieren. Dadurch wird verhindert, dass alle anderen GameObjects das aktuelle Eingabeereignis empfangen, mit Ausnahme von globalen Eingabehandlern.

Hinweis

Eine Komponente, die die Use() -Methode aufruft, verhindert, dass andere GameObjects sie empfangen. Andere Komponenten im aktuellen GameObject empfangen jedoch weiterhin das Eingabeereignis und lösen alle zugehörigen Schnittstellenfunktionen aus.

Weitere Informationen