Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
- Das MRTK-Eingabesystem erkennt, dass ein Eingabeereignis aufgetreten ist.
- Das MRTK-Eingabesystem löst die relevante Schnittstellenfunktion des Eingabeereignisses für alle registrierten globalen Eingabehandler aus.
- Für jeden aktiven Zeiger, der beim Eingabesystem registriert ist:
- Das Eingabesystem bestimmt, welches GameObject für den aktuellen Zeiger im Fokus steht.
- Das Eingabesystem verwendet das Ereignissystem von Unity , um die relevante Schnittstellenfunktion für alle übereinstimmenden Komponenten auf dem fokussierten GameObject auszulösen.
- 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.
- 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 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.