Comment ajouter une interactivité proche — MRTK2

Les interactions proches se présentent sous la forme de touches et de saisies. Les événements tactiles et de récupération sont déclenchés en tant qu’événements de pointeur par PokePointer et SpherePointer, respectivement.

Trois étapes clés sont nécessaires pour écouter les événements d’entrée tactiles et/ou récupérer sur un GameObject particulier.

  1. Vérifiez que le pointeur approprié est inscrit dans le main profil de configuration MRTK.
  2. Vérifiez que le GameObject souhaité dispose du composant de saisie ou de script tactile approprié et Unity Collider.
  3. Implémentez une interface de gestionnaire d’entrée sur un script attaché au GameObject souhaité pour écouter les événements de saisie ou d’interaction tactile .

Ajouter des interactions de récupération

  1. Vérifiez qu’un SpherePointer est inscrit dans le profil de pointeur MRTK.

    Le profil MRTK par défaut et le profil de HoloLens 2 par défaut contiennent déjà un SpherePointer. Vous pouvez confirmer qu’un SpherePointer sera créé en sélectionnant le profil de configuration MRTK et en accédant àOptions depointeur>d’entrée>. Le préfabriqué par défaut GrabPointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) doit être répertorié avec un type de contrôleur de main articulée. Un préfabriqué personnalisé peut être utilisé tant qu’il implémente la SpherePointer classe .

    Exemple de profil de pointeur de récupération

    Le pointeur de saisie par défaut interroge les objets à proximité dans un cône autour du point de récupération pour qu’il corresponde à l’interface de HoloLens 2 par défaut.

    Pointeur d’accroche conique

  2. Sur le GameObject qui doit être saisi, ajoutez un NearInteractionGrabbable, ainsi qu’un collider.

    Assurez-vous que la couche du GameObject est sur une couche pouvant être saisie. Par défaut, toutes les couches, à l’exception de Spatial Awareness et Ignore Raycasts , peuvent être saisies. Découvrez quelles couches peuvent être saisies en inspectant les masques de couche de saisie dans votre préfabriqué GrabPointer .

  3. Sur le GameObject ou l’un de ses ancêtres, ajoutez un composant de script qui implémente l’interface IMixedRealityPointerHandler . Tout ancêtre de l’objet avec le NearInteractionGrabbable peut également recevoir des événements de pointeur.

Exemple de code de récupération

Vous trouverez ci-dessous un script qui imprime si un événement est une interaction tactile ou une saisie. Dans la fonction d’interface IMixedRealityPointerHandler appropriée, vous pouvez examiner le type de pointeur qui déclenche cet événement via le MixedRealityPointerEventData. Si le pointeur est un SpherePointer, l’interaction est une saisie.

public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
    public void OnPointerDown(MixedRealityPointerEventData eventData)
    {
        if (eventData.Pointer is SpherePointer)
        {
            Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
        }
        if (eventData.Pointer is PokePointer)
        {
            Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
        }
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
    public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
    public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}

Ajouter des interactions tactiles

Le processus d’ajout d’interactions tactiles sur les éléments UnityUI est différent de celui des GameObjects 3D vanilla. Vous pouvez passer à la section suivante, Interface utilisateur Unity, pour activer les composants de l’interface utilisateur Unity.

Toutefois, pour les deux types d’éléments d’expérience utilisateur, vérifiez qu’un PokePointer est inscrit dans le profil de pointeur MRTK.

Le profil MRTK par défaut et le profil de HoloLens 2 par défaut contiennent déjà un PokePointer. Vous pouvez confirmer qu’un PokePointer sera créé en sélectionnant le profil de configuration MRTK et accédez àOptions depointeur>d’entrée>. Le préfabriqué par défaut PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) doit être répertorié avec un type de contrôleur de main articulée. Un préfabriqué personnalisé peut être utilisé tant qu’il implémente la PokePointer classe .

Exemple de profil de pointeur Poke

GameObjects 3D

Il existe deux façons différentes d’ajouter des interactions tactiles aux GameObjects 3D, selon que votre objet 3D ne doit avoir qu’un seul plan tactile, ou s’il doit être tactile en fonction de son collisionneur entier. La première méthode est généralement sur les objets avec BoxColliders, où il est souhaité qu’une seule face du collider réagisse aux événements tactiles. L’autre concerne les objets qui doivent être tactiles de n’importe quelle direction en fonction de leur collisionneur.

Toucher d’un seul visage

