Dela via


Rörelsestyrenheter i Unity

Det finns två viktiga sätt att vidta åtgärder på din blick i Unity, handgester och rörelsekontrollanter i HoloLens och avancerad HMD. Du kommer åt data för båda källorna för rumsliga indata via samma API:er i Unity.

Unity tillhandahåller två huvudsakliga sätt att komma åt spatiala indata för Windows Mixed Reality. De vanliga API:erna Input.GetButton/Input.GetAxis fungerar i flera Unity XR SDK:er, medan API:et InteractionManager/GestureRecognizer som är specifikt för Windows Mixed Reality exponerar hela uppsättningen rumsliga indata.

Api:er för Unity XR-indata

För nya projekt rekommenderar vi att du använder de nya XR-indata-API:erna från början.

Mer information om XR-API:er finns här.

Mappningstabell för Unity-knapp/axel

Unitys indatahanterare för Windows Mixed Reality-rörelsestyrenheter stöder knapp- och axel-ID:n som anges nedan via API:erna Input.GetButton/GetAxis . Kolumnen "Windows MR-specific" refererar till egenskaper som är tillgängliga utanför Typen InteractionSourceState . Var och en av dessa API:er beskrivs i detalj i avsnitten nedan.

Knapp-/axel-ID-mappningar för Windows Mixed Reality matchar vanligtvis Oculus-knapp-/axel-ID:t.

Knapp-/axel-ID-mappningar för Windows Mixed Reality skiljer sig från OpenVR:s mappningar på två sätt:

  1. Mappningen använder pekplatta-ID:n som skiljer sig från tumstickor för att stödja styrenheter med både tumpinnar och pekplattor.
  2. Mappningen undviker att överbelasta A- och X-knapp-ID:erna för menyknapparna så att de blir tillgängliga för de fysiska ABXY-knapparna.
Inmatning Vanliga Unity-API:er
(Input.GetButton/GetAxis)
Windows MR-specifikt indata-API
(XR. WSA. Indata)
Vänster hand Högerhand
Välj utlösare som trycks Axel 9 = 1,0 Axel 10 = 1,0 selectPressed
Välj utlösar analogt värde Axel 9 Axel 10 selectPressedAmount
Välj utlösare delvis nedtryckt Knapp 14 (gamepad compat) Knapp 15 (gamepad compat) selectPressedAmount > 0.0
Menyknappen har tryckts Knapp 6* Knapp 7* menuPressed
Grip-knappen har tryckts in Axel 11 = 1,0 (inga analoga värden)
Knapp 4 (gamepad compat)
Axel 12 = 1,0 (inga analoga värden)
Knapp 5 (gamepad compat)
Förstått
Tumstick X (vänster: -1,0, höger: 1,0) Axel 1 Axel 4 thumbstickPosition.x
Tumsticka Y (överkant: -1,0, nederkant: 1,0) Axel 2 Axel 5 thumbstickPosition.y
Tumsticka pressad Knapp 8 Knapp 9 thumbstickPressed
Pekplatta X (vänster: -1.0, höger: 1.0) Axel 17* Axel 19* touchpadPosition.x
Pekplatta Y (överst: -1,0, nederkant: 1,0) Axel 18* Axel 20* touchpadPosition.y
Pekplatta vidrörd Knapp 18* Knapp 19* touchpadTouched
Tryck på pekplatta Knapp 16* Knapp 17* pekplattaTryckt
6DoF grepp pose eller pekare pose Endast greppställning : XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Skicka grepp eller pekare som argument: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Spårningstillstånd Positioneringsnoggrannhet och källförlustrisk är endast tillgängliga via MR-specifikt API sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Kommentar

Dessa knapp-/axel-ID:n skiljer sig från de ID:n som Unity använder för OpenVR på grund av kollisioner i de mappningar som används av gamepads, Oculus Touch och OpenVR.

OpenXR

Om du vill lära dig grunderna om interaktioner med mixad verklighet i Unity går du till Unity Manual for Unity XR Input. Den här Unity-dokumentationen beskriver mappningar från kontrollantspecifika indata till mer generaliserbara InputFeatureUsages, hur tillgängliga XR-indata kan identifieras och kategoriseras, hur du läser data från dessa indata med mera.

