Share via


Hinzufügen nahezuer Interaktivität — MRTK2

Nahinteraktionen kommen in Form von Berührungen und Greifern. Touch- und Grabereignisse werden vom PokePointer bzw. SpherePointer als Zeigerereignisse ausgelöst.

Drei wichtige Schritte sind erforderlich, um auf Toucheingaben und/oder Eingabeereignisse für ein bestimmtes GameObject zu lauschen.

  1. Stellen Sie sicher, dass der relevante Zeiger im Standard MRTK-Konfigurationsprofil registriert ist.
  2. Stellen Sie sicher, dass das gewünschte GameObject über die entsprechende Skriptkomponente zum Greifen oder Berühren und verfügt Unity Collider.
  3. Implementieren Sie eine Eingabehandlerschnittstelle für ein angefügtes Skript an das gewünschte GameObject, um auf die Grab- oder Touchereignisse zu lauschen.

Hinzufügen von Grabinteraktionen

  1. Stellen Sie sicher, dass ein SpherePointer im MRTK-Zeigerprofil registriert ist.

    Das MRTK-Standardprofil und das Standardprofil HoloLens 2 enthalten bereits einen SpherePointer. Sie können bestätigen, dass ein SpherePointer erstellt wird, indem Sie das MRTK-Konfigurationsprofil auswählen und zuEingabezeigerzeiger-Zeigeroptionen>> navigieren. Das Standard-Prefab GrabPointer (Assets/MRTK/SDK/Features/UX/Prefabs/Zeiger) sollte mit einem Controllertyp der Gelenkhand aufgeführt werden. Ein benutzerdefiniertes Prefab kann verwendet werden, solange es die SpherePointer -Klasse implementiert.

    Beispiel für das Grabzeigerprofil

    Der Standardmäßige Grabzeiger fragt nach Nahe gelegenen Objekten in einem Kegel um den Grabpunkt ab, um der Standardschnittstelle HoloLens 2 zu entsprechen.

    Konischer Greifzeiger

  2. Fügen Sie auf dem GameObject, das greifbar sein soll, einen NearInteractionGrabbable- und einen Collider hinzu.

    Stellen Sie sicher, dass sich die Ebene des GameObject auf einer grabbbaren Ebene befindet. Standardmäßig können alle Ebenen außer Spatial Awareness und Ignore Raycasts abgerufen werden. Überprüfen Sie die Grabebenenmasken in Ihrem GrabPointer-Prefab , um zu ermitteln, welche Ebenen erfasst werden können.

  3. Fügen Sie auf dem GameObject oder einem seiner Vorgänger eine Skriptkomponente hinzu, die die IMixedRealityPointerHandler Schnittstelle implementiert. Jeder Vorgänger des Objekts mit dem NearInteractionGrabbable kann auch Zeigerereignisse empfangen.

Beispiel für den Grabcode

Im Folgenden finden Sie ein Skript, das gedruckt wird, wenn ein Ereignis eine Toucheingabe oder ein Griff ist. In der relevanten IMixedRealityPointerHandler-Schnittstellenfunktion kann man den Typ des Zeigers untersuchen, der dieses Ereignis über auslöst MixedRealityPointerEventData. Wenn der Zeiger ein SpherePointer ist, ist die Interaktion ein Griff.

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) {}
}

Hinzufügen von Touchinteraktionen

Der Prozess zum Hinzufügen von Touchinteraktionen für UnityUI-Elemente unterscheidet sich von vanilla 3D GameObjects. Sie können mit dem folgenden Abschnitt unity UI fortfahren, um Unity UI-Komponenten zu aktivieren.

Stellen Sie jedoch für beide Arten von UX-Elementen sicher, dass ein PokePointer im MRTK-Zeigerprofil registriert ist.

Das MRTK-Standardprofil und das Standardprofil HoloLens 2 enthalten bereits einen PokePointer. Sie können bestätigen, dass ein PokePointer erstellt wird, indem Sie das MRTK-Konfigurationsprofil auswählen und zu Eingabezeigerzeiger-Zeigeroptionen >> navigieren. Das Standard-Prefab PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Zeiger) sollte mit einem Controllertyp der Gelenkhand aufgeführt werden. Ein benutzerdefiniertes Prefab kann verwendet werden, solange es die PokePointer -Klasse implementiert.

Beispiel für ein Poke-Zeigerprofil

3D GameObjects

Es gibt zwei verschiedene Möglichkeiten zum Hinzufügen von Touchinteraktionen zu 3D-GameObjects, je nachdem, ob Ihr 3D-Objekt nur eine einzelne touchierbare Ebene haben sollte oder ob es basierend auf seinem gesamten Collider touchierbar sein sollte. Der erste Weg ist in der Regel für Objekte mit BoxColliders, bei denen es gewünscht wird, dass nur eine einzelne Seite des Colliders auf Touchereignisse reagiert. Die andere ist für Objekte, die basierend auf ihrem Collider aus jeder Richtung touchierbar sein müssen.

Einzelne Gesichtseingabe

