É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 :

  1. Le système d’entrée MRTK reconnaît qu’un événement d’entrée s’est produit.
  2. 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
  3. Pour chaque pointeur actif inscrit auprès du système d’entrée :
    1. Le système d’entrée détermine quel GameObject est en focus pour le pointeur actuel.
    2. 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é.
    3. 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.
  4. 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 AbstractEventDataunity.

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.

Voir aussi