Plugin-programmet Mixed Reality OpenXR innehåller ytterligare interaktionsprofiler för indata, mappade till standardindataFunktioner enligt beskrivningen nedan:

InputFeatureUsage HP Reverb G2 Controller (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Styrspak
primary2DAxisClick Joystick – Klicka
utlösare Utlösare
grepp Grepp Tryck eller tryck på luft
primaryButton [X/A] - Tryck på Luftklicka
secondaryButton [Y/B] - Tryck
gripButton Grepp - Tryck
triggerButton Utlösare – Tryck på
menuButton Meny

Greppställning jämfört med pekposition

Windows Mixed Reality stöder rörelsestyrenheter i en mängd olika formfaktorer. Varje kontrollants design skiljer sig åt i relationen mellan användarens handposition och den naturliga framåtriktningen som appar bör använda för att peka när kontrollanten återges.

För att bättre representera dessa kontrollanter finns det två typer av poser som du kan undersöka för varje interaktionskälla, grepppositionen och pekarens pose. Både koordinaterna för greppposition och pekareposition uttrycks av alla Unity-API:er i globala Unity-världskoordinater.

Greppställning

Grepppositionen representerar platsen för användarens handflata, antingen identifierad av en HoloLens eller med en rörelsestyrenhet.

På uppslukande headset används grepppositionen bäst för att återge användarens hand eller ett objekt som hålls i användarens hand. Grepppositionen används också vid visualisering av en rörelsestyrenhet. Den återgivningsbara modellen som tillhandahålls av Windows för en rörelsekontrollant använder grepppositionen som ursprung och rotationspunkt.

Grepppositionen definieras specifikt enligt följande:

  • Greppposition: Handflatan centroid när du håller styrenheten naturligt, justeras vänster eller höger för att centrera positionen inom greppet. På rörelsestyrenheten Windows Mixed Reality justeras den här positionen vanligtvis med knappen Grip.
  • Grepporienteringens högeraxel: När du helt öppnar handen för att bilda en platt 5-finger pose, strålen som är normal för handflatan (framåt från vänster handflata, bakåt från höger handflata)
  • Grepporienteringens framåtaxel: När du stänger handen delvis (som om du höll styrenheten) pekar strålen "framåt" genom röret som bildas av dina icke-tumfingrar.
  • Grepporienteringens Upp-axel: Upp-axeln som är underförstådd med definitionerna Höger och Framåt.

Du kan komma åt greppet antingen via Unitys indata-API för flera leverantörer (XR). InputTracking. GetLocalPosition/Rotation) eller via Windows MR-specifika API (sourceState.sourcePose.TryGetPosition/Rotation, som begär posedata för Grip-noden ).

Pekareposition

Pekaren representerar spetsen på styrenheten som pekar framåt.

Den systemspecifika pekarepositionen används bäst för raycast när du återger själva styrenhetsmodellen. Om du återger något annat virtuellt objekt i stället för kontrollanten, till exempel en virtuell pistol, bör du peka med en stråle som är mest naturlig för det virtuella objektet, till exempel en stråle som färdas längs pipan i den appdefinierade vapenmodellen. Eftersom användarna kan se det virtuella objektet och inte den fysiska kontrollanten blir det troligtvis mer naturligt att peka med det virtuella objektet för dem som använder din app.

För närvarande är pekaren endast tillgänglig i Unity via Windows MR-specifika API, sourceState.sourcePose.TryGetPosition/Rotation, och skickar interaktionSourceNode.Pointer som argument.

OpenXR

Du har åtkomst till två uppsättningar poser via OpenXR-indatainteraktioner:

  • Greppet utgör för återgivning av objekt i handen
  • Syftet är att peka ut världen.

Mer information om den här designen och skillnaderna mellan de två poserna finns i OpenXR-specifikationen – indataundersökvägar.

Poser som tillhandahålls av InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity och DeviceAngularVelocity representerar alla OpenXR-grepppositionen. InputFeatureUsages relaterade till greppställningar definieras i Unitys CommonUsages.

