Lägga till nära interaktivitet – MRTK2

Nära interaktioner kommer i form av beröring och grepp. Touch- och grab-händelser höjs som pekarhändelser av PokePointer respektive SpherePointer.

Tre viktiga steg krävs för att lyssna efter touch- och/eller grab-indatahändelser på en viss GameObject.

  1. Kontrollera att relevant pekare är registrerad i huvudkonfigurationsprofilen för MRTK.
  2. Kontrollera att önskad GameObject har rätt komponent för grab - eller touch-skript och Unity Collider.
  3. Implementera ett gränssnitt för indatahanterare i ett kopplat skript till önskat GameObject för att lyssna efter grab - eller touch-händelser .

Lägga till grab-interaktioner

  1. Kontrollera att en SpherePointer är registrerad i MRTK-pekarprofilen.

    Standard-MRTK-profilen och standardprofilen för HoloLens 2 innehåller redan en SpherePointer. Man kan bekräfta att en SpherePointer skapas genom att välja MRTK-konfigurationsprofilen och gå tillAlternativ förpekare> för indata>. Standardprefab GrabPointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) bör anges med kontrollanttypenArtikulerad hand. En anpassad prefab kan användas så länge den SpherePointer implementerar klassen.

    Exempel på hämtar pekare

    Standardfrågan för hämtar pekare för närliggande objekt i en kon runt greppet för att matcha standardgränssnittet för HoloLens 2.

    Konisk greppspekare

  2. På GameObject som ska vara grabbbar lägger du till en NearInteractionGrabbable, samt en collider.

    Kontrollera att gameobject-lagret är på ett grabbbart lager. Som standard kan alla lager utom Spatial Awareness och Ignore Raycasts tas bort. Se vilka lager som kan tas genom att granska Grab Layer Masks i din GrabPointer-prefab .

  3. Lägg till en skriptkomponent som implementerar IMixedRealityPointerHandler gränssnittet på GameObject eller någon av dess överordnade objekt. Alla överordnade objekt med NearInteractionGrabbable kan också ta emot pekarhändelser.

Exempel på hämtar kod

Nedan visas ett skript som skrivs ut om en händelse är en touch eller grab. I den relevanta gränssnittsfunktionen IMixedRealityPointerHandler kan man titta på vilken typ av pekare som utlöser händelsen via MixedRealityPointerEventData. Om pekaren är en SpherePointer är interaktionen ett grepp.

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

Lägga till beröringsinteraktioner

Processen för att lägga till touchinteraktioner i UnityUI-element skiljer sig från för vanilla 3D GameObjects. Du kan gå vidare till följande avsnitt, Unity UI, för att aktivera Unity UI-komponenter.

För båda typerna av UX-element kontrollerar du dock att en PokePointer är registrerad i MRTK-pekarprofilen.

Standard-MRTK-profilen och standardprofilen för HoloLens 2 innehåller redan en PokePointer. Man kan bekräfta att en PokePointer skapas genom att välja MRTK-konfigurationsprofilen och gå tillAlternativ förpekare> för indata>. Standardprefab PokePointer (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) bör anges med kontrollanttypenLedad hand. En anpassad prefab kan användas så länge den PokePointer implementerar klassen.

Exempel på poke-pekareprofil

3D GameObjects

Det finns två olika sätt att lägga till beröringsinteraktioner i 3D GameObjects, beroende på om ditt 3d-objekt bara ska ha ett enda beröringsbart plan eller om det ska vara beröringsbart baserat på hela dess kolliderare. Det första sättet är vanligtvis på objekt med BoxColliders, där det är önskvärt att bara ha ett enda ansikte av kollideraren reagera på beröringshändelser. Den andra är för objekt som måste vara beröringsbara från valfri riktning baserat på deras kolliderare.

Enkel ansiktstouch

