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.
- Vérifiez que le pointeur approprié est inscrit dans le profil de configuration MRTK principal.
- Vérifiez que gameObject souhaité dispose du composant de script desaisie ou tactile approprié et
Unity Collider
. - 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
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 laSpherePointer
classe.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.
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 .
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-ciNearInteractionGrabbable
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.
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).
Sur gameObject qui doit être tactile, ajoutez un composant BoxCollider et un composant [
NearInteractionTouchable
] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable).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.Cliquez sur Limites de correction et centre de correction
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.
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.
Sur gameObject qui doit être tactile, ajoutez un collider et un composant [
NearInteractionTouchableVolume
] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchableVolume).- 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.
- Définissez les événements surTouch si vous utilisez l’interface [
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
Ajoutez/vérifiez qu’il existe un canevas UnityUI dans la scène.
Sur gameObject qui doit être tactile, ajoutez un
NearInteractionTouchableUnityUI
composant.- Définissez les événements surTouch si vous utilisez l’interface
IMixedRealityTouchHandler
dans votre script de composant ci-dessous.
- Définissez les événements surTouch si vous utilisez l’interface
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-ciNearInteractionTouchableUnityUI
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
NearInteractionGrabbable
NearInteractionTouchable
NearInteractionTouchableUnityUI
NearInteractionTouchableVolume
IMixedRealityTouchHandler
IMixedRealityPointerHandler