Poser som tillhandahålls av InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity och PointerAngularVelocity representerar alla OpenXR-målställningen. Dessa InputFeatureUsages definieras inte i några inkluderade C#-filer, så du måste definiera dina egna InputFeatureUsages enligt följande:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Haptics

Information om hur du använder haptics i Unitys XR-indatasystem finns i Unity Manual for Unity XR Input - Haptics.

Kontrollantspårningstillstånd

Precis som headseten kräver rörelsestyrenheten i Windows Mixed Reality ingen installation av externa spårningssensorer. I stället spåras styrenheterna av sensorer i själva headsetet.

Om användaren flyttar styrenheterna från headsetets synfält fortsätter Windows i de flesta fall att härleda kontrollantpositioner. När kontrollanten har förlorat visuell spårning tillräckligt länge, sjunker kontrollantens positioner till ungefärliga noggrannhetspositioner.

I det här läget låser systemet styrenheten åt användaren och spårar användarens position när de rör sig, samtidigt som styrenhetens sanna orientering exponeras med hjälp av dess interna orienteringssensorer. Många appar som använder styrenheter för att peka på och aktivera gränssnittselement kan fungera normalt när de är i ungefärlig noggrannhet utan att användaren märker det.

Resonemang om spårningstillstånd explicit

Appar som vill hantera positioner på olika sätt baserat på spårningstillstånd kan gå längre och inspektera egenskaper för kontrollantens tillstånd, till exempel SourceLossRisk och PositionAccuracy:

Spårningstillstånd SourceLossRisk PositionAccuracy TryGetPosition
Hög noggrannhet < 1.0 Hög true
Hög noggrannhet (riskerar att förloras) == 1,0 Hög true
Ungefärlig noggrannhet == 1,0 Ungefärlig true
Ingen position == 1,0 Ungefärlig falskt

Dessa spårningstillstånd för rörelsekontrollanter definieras på följande sätt:

  • Hög noggrannhet: Medan rörelsestyrenheten är inom headsetets synfält, ger den vanligtvis positioner med hög noggrannhet, baserat på visuell spårning. En rörlig styrenhet som tillfälligt lämnar synfältet eller tillfälligt skyms från headsetsensorerna (t.ex. av användarens andra hand) kommer att fortsätta att returnera högprecisionsställningar under en kort tid, baserat på tröghetsspårning av själva styrenheten.
  • Hög noggrannhet (riskerar att förloras): När användaren flyttar rörelsestyrenheten förbi kanten av headsetets synfält kommer headsetet snart inte att kunna spåra styrenhetens position visuellt. Appen vet när kontrollanten har nått den här FOV-gränsen genom att se SourceLossRisk nå 1.0. Då kan appen välja att pausa kontrollantgester som kräver en stadig ström av högkvalitativa poser.
  • Ungefärlig noggrannhet: När kontrollanten har förlorat visuell spårning tillräckligt länge, sjunker kontrollantens positioner till ungefärliga noggrannhetspositioner. I det här läget låser systemet styrenheten åt användaren och spårar användarens position när de rör sig, samtidigt som styrenhetens sanna orientering exponeras med hjälp av dess interna orienteringssensorer. Många appar som använder styrenheter för att peka på och aktivera gränssnittselement kan fungera som vanligt när de är i ungefärlig noggrannhet utan att användaren märker det. Appar med tyngre indatakrav kan välja att känna av den här minskningen från Hög noggrannhet till Ungefärlig noggrannhet genom att inspektera egenskapen PositionAccuracy , till exempel för att ge användaren en mer generös hitbox på off-screen-mål under den här tiden.
  • Ingen position: Även om styrenheten kan arbeta med ungefärlig noggrannhet under en lång tid, vet systemet ibland att inte ens en kroppslåst position är meningsfull för tillfället. Till exempel kan en styrenhet som har aktiverats aldrig ha observerats visuellt, eller så kan en användare lägga ner en kontrollant som sedan hämtas av någon annan. Vid dessa tillfällen ger systemet inte någon position till appen, och TryGetPosition returnerar false.

Vanliga Unity-API:er (Input.GetButton/GetAxis)

Namnområde: UnityEngine, UnityEngine.XR
Typer: Indata, XR. InputTracking

