So fügen Sie in der Nähe von Interaktivität hinzu – MRTK2

In der Nähe kommen Interaktionen in Form von Berührungen und Greifern. Touch- und Grabereignisse werden als Zeigerereignisse von PokePointer und SpherePointer ausgelöst.

Drei wichtige Schritte sind erforderlich, um Touch- und/oder Eingabeereignisse in einem bestimmten GameObject zu hören.

  1. Stellen Sie sicher, dass der relevante Zeiger im Haupt-MRTK-Konfigurationsprofil registriert ist.
  2. Stellen Sie sicher, dass das gewünschte GameObject über die entsprechende Greif - oder Touchskriptkomponente verfügt und Unity Collider.
  3. Implementieren Sie eine Eingabehandlerschnittstelle auf einem angefügten Skript an das gewünschte GameObject, um für die Grab - oder Touchereignisse zu hören.

Hinzufügen von Grabinteraktionen

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

    Das Standard-MRTK-Profil und das standardmäßige HoloLens 2 Profil enthalten bereits einen SpherePointer. Sie können bestätigen, dass einSpherePointer erstellt wird, indem Sie das MRTK-Konfigurationsprofil auswählen und zuEingabezeigeroptionen>> navigieren. Der Standard-Prefab GrabPointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) sollte mit einem Controller-Typ von Gelenkhand aufgelistet werden. Eine benutzerdefinierte Prefab kann verwendet werden, solange sie die SpherePointer Klasse implementiert.

    Grab Pointer Profile Example

    Die standardmäßigen Suchzeigerabfragen für nahe liegende Objekte in einem Kegel um den Grabpunkt, um der Standardschnittstelle Hololens 2 zu entsprechen.

    Conical Grab Pointer

  2. Fügen Sie auf dem GameObject, das begreifbar sein soll, einen NearInteractionGrabbable, sowie einen Kollidieren hinzu.

    Stellen Sie sicher, dass sich die Ebene des GameObject auf einer grabbbaren Ebene befindet. Standardmäßig sind alle Ebenen außer räumlichem Bewusstsein und Ignorieren von Raycasts zulässig. Sehen Sie, welche Ebenen in Ihrem GrabPointer-Prefab aufgegriffen werden können, indem Sie die Grab Layer-Masken überprüfen.

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

Beispiel für "Grab"-Code

Unten finden Sie ein Skript, das gedruckt wird, wenn ein Ereignis eine Toucheingabe ist oder ein Griff ist. In der relevanten IMixedRealityPointerHandler-Schnittstelle kann man den Typ des Zeigers betrachten, der dieses Ereignis über das MixedRealityPointerEventDataEreignis auslöst. Wenn der Zeiger ein SpherePointer ist, ist die Interaktion eine Greifaktion.

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 auf UnityUI-Elementen unterscheidet sich von vanilla 3D GameObjects. Sie können zum Aktivieren von Unity-UI-Komponenten im folgenden Abschnitt springen.

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

Das Standard-MRTK-Profil und das standardmäßige HoloLens 2-Profil enthalten bereits einen PokePointer. Sie können bestätigen, dass ein PokePointer erstellt wird, indem Sie das MRTK-Konfigurationsprofil auswählen und zu Eingabezeigeroptionen>> navigieren. Die Standardeinstellung PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers)-Prefab sollte mit einem Controllertyp von Gelenkhand aufgelistet werden. Eine benutzerdefinierte Prefab kann verwendet werden, solange sie die PokePointer Klasse implementiert.

Poke Pointer Profile Example

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 touchbare Ebene haben sollte oder ob es auf der Grundlage seines gesamten Colliders touchierbar sein sollte. Die erste Möglichkeit befindet sich in der Regel auf Objekten mit BoxColliders, wo es nur ein einzelnes Gesicht des Colliders auf Touchereignisse reagiert. Das andere ist für Objekte, die von jeder Richtung auf Grundlage ihres Kollidierens berührt werden müssen.

Einzelne Gesichtseingabe

