Événements d’entrée — MRTK2

La liste ci-dessous présente toutes les interfaces d’événements 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 de GameObject au 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 perdue.
IMixedRealitySourcePoseHandler Pose source modifiée Déclenché sur les modifications de la pose source. La pose source représente la pose générale de la source d’entrée. Des poses spécifiques, comme la poignée ou la pose de pointeur dans un six contrôleurS DOF, peuvent être obtenues via IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Entrée vers le bas / haut Déclenché sur les modifications apportées aux entrées binaires telles que les boutons.
IMixedRealityInputHandler<T> Entrée modifiée Déclenché sur les modifications apportées aux entrées du type donné. T peut prendre les valeurs suivantes :
- float (par exemple retourne un déclencheur analogique)
- Vector2 (par exemple retourne le sens du pouce du boîtier de commande)
- Vector3 (par exemple, 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é sur la reconnaissance de l’un des mots clés configurés dans le profil commandes Speech.
IMixedRealityDictationHandler Dictation
Hypothèse
Résultats
Terminé
Erreur
Déclenché par des 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é sur la détection des mouvements.
IMixedRealityGestureHandler<T> Mouvement mis à jour / Terminé Déclenché lors de la détection des mouvements contenant des données supplémentaires du type donné. Pour plus d’informations sur les valeurs possibles pour T, consultez les événements de mouvement.
IMixedRealityHandJointHandler Jointures de main mises à jour Déclenché par des contrôleurs de main articulés lorsque les articulations de main sont mises à jour.
IMixedRealityHandMeshHandler Mesh 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éclenchez 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 éléments suivants 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 Unity pour déclencher la fonction d’interface appropriée pour tous les composants correspondants sur gameObject ciblé.
    3. Si à un moment donné, un événement d’entrée a été marqué comme utilisé, le processus se termine et aucun autre GameObjects ne reçoit de rappels.
      • Exemple : Les composants implémentant l’interface IMixedRealitySpeechHandler sont recherchés lorsqu’une commande vocale est reconnue.
      • Remarque : Le système d’événements Unity bulle jusqu’à rechercher le gameObject parent si aucun composant correspondant à l’interface souhaitée est trouvé sur l’objet 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 de manière légèrement différente des interfaces d’événements d’entrée répertoriées ci-dessus. En particulier, les événements d’entrée de pointeur sont gérés uniquement par gameObject au focus par le pointeur qui a déclenché l’événement d’entrée, ainsi que tous les gestionnaires d’entrée globaux. Les événements d’entrée réguliers sont gérés par GameObjects au 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 petits » ou « plus grands » tout en se concentrant sur un GameObject avec cette ShowHideSpeechHandler classe, gameObject se met à l’échelle de moitié ou 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 speech MRTK.

S’inscrire aux événements d’entrée globaux

Pour créer un composant qui écoute les événements d’entrée globaux, en ignorant ce que GameObject peut être en focus, un composant doit s’inscrire auprès du système d’entrée. Une fois inscrit, toutes les instances de ce MonoBehaviour recevront des événements d’entrée ainsi que n’importe quel GameObject(s) actuellement en focus et d’autres écouteurs inscrits au niveau mondial.

Si un événement d’entrée a été marqué comme utilisé, les gestionnaires inscrits globaux reçoivent toujours tous les 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ée 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. Uniquement si aucun gestionnaire d’entrée global n’a été trouvé et qu’aucun GameObjects n’est en focus, les gestionnaires d’entrée de secours sont 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 de la propre AbstractEventDataunité .

Pour empêcher la propagation d’un événement d’entrée par le biais de son exécution comme indiqué, un composant peut appeler AbstractEventData.Use() pour marquer l’événement comme utilisé. Cela empêchera les autres 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 le recevoir. Toutefois, d’autres composants du GameObject actuel reçoivent toujours l’événement d’entrée et déclenchent toutes les fonctions d’interface associées.

Voir aussi