Unity använder för närvarande sina allmänna Input.GetButton/Input.GetAxis API:er för att exponera indata för Oculus SDK, OpenVR SDK och Windows Mixed Reality, inklusive händer och rörelsestyrenheter. Om din app använder dessa API:er för indata kan den enkelt stödja rörelsekontrollanter över flera XR SDK:er, inklusive Windows Mixed Reality.

Hämta en logisk knapps tryckläge

Om du vill använda de allmänna API:erna för Unity-indata börjar du vanligtvis med att koppla knappar och axlar till logiska namn i Unity Input Manager, binda en knapp eller axel-ID till varje namn. Du kan sedan skriva kod som refererar till den logiska knappen/axelnamnet.

Om du till exempel vill mappa den vänstra rörelsestyrenhetens utlösarknapp till åtgärden Skicka går du till Redigera > indata för projektinställningar > i Unity och expanderar egenskaperna för avsnittet Skicka under Axlar. Ändra egenskapen Positiv knapp eller Alt Positive Button för att läsa joystickknappen 14, så här:

Unitys InputManager
Unity InputManager

Skriptet kan sedan söka efter åtgärden Skicka med input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

Du kan lägga till fler logiska knappar genom att ändra egenskapen Storlek under Axlar.

Hämta en fysisk knapps tryckläge direkt

Du kan också komma åt knappar manuellt med deras fullständigt kvalificerade namn med hjälp av Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

Få en hand- eller rörelsekontrollants pose

Du kan komma åt styrenhetens position och rotation med hjälp av XR. InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Kommentar

Ovanstående kod representerar kontrollantens greppposition (där användaren innehar kontrollanten), vilket är användbart för att återge ett svärd eller en pistol i användarens hand, eller en modell av själva kontrollanten.

Relationen mellan den här grepppositionen och pekarens pose (där kontrollantens spets pekar) kan skilja sig åt mellan styrenheterna. Just nu är det bara möjligt att komma åt kontrollantens pekare via DET MR-specifika indata-API:et, som beskrivs i avsnitten nedan.

Windows-specifika API:er (XR. WSA. Indata)

Varning

Om projektet använder någon av XR:erna. WSA-API:er fasas ut till förmån för XR SDK i framtida Unity-versioner. För nya projekt rekommenderar vi att du använder XR SDK från början. Mer information om XR-indatasystemet och API:er finns här.

Namnområde: UnityEngine.XR.WSA.Input
Typer: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Om du vill få mer detaljerad information om Handindata för Windows Mixed Reality (för HoloLens) och rörelsestyrenheter kan du välja att använda Windows-specifika rumsliga indata-API:er under UnityEngine.XR.WSA.Input-namnområdet . På så sätt kan du komma åt ytterligare information, till exempel positionsnoggrannhet eller källtypen, så att du kan skilja händer och kontrollanter åt.

Avsökning för händers och rörelsekontrollanters tillstånd

