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:
- Das MRTK-Eingabesystem erkennt, dass ein Eingabeereignis aufgetreten ist.
- Das MRTK-Eingabesystem löst die relevante Schnittstellenfunktion des Eingabeereignisses auf alle registrierten globalen Eingabehandler aus.
- Für jeden aktiven Zeiger, der mit dem Eingabesystem registriert ist:
- Das Eingabesystem bestimmt, welche GameObject für den aktuellen Zeiger im Fokus steht.
- Das Eingabesystem verwendet das Unity-Ereignissystem , um die relevante Schnittstellenfunktion für alle übereinstimmenden Komponenten für das fokussierte GameObject zu auslösen.
- 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.
- Beispiel: Komponenten, die die Schnittstelle
- 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.