Événements d’entrée — MRTK2
La liste ci-dessous présente toutes les interfaces d’événement d’entrée disponibles à implémenter par un composant MonoBehaviour personnalisé. Ces interfaces seront appelées par le système d’entrée MRTK pour gérer la logique d’application personnalisée en fonction des interactions d’entrée utilisateur. Les événements d’entrée de pointeur sont gérés légèrement différemment des types d’événements d’entrée standard ci-dessous.
Important
Par défaut, un script reçoit des événements d’entrée uniquement s’il s’agit du GameObject en focus par un pointeur ou un parent d’un GameObject en focus.
Handler | Événements | Description |
---|---|---|
IMixedRealitySourceStateHandler |
Source détectée / perdue | Déclenché lorsqu’une source d’entrée est détectée/perdue, comme lorsqu’une main articulée est détectée ou qu’une trace de est perdue. |
IMixedRealitySourcePoseHandler |
Pose de la source modifiée | Déclenché lors des modifications de pose source. La pose source représente la pose générale de la source d’entrée. Des poses spécifiques, comme la prise ou la pose de pointeur dans un contrôleur à six DOF, peuvent être obtenues via IMixedRealityInputHandler<MixedRealityPose> . |
IMixedRealityInputHandler |
Entrée bas/haut | Déclenché lors des modifications apportées aux entrées binaires telles que les boutons. |
IMixedRealityInputHandler<T> |
Entrée modifiée | Déclenché lors des modifications apportées aux entrées du type donné. T peut prendre les valeurs suivantes : - float (par exemple retourne le déclencheur analogique) - Vector2 (par exemple retourne la direction du bâton de commande du boîtier de commande) - Vector3 (par exemple, la position de retour de l’appareil suivi) - Quaternion (par exemple retourne l’orientation de l’appareil suivi) - MixedRealityPose (par exemple, retourne un appareil entièrement suivi) |
IMixedRealitySpeechHandler |
Mot clé speech reconnu | Déclenché lors de la reconnaissance de l’un des mots clés configurés dans le profil commandes vocales. |
IMixedRealityDictationHandler |
Dictation Hypothèse Résultats Terminé Erreur |
Déclenché par les systèmes de dictée pour signaler les résultats d’une session de dictée. |
IMixedRealityGestureHandler |
Événements de mouvement sur : Démarré Mis à jour Effectué Opération annulée |
Déclenché lors de la détection des mouvements. |
IMixedRealityGestureHandler<T> |
Mouvement mis à jour/terminé | Déclenché lors de la détection de mouvements contenant des données supplémentaires du type donné. Pour plus d’informations sur les valeurs possibles pour T, consultez événements de mouvement. |
IMixedRealityHandJointHandler |
Jointures de main mises à jour | Levé par des contrôleurs de main articulés lorsque les articulations de main sont mises à jour. |
IMixedRealityHandMeshHandler |
Maillage de main mis à jour | Déclenché par des contrôleurs de main articulés lorsqu’un maillage de main est mis à jour. |
IMixedRealityInputActionHandler |
Action démarrée/terminée | Déclencher pour indiquer le début et la fin de l’action pour les entrées mappées aux actions. |
Événements d’entrée en action
Au niveau du script, les événements d’entrée peuvent être consommés en implémentant l’une des interfaces de gestionnaire d’événements indiquées dans le tableau ci-dessus. Lorsqu’un événement d’entrée se déclenche via une interaction utilisateur, les opérations suivantes se produisent :
- Le système d’entrée MRTK reconnaît qu’un événement d’entrée s’est produit.
- Le système d’entrée MRTK déclenche la fonction d’interface appropriée de l’événement d’entrée sur tous les gestionnaires d’entrée globaux inscrits
- Pour chaque pointeur actif inscrit auprès du système d’entrée :
- Le système d’entrée détermine quel GameObject est en focus pour le pointeur actuel.
- Le système d’entrée utilise le système d’événements d’Unity pour déclencher la fonction d’interface appropriée pour tous les composants correspondants sur le GameObject ciblé.
- Si, à un moment donné, un événement d’entrée a été marqué comme étant utilisé, le processus se termine et aucun autre GameObjects ne reçoit de rappels.
- Exemple : les composants implémentant l’interface
IMixedRealitySpeechHandler
seront recherchés lorsqu’une commande vocale est reconnue. - Remarque : le système d’événements Unity va buller pour rechercher le GameObject parent si aucun composant correspondant à l’interface souhaitée n’est trouvé sur le GameObject actuel.
- Exemple : les composants implémentant l’interface
- Si aucun gestionnaire d’entrée global n’est inscrit et qu’aucun GameObject n’est trouvé avec un composant/interface correspondant, le système d’entrée appelle chaque gestionnaire d’entrée inscrit de secours
Notes
Les événements d’entrée de pointeur sont gérés d’une manière légèrement différente des interfaces d’événement d’entrée répertoriées ci-dessus. En particulier, les événements d’entrée de pointeur sont gérés uniquement par le GameObject en focus par le pointeur qui a déclenché l’événement d’entrée, ainsi que par tous les gestionnaires d’entrée globaux. Les événements d’entrée réguliers sont gérés par GameObjects dans le focus pour tous les pointeurs actifs.
Exemple d’interface d’événement d’entrée
Le code ci-dessous illustre l’utilisation de l’interface IMixedRealitySpeechHandler
. Lorsque l’utilisateur indique les mots « plus petit » ou « plus grand » tout en se concentrant sur un GameObject avec cette ShowHideSpeechHandler
classe, le GameObject se met à l’échelle de moitié ou de deux fois plus.
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;
}
}
}
Notes
IMixedRealitySpeechHandler
les événements d’entrée nécessitent que les mots clés souhaités soient préinscrits dans le profil de commandes vocales MRTK.
S’inscrire aux événements d’entrée globale
Pour créer un composant qui écoute les événements d’entrée globaux, sans tenir compte de ce que GameObject peut être mis en avant, un composant doit s’inscrire auprès du système d’entrée. Une fois inscrite, toutes les instances de ce MonoBehaviour recevront des événements d’entrée, ainsi que tous les GameObjects actuellement en cours de focus et d’autres écouteurs inscrits globaux.
Si un événement d’entrée a été marqué comme étant utilisé, les gestionnaires inscrits globaux recevront toujours des rappels. Toutefois, aucun GameObjects ciblé ne recevra l’événement.
Exemple d’inscription d’entrée 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);
}
}
}
S’inscrire aux événements d’entrée de secours
Les gestionnaires d’entrées de secours sont similaires aux gestionnaires d’entrée globaux inscrits, mais sont traités comme un dernier recours pour la gestion des événements d’entrée. Ce n’est que si aucun gestionnaire d’entrée global n’a été trouvé et qu’aucun GameObject n’est mis en évidence que les gestionnaires d’entrée de secours seront exploités.
Exemple de gestionnaire d’entrée de secours
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)
{
...
}
}
Comment arrêter les événements d’entrée
Chaque interface d’événement d’entrée fournit un BaseInputEventData
objet de données en tant que paramètre à chaque fonction de l’interface. Cet objet de données d’événement s’étend du propre AbstractEventData
unity.
Pour empêcher la propagation d’un événement d’entrée par le biais de son exécution comme indiqué ci-après, un composant peut appeler AbstractEventData.Use()
pour marquer l’événement comme étant utilisé. Cela empêche tout autre GameObjects de recevoir l’événement d’entrée actuel, à l’exception des gestionnaires d’entrée globaux.
Notes
Un composant qui appelle la Use()
méthode empêche d’autres GameObjects de la recevoir. Toutefois, les autres composants du GameObject actuel recevront toujours l’événement d’entrée et déclencheront toutes les fonctions d’interface associées.