Så här lägger du till nära interaktivitet

Nära interaktioner kommer i form av touchar och grabs. Touch- och grab-händelser höjs som pekarehändelser avPointer respektive SpherePointer.

Tre viktiga steg krävs för att lyssna efter touch- och/eller hämta indatahändelser på ett visst GameObject.

  1. Se till att relevant pekare är registrerad i huvudkonfigurationsprofilen för MRTK.
  2. Se till att det önskade GameObject har rätt grab- eller touch-skriptkomponent 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 interaktioner med att hämta

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

    Standardprofilen MRTK och standardprofilen HoloLens 2 innehåller redan en SpherePointer. Du kan bekräfta att en SpherePointer skapas genom att välja MRTK-konfigurationsprofilen och navigera till Pekaralternativ > > för indata. GrabPointerStandard-prefab (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) bör visas med styrningstypen Tydligt hand. En anpassad prefab kan användas så länge den implementerar SpherePointer klassen .

    Exempel på grab-pekarprofil

    Standardanvisningsfrågor för objekt i närheten i en glass runt träffpunkten för att matcha standardgränssnittet Hololens 2.

    Pekare för konisk grab

  2. På GameObject som ska vara upplåst lägger du till NearInteractionGrabbable en , samt en kollidering.

    Kontrollera att lagret i GameObject finns på ett lager som går att ta tag i. Som standard är alla lager utom Spatial Awareness och Ignore Raycasts upptambara. Se vilka lager som går att ta tag i genom att granska Grab Layer Masks (Hämta lagermasker) i din GrabPointer-prefab.

  3. På GameObject eller någon av dess överordnade lägger du till en skriptkomponent som implementerar IMixedRealityPointerHandler gränssnittet. Alla överordnade objekt med kan NearInteractionGrabbable även ta emot pekarhändelser.

Exempel på att hämta kod

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

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 pekinteraktioner

Processen för att lägga till touch-interaktioner på UnityUI-element skiljer sig från för 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 ser du dock till att enPointer har registrerats i MRTK-pekarprofilen.

Standardprofilen MRTK och standardprofilen HoloLens 2 innehåller redan EnPointer. Du kan bekräfta att enPointer skapas genom att välja MRTK-konfigurationsprofilen och gå till Pekaralternativ > > för indata. Standard PokePointer prefab-enheten (Assets/MRTK/SDK/Features/UX/Prefabs/Pointers) bör visas med styrningstypen Ledad hand. En anpassad prefab kan användas så länge den implementerar PokePointer klassen .

Exempel på pekarprofil

3D GameObjects

Det finns två olika sätt att lägga till pekinteraktioner i 3D GameObjects, beroende på om ditt 3d-objekt bara ska ha ett enda pekbart plan, eller om det ska kunna röra sig baserat på hela krascharen. Det första sättet är vanligtvis på objekt med BoxColliders, där man vill att bara ett enda ansikte på kollisionsaren ska reagera på touchhändelser. Den andra är till för objekt som måste kunna nås från valfri riktning baserat på deras kollision.

Enkel ansiktstouch

Detta är användbart för att möjliggöra situationer där endast ett enda ansikte behöver kunna röras. 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 vilket fall egenskaperna "Bounds" och "Local Center" mycket manuellt anges för att konfigurera det pekbara planet (d.v.s. Bounds ska anges till ett värde som inte är noll).

  1. Lägg till en BoxCollider och en NearInteractionTouchable [] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) komponent i GameObject som ska vara touchable.

    1. Ställ in Händelser på Ta emot på Touch om du använder gränssnittet [ IMixedRealityTouchHandler ] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) i komponentskriptet nedan.

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

    NearInteractionTouchable-konfiguration

  2. På objektet eller något av dess överordnade objekt lägger du till en skriptkomponent som implementerar IMixedRealityTouchHandler Gränssnitt. Alla överordnade objekt med [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) kommer också att kunna ta emot pekarhändelser.

Anteckning

Lägg märke till en vit kontur i redigeringsscenvyn med NearInteractionTouchable GameObject markerat. Pilen pekar på "framsida" för den pekbara. Den kompilerbara vägen kan bara nås från det hållet. Om du vill göra en kollisionsmanterbar från alla riktningar kan du se avsnittet om godtyckliga kollisionsstreck. NearInteractionTouchable Gizmos

Godtycklig kontakt med kollision

Det här är användbart för att möjliggöra situationer där spelobjektet måste kunna användas längs hela kollisions ansikte. Detta kan till exempel användas för att aktivera pekinteraktioner för ett objekt med en SphereCollider, där hela kollisionen måste vara nåbar.

  1. Lägg till en kollisionskomponent och en NearInteractionTouchableVolume [] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchableVolume) på GameObject som ska vara touchable.

    1. Ställ in Händelser på Ta emot på Touch om du använder gränssnittet [ IMixedRealityTouchHandler ] (xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) i komponentskriptet nedan.
  2. På objektet eller något av dess överordnade objekt lägger du till en skriptkomponent som implementerar IMixedRealityTouchHandler Gränssnitt. Alla överordnade objekt med [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) kommer också att kunna ta emot pekarhändelser.

Unity-användargränssnitt

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

  2. Lägg till en komponent i GameObject som ska vara NearInteractionTouchableUnityUI nåbart.

    1. Ställ in Händelser på Ta emot till Touch om du använder gränssnittet IMixedRealityTouchHandler i komponentskriptet nedan.
  3. På objektet eller någon av dess överordnade lägger du till en skriptkomponent som implementerar IMixedRealityTouchHandler -gränssnittet. Alla överordnade objekt med kan även NearInteractionTouchableUnityUI 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 scenen.

Viktigt

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

Touch-kodexempel

Koden nedan visar en MonoBehaviour som kan kopplas till ett GameObject med en variantkomponent och NearInteractionTouchable 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 touchbar och ändrar färg vid pekskärmen.

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

Exemplet nedan visar hur du gör ett GameObject dragbart. Förutsätter att spelobjektet har en kollisionsman.

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