Dies ist nützlich, um Situationen zu ermöglichen, in denen nur ein einzelnes Gesicht touchierbar sein muss. Diese Option geht davon aus, dass das Spielobjekt über einen BoxCollider verfügt. Es ist möglich, dies mit Nicht-BoxCollider-Objekten zu verwenden, wobei die Eigenschaften "Bounds" und "Local Center" viel manuell festgelegt werden, um die touchierbare Ebene zu konfigurieren (d. h. Grenzen sollten auf einen Nicht-Null-Wert festgelegt werden).

  1. Fügen Sie auf dem GameObject, das touchierbar sein soll, eine BoxCollider- und eine [NearInteractionTouchable] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable)-Komponente hinzu.

    1. Legen Sie Ereignisse auf"Touch empfangen" fest, wenn Sie die Schnittstelle [IMixedRealityTouchHandler] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) in Ihrem Komponentenskript unten verwenden.

    2. Klicken Sie auf "Fix"-Grenzen und "Fix".

    NearInteractionTouchable Setup

  2. Fügen Sie auf diesem Objekt oder einer ihrer Vorgänger eine Skriptkomponente hinzu, die die Implementierung der Skriptkomponente implementiert.IMixedRealityTouchHandler-Schnittstelle. Jeder Vorgänger des Objekts mit dem [NearInteractionTouchable] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) kann auch Zeigerereignisse empfangen.

Hinweis

Beachten Sie in der Editor-Szenenansicht mit ausgewähltem NearInteractionTouchable GameObject ein weißes Gliederungsfeld und einen Pfeil. Der Pfeil zeigt auf die "Front" des Touchables. Die kollidierbare Kann kann nur von dieser Richtung aus berührt werden. Um einen Kollidieren aus allen Richtungen zu berühren, sehen Sie sich den Abschnitt auf beliebiger Kollidiereneingabe an. NearInteractionTouchable Gizmos

Beliebige Kollidieren-Toucheingabe

Dies ist nützlich, um Situationen zu ermöglichen, in denen das Spielobjekt entlang des gesamten Kollidierens berührt werden muss. Dies kann beispielsweise verwendet werden, um Touchinteraktionen für ein Objekt mit einem SphereCollider zu ermöglichen, wobei der gesamte Kollidierer touchierbar sein muss.

  1. Fügen Sie auf dem GameObject, das touchierbar sein soll, eine Kollidieren und eine [NearInteractionTouchableVolume] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchableVolume) Komponente hinzu.

    1. Legen Sie Ereignisse auf"Touch empfangen" fest, wenn Sie die Schnittstelle [IMixedRealityTouchHandler] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) in Ihrem Komponentenskript unten verwenden.
  2. Fügen Sie auf diesem Objekt oder einer ihrer Vorgänger eine Skriptkomponente hinzu, die die Implementierung der Skriptkomponente implementiert.IMixedRealityTouchHandler-Schnittstelle. Jeder Vorgänger des Objekts mit dem [NearInteractionTouchable] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) kann auch Zeigerereignisse empfangen.

Unity-Benutzeroberfläche

  1. Hinzufügen/sicherstellen, dass es einen UnityUI-Canvas in der Szene gibt.

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

    1. Legen Sie Ereignisse auf"Empfangen auf Touch " fest, wenn Sie die IMixedRealityTouchHandler Schnittstelle in Ihrem Komponentenskript unten verwenden.
  3. Fügen Sie auf diesem Objekt oder einer ihrer Vorgänger eine Skriptkomponente hinzu, die die IMixedRealityTouchHandler Schnittstelle implementiert. Jeder Vorgänger des Objekts mit dem NearInteractionTouchableUnityUI Objekt 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 keine Canvasobjekte in Ihrer Szene.

Wichtig

In der NearInteractionTouchable Skriptkomponente gibt es für die Eigenschaftsereignisse, die empfangen werden sollen, zwei Optionen: Zeiger und Touch. Legen Sie Ereignisse auf Zeiger fest, wenn Sie die IMixedRealityPointerHandler Schnittstelle verwenden und auf Touch festlegen, wenn Sie die Schnittstelle in Ihrem Komponentenskript verwenden, das auf die IMixedRealityTouchHandler Eingabeereignisse reagiert/behandelt.

Beispiel für Touchcode

Der folgende Code veranschaulicht eine MonoBehaviour, die an ein GameObject mit einer NearInteractionTouchable Variant-Komponente angefügt werden kann und auf Toucheingabeereignisse reagiert.

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

Beispiele für Interaktionsskripts

Berührungsereignisse

In diesem Beispiel wird ein Würfel erstellt, er wird touchierbar und ändert die Farbe auf Toucheingaben.

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

Grabereignisse

Im folgenden Beispiel wird gezeigt, wie sie ein GameObject-Objekt ziehen können. Geht davon aus, dass das Spielobjekt einen Collider darauf hat.

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

Siehe auch