Cela est utile pour activer les situations où un seul visage doit être tactile. Cette option suppose que l’objet de jeu a un BoxCollider. il est possible de l’utiliser avec des objets non BoxCollider, auquel cas les propriétés « Limites » et « Centre local » sont définies manuellement pour configurer le plan tactile (c’est-à-dire que les limites doivent être définies sur une valeur différente de zéro).

  1. Sur le GameObject qui doit être tactile, ajoutez un BoxCollider et un NearInteractionTouchable composant.

    1. Définissez Événements sur Réceptiontactile si vous utilisez l’interface IMixedRealityTouchHandler dans votre script de composant ci-dessous.

    2. Cliquez sur Corriger les limites et centre de correction

    NearInteractionTouchable Setup

  2. Sur cet objet ou l’un de ses ancêtres, ajoutez un composant de script qui implémente lel’interface IMixedRealityTouchHandler. Tout ancêtre de l’objet avec le NearInteractionTouchable peut également recevoir des événements de pointeur.

Notes

Dans l’affichage de la scène de l’éditeur avec l’objet GameObject NearInteractionTouchable sélectionné, notez un carré de contour blanc et une flèche. La flèche pointe vers l’avant de l’élément tactile. Le collidable ne sera tactile qu’à partir de cette direction. Pour rendre un collider tactile dans toutes les directions, consultez la section sur la touche de collision arbitraire. PrèsInteractionTouchable Gizmos

Interaction tactile de collisionneur arbitraire

Cela est utile pour permettre les situations où l’objet de jeu doit être tactile le long de sa face entière du collisionneur. Par exemple, cela peut être utilisé pour activer des interactions tactiles pour un objet avec un SphereCollider, où le collisionneur entier doit être tactile.

  1. Sur le GameObject qui doit être tactile, ajoutez un collider et un NearInteractionTouchableVolume composant.

    1. Définissez Événements sur Réceptiontactile si vous utilisez l’interface IMixedRealityTouchHandler dans votre script de composant ci-dessous.
  2. Sur cet objet ou l’un de ses ancêtres, ajoutez un composant de script qui implémente lel’interface IMixedRealityTouchHandler. Tout ancêtre de l’objet avec le NearInteractionTouchable peut également recevoir des événements de pointeur.

Interface utilisateur Unity

  1. Ajoutez/vérifiez qu’il existe un canevas UnityUI dans la scène.

  2. Sur le GameObject qui doit être tactile, ajoutez un NearInteractionTouchableUnityUI composant.

    1. Définissez Événements sur Réceptiontactile si vous utilisez l’interface IMixedRealityTouchHandler dans votre script de composant ci-dessous.
  3. Sur cet objet ou l’un de ses ancêtres, ajoutez un composant de script qui implémente l’interface IMixedRealityTouchHandler . Tout ancêtre de l’objet avec le NearInteractionTouchableUnityUI peut également recevoir des événements de pointeur.

Important

Les objets peuvent ne pas se comporter comme prévu s’ils se trouvent sur des objets de canevas qui se chevauchent. Pour garantir un comportement cohérent, ne chevauchez jamais les objets canevas de votre scène.

Important

Sur le NearInteractionTouchable composant de script, pour la propriété Events to Receive , il existe deux options : Pointeur et Touch. Définissez Événements sur Recevoir sur Pointeur si vous utilisez l’interface IMixedRealityPointerHandler et sur Touch si vous utilisez l’interface IMixedRealityTouchHandler dans votre script de composant qui répond/gère les événements d’entrée.

Exemple de code tactile

Le code ci-dessous illustre un MonoBehaviour qui peut être attaché à un GameObject avec un NearInteractionTouchable composant de variante et répondre aux événements d’entrée tactile.

public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler
{
    public void OnTouchStarted(HandTrackingInputEventData eventData)
    {
        string ptrName = eventData.Pointer.PointerName;
        Debug.Log($"Touch started from {ptrName}");
    }
    public void OnTouchCompleted(HandTrackingInputEventData eventData) {}
    public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
}

Exemples de script d’interaction proche

Événements tactiles

Cet exemple crée un cube, le rend tactile et change de couleur au toucher.

public static void MakeChangeColorOnTouch(GameObject target)
{
    // Add and configure the touchable
    var touchable = target.AddComponent<NearInteractionTouchableVolume>();
    touchable.EventsToReceive = TouchableEventType.Pointer;

    var material = target.GetComponent<Renderer>().material;
    // Change color on pointer down and up
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) => material.color = Color.green);
    pointerHandler.OnPointerUp.AddListener((e) => material.color = Color.magenta);
}

Récupérer des événements

L’exemple ci-dessous montre comment faire glisser un GameObject. Suppose que l’objet de jeu a un collider dessus.

public static void MakeNearDraggable(GameObject target)
{
    // Instantiate and add grabbable
    target.AddComponent<NearInteractionGrabbable>();

    // Add ability to drag by re-parenting to pointer object on pointer down
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = ((SpherePointer)(e.Pointer)).transform;
        }
    });
    pointerHandler.OnPointerUp.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = null;
        }
    });
}

API utiles

Voir aussi