Comment ajouter une interactivité proche — MRTK2

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

Trois étapes clés sont nécessaires pour écouter les événements d’entrée tactile et/ou saisir des entrées sur un GameObject particulier.

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

Ajouter des interactions de saisie

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

    Le profil MRTK par défaut et le profil par défaut HoloLens 2 contiennent déjà un SpherePointer. Vous pouvez confirmer qu’un SpherePointer est créé en sélectionnant le profil de configuration MRTK et en accédant auxoptions depointeur>d’entrée>. Le préfab 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.

    Grab Pointer Profile Example

    Requêtes de pointeur de récupération par défaut pour les objets proches dans un cône autour du point de saisie pour correspondre à l’interface Hololens 2 par défaut.

    Conical Grab Pointer

  2. Sur gameObject qui doit être saisi, ajoutez un NearInteractionGrabbable, ainsi qu’un collisionneur.

    Assurez-vous que la couche du GameObject est sur une couche pouvant être prise. Par défaut, toutes les couches, à l’exception de la sensibilisation spatiale et de l’ignorer, sont accessibles. Découvrez quelles couches sont récupérables en inspectant les masques de couche de capture dans votre préfabriqué GrabPointer .

  3. Sur 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 celui-ci NearInteractionGrabbable peut également recevoir des événements de pointeur.

Exemple de code de récupération

Vous trouverez ci-dessous un script qui imprimera si un événement est une touche ou une capture. Dans la fonction d’interface IMixedRealityPointerHandler pertinente, on peut examiner le type de pointeur qui déclenche cet événement via le MixedRealityPointerEventData. Si le pointeur est un SpherePointer, l’interaction est une capture.

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 de la vanille GameObjects. Vous pouvez passer à la section suivante, l’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 du pointeur MRTK.

Le profil MRTK par défaut et le profil par défaut HoloLens 2 contiennent déjà un PokePointer. Vous pouvez confirmer qu’un PokePointer sera créé en sélectionnant le profil de configuration MRTK et accédez auxoptions depointeur>d’entrée>. Le préfab 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.

Poke Pointer Profile Example

GameObjects 3D

Il existe deux façons d’ajouter des interactions tactiles à 3D GameObjects, 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 façon est généralement sur les objets avec BoxColliders, où il est souhaité n’avoir qu’un seul visage du collider réagir aux événements tactiles. L’autre est pour les objets qui doivent être tactiles de n’importe quelle direction en fonction de leur collisionneur.

Toucher d’un visage unique

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

  1. Sur gameObject qui doit être tactile, ajoutez un composant BoxCollider et un composant [NearInteractionTouchable] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable).

    1. Définissez les événements surTouch si vous utilisez l’interface [IMixedRealityTouchHandler] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) dans votre script de composant ci-dessous.

    2. Cliquez sur Limites de correction 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] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) peut également recevoir des événements de pointeur.

Notes

Dans l’affichage de scène de l’éditeur avec l’objet NearInteractionTouchable GameObject sélectionné, notez un contour blanc carré et une flèche. La flèche pointe vers le « front » de l’élément tactile. Le collidable ne sera tactile que de cette direction. Pour rendre un collisionneur tactile à partir de toutes les directions, voir la section sur la touche de collisionneur arbitraire. NearInteractionTouchable Gizmos

Contact de collisionneur arbitraire

Cela est utile pour permettre aux situations où l’objet de jeu doit être tactile le long de son visage de collisionneur entier. Par exemple, cela peut être utilisé pour activer les interactions tactiles pour un objet avec un SphereCollider, où l’ensemble du collisionneur doit être tactile.

  1. Sur gameObject qui doit être tactile, ajoutez un collider et un composant [NearInteractionTouchableVolume] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchableVolume).

    1. Définissez les événements surTouch si vous utilisez l’interface [IMixedRealityTouchHandler] (xref:Microsoft.MixedReality.Toolkit.Input.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] (xref:Microsoft.MixedReality.Toolkit.Input.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 gameObject qui doit être tactile, ajoutez un NearInteractionTouchableUnityUI composant.

    1. Définissez les événements surTouch 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 celui-ci 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 de canevas dans votre scène.

Important

Sur le NearInteractionTouchable composant de script, pour les événements de propriété à recevoir , il existe deux options : pointeur et tactile. Définissez les événements sur lepointeur si vous utilisez l’interface IMixedRealityPointerHandler et définissez 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 variant 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 montre comment créer un cube, le rendre tactile et modifier la couleur tactile.

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 effectuer un glisser GameObject. Suppose que l’objet de jeu a un collisionneur 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