Eingabeereignisse – MRTK2

In der nachstehenden Liste werden alle verfügbaren Eingabeereignisschnittstellen beschrieben, die von einer benutzerdefinierten MonoBehaviour-Komponente implementiert werden sollen. Diese Schnittstellen werden vom MRTK-Eingabesystem aufgerufen, um benutzerdefinierte App-Logik basierend auf Benutzereingabeinteraktionen zu behandeln. Zeigereingabeereignisse werden geringfügig anders behandelt als die unten aufgeführten Standardeingabeereignistypen.

Wichtig

Standardmäßig empfängt ein Skript Eingabeereignisse nur, wenn es sich bei dem GameObject-Fokus um einen Zeiger oder ein übergeordnetes Element eines GameObject-Objekts 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 oder verloren geht.
IMixedRealitySourcePoseHandler Quellpose geändert Ausgelöst auf Quellposenänderungen. Die Quellpose stellt die allgemeine Pose der Eingabequelle dar. Bestimmte Posen, z. B. die Griff- oder Zeigerpose in einem sechs DOF-Controller, können über IMixedRealityInputHandler<MixedRealityPose>erhalten 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. Die folgenden Werte können nicht verwendet werden:
- float (z. B. analoger Trigger)
- Vector2 (z. B. gibt Gamepad-Daumenstickrichtung zurück)
- Vector3 (z. B. Rückgabeposition des nachverfolgten Geräts)
- Quaternion (z. B. gibt die Ausrichtung des nachverfolgten Geräts zurück)
- MixedRealityPose (z. B. gibt vollständig nachverfolgtes Gerät) zurück.
IMixedRealitySpeechHandler Sprachwort erkannt Wird bei der Erkennung eines der Schlüsselwörter ausgelöst, die im Sprachbefehlsprofil konfiguriert sind.
IMixedRealityDictationHandler Diktieren
Hypothesis
Ergebnis
Abgeschlossen
Fehler
Ausgelöst durch Diktiersysteme, um die Ergebnisse einer Diktiersitzung zu melden.
IMixedRealityGestureHandler Gestenereignisse auf:
Gestartet
Aktualisiert
Abgeschlossen
Canceled
Wird bei der Gestenerkennung ausgelöst.
IMixedRealityGestureHandler<T> Gesten 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 durch gelenkige Handcontroller ausgelöst, wenn Handgelenke aktualisiert werden.
IMixedRealityHandMeshHandler Hand Mesh Aktualisiert Ausgelöst durch artikulierte Handcontroller, wenn ein Handgitter aktualisiert wird.
IMixedRealityInputActionHandler Aktion gestartet / beendet Auslösen, um den Aktionsstart und das Ende für Eingaben anzuzeigen, 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, findet Folgendes statt:

  1. Das MRTK-Eingabesystem erkennt, dass ein Eingabeereignis aufgetreten ist.
  2. Das MRTK-Eingabesystem löst die relevante Schnittstellenfunktion des Eingabeereignisses auf alle registrierten globalen Eingabehandler aus.
  3. Für jeden aktiven Zeiger, der mit dem Eingabesystem registriert ist:
    1. Das Eingabesystem bestimmt, welche GameObject für den aktuellen Zeiger im Fokus steht.
    2. Das Eingabesystem verwendet das Unity-Ereignissystem , um die relevante Schnittstellenfunktion für alle übereinstimmenden Komponenten für das fokussierte GameObject zu auslösen.
    3. Wenn an irgendeinem Punkt 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 durchsucht, wenn ein Sprachbefehl erkannt wird.
      • Hinweis: Das Unity-Ereignissystem wird angezeigt, um das übergeordnete GameObject zu durchsuchen, wenn keine Komponenten, die der gewünschten Schnittstelle entsprechen, auf dem aktuellen GameObject gefunden werden.
  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 leicht anders behandelt als die oben aufgeführten Eingabeereignisschnittstellen. Insbesondere werden Zeigereingabeereignisse nur vom GameObject im Fokus vom Zeiger behandelt, der das Eingabeereignis ausgelöst hat – sowie alle globalen Eingabehandler. Regelmäßige 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 mit dieser ShowHideSpeechHandler Klasse auf ein GameObject konzentriert, skaliert sich das GameObject um halb 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 vorinstalliert sind.

Registrieren für globale Eingabeereignisse

Um eine Komponente zu erstellen, die auf globale Eingabeereignisse lauscht, muss eine Komponente sich mit dem Eingabesystem registrieren. Nach der Registrierung erhalten alle Instanzen dieses MonoBehaviour Eingabeereignisse zusammen mit allen GameObject(n) derzeit im Fokus und anderen global registrierten Listenern.

Wenn ein Eingabeereignis als verwendet markiert wurde, erhalten globale registrierte Handler weiterhin alle Rückrufe. Es wird jedoch kein fokussiertes GameObjects das Ereignis 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 Eingabeereignisbehandlung 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)
    {
        ...
    }
}

So beenden Sie Eingabeereignisse

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

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

Hinweis

Eine Komponente, die die Use() Methode aufruft, verhindert, dass andere GameObjects es empfangen. Andere Komponenten auf dem aktuellen GameObject erhalten jedoch weiterhin das Eingabeereignis und auslösen alle zugehörigen Schnittstellenfunktionen.

Siehe auch