Du kan söka efter den här ramens tillstånd för varje interaktionskälla (hand- eller rörelsestyrenhet) med metoden GetCurrentReading .

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Varje InteractionSourceState som du får tillbaka representerar en interaktionskälla för tillfället. InteractionSourceState visar information som:

  • Vilka typer av tryckningar som inträffar (Select/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Andra data som är specifika för rörelsestyrenheter, till exempel pekplattan och/eller tumstickans XY-koordinater och rörda tillstånd

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • InteractionSourceKind för att veta om källan är en hand eller en rörelsestyrenhet

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Avsökning för framåtsagda renderingspositioner

  • När du söker efter interaktionskällans data från händer och kontrollanter är de poser du får förutsagda poser för den tidpunkt då den här ramens fotoner kommer att nå användarens ögon. Framåtsagda poser används bäst för att återge kontrollanten eller ett kvarhållet objekt varje bildruta. Om du riktar in dig på ett visst tryck eller en viss version med kontrollanten är det mest exakt om du använder de historiska händelse-API:er som beskrivs nedan.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Du kan också få den framåtsagda huvudpositionen för den aktuella ramen. Precis som med källställningen är detta användbart för att återge en markör, men att rikta in sig på ett visst pressmeddelande eller en viss version är mest exakt om du använder de historiska händelse-API:er som beskrivs nedan.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Hantera händelser för interaktionskälla

Om du vill hantera indatahändelser när de inträffar med sina korrekta historiska posedata kan du hantera händelser för interaktionskällor i stället för avsökning.

Så här hanterar du interaktionskällans händelser:

  • Registrera dig för en InteractionManager-indatahändelse . För varje typ av interaktionshändelse som du är intresserad av måste du prenumerera på den.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Hantera händelsen. När du har prenumererat på en interaktionshändelse får du återanropet när det är lämpligt. I Exemplet SourcePressed visas detta efter att källan har identifierats och innan den släpps eller förloras.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

Sluta hantera en händelse

Du måste sluta hantera en händelse när du inte längre är intresserad av händelsen eller om du förstör objektet som prenumererar på händelsen. Om du vill sluta hantera händelsen avbryter du prenumerationen på händelsen.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Lista över händelser för interaktionskälla

De tillgängliga interaktionskällans händelser är:

  • InteractionSourceDetected (källan blir aktiv)
  • InteractionSourceLost (blir inaktiv)
  • InteractionSourcePressed (tryck, knapptryckning eller "Välj" har yttrats)
  • InteractionSourceReleased (slutet av ett tryck, en knapp som släppts eller slutet av "Välj" har yttrats)
  • InteractionSourceUpdated (flyttar eller ändrar på annat sätt något tillstånd)

Händelser för historisk inriktning utgör som bäst matchar ett pressmeddelande eller en version

De avsöknings-API:er som beskrevs tidigare ger appen förutsagda poser. Även om dessa förutsagda poser är bäst för att återge kontrollanten eller ett virtuellt handhållet objekt, är framtida poser inte optimala för mål, av två viktiga skäl:

  • När användaren trycker på en knapp på en styrenhet kan det finnas cirka 20 ms trådlös svarstid via Bluetooth innan systemet tar emot pressen.
  • Om du sedan använder en framåtsagd pose skulle ytterligare 10–20 ms framåtförutsägelse tillämpas för att rikta in sig på den tid då den aktuella ramens fotoner kommer att nå användarens ögon.

Det innebär att avsökningen ger dig en källposition eller huvudposition som är 30–40 ms framåt från där användarens huvud och händer faktiskt var tillbaka när pressen eller utgåvan skedde. För HoloLens-handindata, även om det inte finns någon trådlös överföringsfördröjning, finns det en liknande bearbetningsfördröjning för att identifiera pressen.

Om du vill rikta in dig korrekt baserat på användarens ursprungliga avsikt för en hand- eller kontrollantpress bör du använda den historiska källpositionen eller huvudpositionen från interaktionskällanPressad eller InteractionSourceReleased-indatahändelsen.

Du kan rikta ett pressmeddelande eller en utgåva med historiska posedata från användarens huvud eller deras kontrollant:

  • Huvudställningen vid den tidpunkt då en gest eller kontrollanttryck inträffade, som kan användas för att rikta in sig på för att avgöra vad användaren tittade på:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • Källställningen vid den tidpunkt då en rörelsekontrollant tryckte på, som kan användas för att fastställa vad användaren riktade styrenheten mot. Det här är tillståndet för kontrollanten som upplevde pressen. Om du återger själva kontrollanten kan du begära pekarens pose i stället för greppet, för att skjuta målstrålen från vad användaren kommer att betrakta som den renderade kontrollantens naturliga spets:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Exempel på händelsehanterare

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Rörelsekontrollanter i MRTK

Du kan komma åt gest- och rörelsestyrenheten från indatahanteraren.

Följ med i självstudier

Stegvisa självstudier, med mer detaljerade anpassningsexempel, finns i Mixed Reality Academy:

MR-indata 213 – rörelsestyrenhet
MR-indata 213 – rörelsestyrenhet

Nästa kontrollpunkt för utveckling

Om du följer unity-utvecklingsresan som vi har lagt fram är du mitt uppe i att utforska MRTK-kärnbyggnadsblocken. Härifrån kan du fortsätta till nästa byggblock:

Eller hoppa till funktioner och API:er för Mixed Reality-plattformen:

Du kan alltid gå tillbaka till Unity-utvecklingspunkterna när som helst.

Se även