Detta är användbart för att aktivera situationer där endast ett enda ansikte behöver vara beröringsbart. Det här alternativet förutsätter att spelobjektet har en BoxCollider. det är möjligt att använda detta med icke-BoxCollider-objekt, i så fall är egenskaperna "Bounds" och "Local Center" mycket manuellt inställda för att konfigurera det beröringsbara planet (d.v.s. Gränser ska anges till ett värde som inte är noll noll).

  1. På GameObject som ska vara beröringsbar lägger du till en BoxCollider och en NearInteractionTouchable komponent.

    1. Ange Händelser till Ta emot till Touch om du använder IMixedRealityTouchHandler gränssnittet i komponentskriptet nedan.

    2. Klicka på Åtgärda gränser och Åtgärda mitten

    NearInteractionTouchable-installation

  2. På objektet eller någon av dess överordnade objekt lägger du till en skriptkomponent som implementerarIMixedRealityTouchHandler Gränssnitt. Alla överordnade objekt med NearInteractionTouchable kan också ta emot pekarhändelser.

Anteckning

I redigeringsscenvyn med NearInteractionTouchable GameObject markerat ser du en vit konturruta och pil. Pilen pekar på "fronten" på det beröringsbara objektet. Den kolliderande kommer bara att kunna röras från den riktningen. För att göra en kolliderare pekbar från alla håll, se avsnittet om godtycklig collider touch. NearInteractionTouchable Gizmos

Godtycklig kollisionskontakt

Detta är användbart för att möjliggöra situationer där spelobjektet måste vara beröringsbart längs hela dess kolliderar ansikte. Detta kan till exempel användas för att aktivera beröringsinteraktioner för ett objekt med en SphereCollider, där hela kollideraren måste vara beröringsbar.

  1. Lägg till en collider och en NearInteractionTouchableVolume komponent på GameObject som ska vara beröringsbar.

    1. Ange Händelser till Ta emot till Touch om du använder IMixedRealityTouchHandler gränssnittet i komponentskriptet nedan.
  2. På objektet eller någon av dess överordnade objekt lägger du till en skriptkomponent som implementerarIMixedRealityTouchHandler Gränssnitt. Alla överordnade objekt med NearInteractionTouchable kan också ta emot pekarhändelser.

Unity-användargränssnitt

  1. Lägg till/se till att det finns en UnityUI-arbetsyta i scenen.

  2. På GameObject som ska vara beröringsbar lägger du till en NearInteractionTouchableUnityUI komponent.

    1. Ange Händelser till Ta emot till Touch om du använder IMixedRealityTouchHandler gränssnittet i komponentskriptet nedan.
  3. Lägg till en skriptkomponent som implementerar IMixedRealityTouchHandler gränssnittet på objektet eller någon av dess överordnade objekt. Alla överordnade objekt med NearInteractionTouchableUnityUI kan även ta emot pekarhändelser.

Viktigt

Objekt kanske inte fungerar som förväntat om de finns på överlappande arbetsyteobjekt. För att säkerställa konsekvent beteende överlappar du aldrig arbetsyteobjekt i din scen.

Viktigt

NearInteractionTouchable För att egenskapen Händelser ska ta emot finns det två alternativ för skriptkomponenten: Pekare och Touch. Ange Händelser till Ta emot till Pekare om du använder IMixedRealityPointerHandler gränssnittet och ställer in på Touch om du använder IMixedRealityTouchHandler gränssnittet i komponentskriptet som svarar/hanterar indatahändelserna.

Exempel på pekkod

Koden nedan visar en MonoBehaviour som kan kopplas till en GameObject med en NearInteractionTouchable variantkomponent och svara på touch-indatahändelser.

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

Exempel på skript för nära interaktion

Touchhändelser

Det här exemplet skapar en kub, gör den beröringsbar och ändrar färg vid beröring.

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

Hämta händelser

I exemplet nedan visas hur du kan dra ett GameObject-objekt. Förutsätter att spelobjektet har en kolliderare på sig.

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

Användbara API:er

Se även