Dies ist nützlich, um Situationen zu ermöglichen, in denen nur ein einzelnes Gesicht berührt werden muss. Bei dieser Option wird davon ausgegangen, dass das Spielobjekt über einen BoxCollider verfügt. Es ist möglich, dies mit Nicht-BoxCollider-Objekten zu verwenden. In diesem Fall werden die Eigenschaften "Bounds" und "Local Center" häufig manuell festgelegt, um die berührende Ebene zu konfigurieren (d. h. Grenzen sollten auf einen Wert ungleich Null-Null festgelegt werden).

  1. Fügen Sie auf dem GameObject, das touchierbar sein soll, einen BoxCollider und eine Komponente hinzu NearInteractionTouchable .

    1. Legen Sie Ereignisse auf Empfangen auf Touch fest, wenn Sie die IMixedRealityTouchHandler Benutzeroberfläche in Ihrem Komponentenskript unten verwenden.

    2. Klicken Sie auf Fix bounds und Fix center ..

    NearInteractionTouchable Setup

  2. Fügen Sie für dieses Objekt oder einen seiner Vorgänger eine Skriptkomponente hinzu, die dieIMixedRealityTouchHandler-Schnittstelle. Jeder Vorgänger des Objekts mit dem NearInteractionTouchable kann auch Zeigerereignisse empfangen.

Hinweis

Beachten Sie in der Editor-Szenenansicht mit ausgewähltem GameObject NearInteractionTouchable ein weißes Umrissquadrat und einen Pfeil. Der Pfeil zeigt auf die "Vorderseite" des Anfassbaren. Das Kollisionsbare kann nur aus dieser Richtung angefasst werden. Informationen dazu, dass ein Collider aus allen Richtungen touchierbar ist, finden Sie im Abschnitt zum beliebigen Collider-Touch. NearInteractionTouchable Gizmos

Beliebiger Collider touch

Dies ist nützlich, um Situationen zu ermöglichen, in denen das Spielobjekt über das gesamte Collidergesicht berührt werden muss. Dies kann beispielsweise verwendet werden, um Touchinteraktionen für ein Objekt mit einem SphereCollider zu aktivieren, bei dem der gesamte Collider touchierbar sein muss.

  1. Fügen Sie auf dem GameObject, das touchierbar sein soll, einen Collider und eine Komponente hinzu NearInteractionTouchableVolume .

    1. Legen Sie Ereignisse auf Empfangen auf Touch fest, wenn Sie die IMixedRealityTouchHandler Benutzeroberfläche in Ihrem Komponentenskript unten verwenden.
  2. Fügen Sie für dieses Objekt oder einen seiner Vorgänger eine Skriptkomponente hinzu, die dieIMixedRealityTouchHandler-Schnittstelle. Jeder Vorgänger des Objekts mit dem NearInteractionTouchable kann auch Zeigerereignisse empfangen.

Unity-Benutzeroberfläche

  1. Fügen Sie hinzu,/stellen Sie sicher, dass in der Szene ein UnityUI-Canvas vorhanden ist.

  2. Fügen Sie auf dem GameObject, das touchierbar sein soll, eine Komponente hinzu NearInteractionTouchableUnityUI .

    1. Legen Sie Ereignisse auf Empfangen auf Touch fest, wenn Sie die IMixedRealityTouchHandler Benutzeroberfläche in Ihrem Komponentenskript unten verwenden.
  3. Fügen Sie zu diesem Objekt oder einem seiner Vorgänger eine Skriptkomponente hinzu, die die IMixedRealityTouchHandler Schnittstelle implementiert. Jeder Vorgänger des -Objekts mit dem NearInteractionTouchableUnityUI kann auch Zeigerereignisse empfangen.

Wichtig

Objekte verhalten sich möglicherweise nicht wie erwartet, wenn sie sich auf überlappenden Canvasobjekten befinden. Um ein konsistentes Verhalten zu gewährleisten, überlappen Sie niemals Canvasobjekte in Ihrer Szene.

Wichtig

Für die NearInteractionTouchable Skriptkomponente gibt es für die Eigenschaft Ereignisse, die empfangen werden sollen , zwei Optionen: Zeiger und Touch. Legen Sie Ereignisse auf Empfangen auf Zeiger fest, wenn Sie die IMixedRealityPointerHandler Schnittstelle verwenden, und legen Sie auf Touch fest, wenn Sie die IMixedRealityTouchHandler Schnittstelle in Ihrem Komponentenskript verwenden, das auf die Eingabeereignisse reagiert bzw. behandelt.

Beispiel für Touchcode

Der folgende Code veranschaulicht ein MonoBehaviour, das mit einer Variantenkomponente an ein NearInteractionTouchable GameObject angefügt werden kann und auf Toucheingabeereignisse reagieren kann.

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) { }
}

Skriptbeispiele für nahe Interaktion

Berührungsereignisse

In diesem Beispiel wird ein Würfel erstellt, er ist anfassbar und ändert die Farbe bei Der Berührung.

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);
}

Ereignisse abrufen

Das folgende Beispiel zeigt, wie Sie ein GameObject ziehen können. Geht davon aus, dass das Spielobjekt über einen Collider verfügt.

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;
        }
    });
}

Nützliche APIs

Weitere Informationen