Delen via


Bewegingscontrollers in Unity

Er zijn twee belangrijke manieren om actie te ondernemen op uw blik in Unity, handbewegingen en bewegingscontrollers in HoloLens en Immersive HMD. U opent de gegevens voor beide bronnen van ruimtelijke invoer via dezelfde API's in Unity.

Unity biedt twee primaire manieren om toegang te krijgen tot ruimtelijke invoergegevens voor Windows Mixed Reality. De algemene API's Input.GetButton/Input.GetAxis werken in meerdere Unity XR SDK's, terwijl de InteractionManager/GestureRecognizer-API die specifiek is voor Windows Mixed Reality, de volledige set ruimtelijke invoergegevens beschikbaar maakt.

Unity XR-invoer-API's

Voor nieuwe projecten raden we u aan de nieuwe XR-invoer-API's vanaf het begin te gebruiken.

Hier vindt u meer informatie over de XR-API's.

Toewijzingstabel voor Unity-knop/-as

Input Manager voor Windows Mixed Reality-bewegingscontrollers van Unity ondersteunt de onderstaande knop- en as-id's via de Input.GetButton/GetAxis-API's . De kolom 'Windows MR-specifiek' verwijst naar eigenschappen die beschikbaar zijn op basis van het type InteractionSourceState . Elk van deze API's wordt uitgebreid beschreven in de onderstaande secties.

De toewijzingen van knop-/as-id's voor Windows Mixed Reality komen doorgaans overeen met de Oculus-knop-/as-id's.

De toewijzingen van knop-/as-id's voor Windows Mixed Reality verschillen van de toewijzingen van OpenVR op twee manieren:

  1. De toewijzing maakt gebruik van touchpad-id's die verschillen van duimstick, ter ondersteuning van controllers met zowel thumbsticks als touchpads.
  2. De toewijzing voorkomt dat de A- en X-knop-id's voor de menuknoppen overbelast raken om ze beschikbaar te laten voor de fysieke ABXY-knoppen.
Invoer Algemene Unity-API's
(Input.GetButton/GetAxis)
Windows MR-specifieke invoer-API
(XR. WSA. Invoer)
Linkerhand Rechterhand
Selecteer de trigger ingedrukt As 9 = 1,0 As 10 = 1,0 selectPressed
Analoge triggerwaarde selecteren As 9 As 10 selectPressedAmount
Selecteer de trigger die gedeeltelijk is ingedrukt Knop 14 (gamepad compat) Knop 15 (gamepad compat) selectPressedAmount > 0.0
Menuknop ingedrukt Knop 6* Knop 7* menu Ingedrukt
Greepknop ingedrukt As 11 = 1,0 (geen analoge waarden)
Knop 4 (gamepad compat)
As 12 = 1,0 (geen analoge waarden)
Knop 5 (gamepad compat)
Begrepen
Duimstick X (links: -1.0, rechts: 1.0) As 1 As 4 thumbstickPosition.x
Duimstick Y (boven: -1.0, onder: 1.0) As 2 As 5 thumbstickPosition.y
Duimstick ingedrukt Knop 8 Knop 9 thumbstickPressed
Touchpad X (links: -1.0, rechts: 1.0) As 17* As 19* touchpadPosition.x
Touchpad Y (boven: -1.0, onder: 1.0) As 18* As 20* touchpadPosition.y
Touchpad aangeraakt Knop 18* Knop 19* touchpadTouched
Touchpad ingedrukt Knop 16* Knop 17* touchpadPressed
6DoF grip pose of pointer pose Alleen grip pose: XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Grip of aanwijzer doorgeven als argument: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Traceringsstatus Positienauwkeurigheid en risico van bronverlies alleen beschikbaar via MR-specifieke API sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Notitie

Deze knop-/as-id's verschillen van de id's die Unity gebruikt voor OpenVR vanwege conflicten in de toewijzingen die worden gebruikt door gamepads, Oculus Touch en OpenVR.

OpenXR

Als u meer wilt weten over mixed reality-interacties in Unity, gaat u naar de Unity Manual voor Unity XR Input. Deze Unity-documentatie bevat informatie over de toewijzingen van controllerspecifieke invoer naar meer generaliseerbare InputFeatureUsages, hoe beschikbare XR-invoer kan worden geïdentificeerd en gecategoriseerd, hoe gegevens uit deze invoer kunnen worden gelezen en meer.

De Mixed Reality OpenXR-invoegtoepassing biedt aanvullende invoerinteractieprofielen die zijn toegewezen aan standaard InputFeatureUsages, zoals hieronder wordt beschreven:

InputFeatureUsage HP Reverb G2 Controller (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Joystick - Klik op
activeren Activator
greep Greep Luchtkraan of knijp
primaryButton [X/A] - Druk op Tikken in de lucht
secondaryButton [Y/B] - Druk op
gripButton Grip - Druk op
triggerButton Trigger - Druk op
menuButton Menu

Grip pose vs. pointing pose

Windows Mixed Reality ondersteunt bewegingscontrollers in verschillende vormfactoren. Het ontwerp van elke controller verschilt in de relatie tussen de handpositie van de gebruiker en de natuurlijke 'voorwaartse' richting die apps moeten gebruiken om aan te wijzen bij het weergeven van de controller.

Om deze controllers beter weer te geven, zijn er twee soorten poses die u kunt onderzoeken voor elke interactiebron, de houding van de grip en de aanwijzer. Zowel de greephouding als de pointerhoudingcoördinaten worden uitgedrukt door alle Unity-API's in globale Unity-wereldcoördinaten.

Houding van grip

De griphouding vertegenwoordigt de locatie van de gebruikerspalm, ofwel gedetecteerd door een HoloLens of het vasthouden van een bewegingscontroller.

Op insluitende headsets wordt de griphouding het beste gebruikt om de hand van de gebruiker of een object in de hand van de gebruiker weer te geven. De griphouding wordt ook gebruikt bij het visualiseren van een bewegingscontroller. Het renderbare model van Windows voor een bewegingscontroller maakt gebruik van de griphouding als oorsprong en draaiingscentrum.

De griphouding wordt als volgt gedefinieerd:

  • De grippositie: De palmcentid wanneer de controller van nature vasthoudt, links of rechts aangepast om de positie binnen de grip te centreren. Op de Windows Mixed Reality-bewegingscontroller wordt deze positie over het algemeen uitgelijnd met de knop Grip.
  • De rechteras van de gripstand: Wanneer u uw hand volledig opent om een platte 5-vingerpositie te vormen, is de straal die normaal is voor uw palm (vooruit van linkerpalm, achteruit van rechterpalm)
  • De stand van de gripstand: Wanneer u uw hand gedeeltelijk sluit (alsof u de controller vasthoudt), wijst de straal die "vooruit" wijst door de buis die is gevormd door uw niet-duimvingers.
  • De as Omhoog van de gripstand: de as Omhoog die wordt geïmpliceerd door de definities Rechts en Doorsturen.

U hebt toegang tot de griphouding via de input-API van Unity (XR) voor meerdere leveranciers. InputTracking. GetLocalPosition/Rotation) of via de SPECIFIEKE WINDOWS MR-API (sourceState.sourcePose.TryGetPosition/Rotation, posegegevens aanvragen voor het Grip-knooppunt ).

Aanwijzerpositie

De aanwijzer stelt de punt van de controller voor die vooruit wijst.

De door het systeem geleverde pointerhouding wordt het beste gebruikt voor raycast wanneer u het controllermodel zelf weergeeft. Als u een ander virtueel object weergeeft in plaats van de controller, zoals een virtueel wapen, moet u wijzen met een stralen die het meest natuurlijk is voor dat virtuele object, zoals een straal die langs het vat van het door de app gedefinieerde wapenmodel reist. Omdat gebruikers het virtuele object en niet de fysieke controller kunnen zien, is het wijzen met het virtuele object waarschijnlijk natuurlijker voor gebruikers die uw app gebruiken.

Op dit moment is de aanwijzer alleen beschikbaar in Unity via de WINDOWS MR-specifieke API, sourceState.sourcePose.TryGetPosition/Rotation, die als argument wordt doorgegeven in InteractionSourceNode.Pointer .

OpenXR

U hebt toegang tot twee sets poses via OpenXR-invoerinteracties:

  • De grip vormt voor het weergeven van objecten in de hand
  • Het doel is om naar de wereld te wijzen.

Meer informatie over dit ontwerp en de verschillen tussen de twee poses vindt u in de OpenXR-specificatie - Invoersubpaden.

Poses geleverd door de InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity en DeviceAngularVelocity vertegenwoordigen allemaal de OpenXR grip pose. InputFeatureUsages met betrekking tot griphoudingen worden gedefinieerd in CommonUsages van Unity.

Poses geleverd door inputFeatureUsages PointerPosition, PointerRotation, PointerVelocity en PointerAngularVelocity vertegenwoordigen allemaal de OpenXR-doelhouding. Deze InputFeatureUsages zijn niet gedefinieerd in opgenomen C#-bestanden, dus u moet als volgt uw eigen InputFeatureUsages definiëren:

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

Haptiek

Voor informatie over het gebruik van haptiek in het XR-invoersysteem van Unity vindt u documentatie in de Unity Manual for Unity XR Input - Haptics.

Status van controllertracering

Net als de headsets vereist de Windows Mixed Reality-bewegingscontroller geen installatie van externe traceringssensoren. In plaats daarvan worden de controllers bijgehouden door sensoren in de headset zelf.

Als de gebruiker de controllers uit het weergaveveld van de headset verplaatst, blijft Windows de controllerposities in de meeste gevallen afleiden. Wanneer de controller het bijhouden van visuele elementen lang genoeg heeft verloren, zullen de posities van de controller dalen tot de nauwkeurigheidsposities bij benadering.

Op dit moment vergrendelt het systeem de controller met de hoofdtekst naar de gebruiker, waarbij de positie van de gebruiker wordt bijgehouden terwijl de werkelijke stand van de controller nog steeds wordt weergegeven met behulp van de interne oriëntatiesensoren. Veel apps die gebruikmaken van controllers om ui-elementen aan te wijzen en te activeren, kunnen normaal werken, terwijl ze bij benadering nauwkeurig zijn zonder dat de gebruiker iets merkt.

Redenering over traceringsstatus expliciet

Apps die posities op verschillende manieren willen behandelen op basis van de traceringsstatus, kunnen verder gaan en eigenschappen controleren op de status van de controller, zoals SourceLossRisk en PositionAccuracy:

Traceringsstatus SourceLossRisk PositionAccuracy TryGetPosition
Hoge nauwkeurigheid < 1.0 Hoog true
Hoge nauwkeurigheid (risico op verlies) == 1,0 Hoog true
Nauwkeurigheid bij benadering == 1,0 Benaderen true
Geen positie == 1,0 Benaderen false

Deze statussen voor het bijhouden van bewegingscontrollers worden als volgt gedefinieerd:

  • Hoge nauwkeurigheid: hoewel de bewegingscontroller zich in het gezichtsveld van de headset bevindt, biedt het over het algemeen hoge nauwkeurigheidsposities, op basis van visuele tracking. Een bewegende controller die het gezichtsveld tijdelijk verlaat of tijdelijk wordt verborgen door de headsetsensoren (bijvoorbeeld door de andere gebruiker), blijft gedurende korte tijd hoge nauwkeurigheidsposities retourneren, op basis van inertiële tracering van de controller zelf.
  • Hoge nauwkeurigheid (risico op verlies): wanneer de gebruiker de bewegingscontroller voorbij de rand van het gezichtsveld van de headset beweegt, kan de headset binnenkort de positie van de controller niet visueel volgen. De app weet wanneer de controller deze FOV-grens heeft bereikt door de SourceLossRisk 1.0 te zien. Op dat moment kan de app ervoor kiezen om controllerbewegingen te onderbreken waarvoor een constante stroom van hoge kwaliteit houdingen vereist is.
  • Geschatte nauwkeurigheid: wanneer de controller het bijhouden van visuele elementen lang genoeg heeft verloren, zullen de posities van de controller dalen tot de nauwkeurigheidsposities bij benadering. Op dit moment vergrendelt het systeem de controller met de hoofdtekst naar de gebruiker, waarbij de positie van de gebruiker wordt bijgehouden terwijl de werkelijke stand van de controller nog steeds wordt weergegeven met behulp van de interne oriëntatiesensoren. Veel apps die gebruikmaken van controllers om ui-elementen aan te wijzen en te activeren, kunnen normaal werken, terwijl ze bij benadering nauwkeurig zijn zonder dat de gebruiker iets merkt. Apps met zwaardere invoervereisten kunnen ervoor kiezen om deze daling van hoge nauwkeurigheid in geschatte nauwkeurigheid te begrijpen door de eigenschap PositionAccuracy te inspecteren, bijvoorbeeld om de gebruiker gedurende deze tijd een ruimer hitbox op off-screen doelen te geven.
  • Geen positie: hoewel de controller lange tijd op een geschatte nauwkeurigheid kan werken, weet het systeem soms dat zelfs een vergrendelde lichaamspositie op dit moment niet zinvol is. Een controller die is ingeschakeld, is bijvoorbeeld nooit visueel waargenomen of een gebruiker kan een controller neerzetten die vervolgens door iemand anders wordt opgehaald. Op die momenten biedt het systeem geen positie aan de app en retourneert TryGetPosition onwaar.

Common Unity-API's (Input.GetButton/GetAxis)

Naamruimte: UnityEngine, UnityEngine.XR
Typen: Invoer, XR. InputTracking

Unity maakt momenteel gebruik van de algemene Input.GetButton/Input.GetAxis-API's om invoer beschikbaar te maken voor de Oculus SDK, de OpenVR SDK en Windows Mixed Reality, inclusief hands- en bewegingscontrollers. Als uw app deze API's gebruikt voor invoer, kan deze eenvoudig bewegingscontrollers ondersteunen voor meerdere XR-SDK's, waaronder Windows Mixed Reality.

De status van een logische knop ophalen

Als u de algemene Unity-invoer-API's wilt gebruiken, begint u meestal met het bedraden van knoppen en assen naar logische namen in Unity Input Manager, waarbij u een knop- of as-id's aan elke naam bindt. Vervolgens kunt u code schrijven die verwijst naar de naam van die logische knop/as.

Als u bijvoorbeeld de triggerknop van de linkerbewegingscontroller wilt toewijzen aan de actie Verzenden, gaat u naar Projectinstellingeninvoer > bewerken > in Unity en vouwt u de eigenschappen van de sectie Verzenden onder Assen uit. Wijzig de eigenschap Positieve knop of Alt Positive Button om de stickknop 14 te lezen, zoals hieronder:

InputManager van Unity
Unity InputManager

Uw script kan vervolgens controleren op de actie Verzenden met behulp van Input.GetButton:

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

U kunt meer logische knoppen toevoegen door de eigenschap Grootte onder Assen te wijzigen.

De drukstatus van een fysieke knop rechtstreeks ophalen

U kunt ook handmatig toegang krijgen tot knoppen op basis van hun volledig gekwalificeerde naam met behulp van Input.GetKey:

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

De houding van een hand- of bewegingscontroller krijgen

U kunt de positie en draaiing van de controller openen met behulp van XR. InputTracking:

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

Notitie

De bovenstaande code vertegenwoordigt de griphouding van de controller (waarbij de gebruiker de controller vasthoudt), wat handig is voor het weergeven van een zwaard of wapen in de hand van de gebruiker, of een model van de controller zelf.

De relatie tussen deze griphouding en de aanwijzerpositie (waarbij de punt van de controller wijst) kan verschillen tussen controllers. Op dit moment is het openen van de aanwijzerpositie van de controller alleen mogelijk via de MR-specifieke invoer-API, zoals beschreven in de onderstaande secties.

Windows-specifieke API's (XR. WSA. Invoer)

Let op

Als uw project een van de XR gebruikt. WSA-API's, deze worden uitgefaseerd ten gunste van de XR SDK in toekomstige Unity-releases. Voor nieuwe projecten raden we u aan de XR SDK vanaf het begin te gebruiken. Hier vindt u meer informatie over het XR-invoersysteem en API's.

Naamruimte: UnityEngine.XR.WSA.Input
Typen: InteractionManager, InteractionSourceState, InteractionSourceState, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Voor gedetailleerdere informatie over handinvoer van Windows Mixed Reality (voor HoloLens) en bewegingscontrollers kunt u ervoor kiezen om de Windows-specifieke ruimtelijke invoer-API's te gebruiken onder de UnityEngine.XR.WSA.Input-naamruimte . Hiermee hebt u toegang tot aanvullende informatie, zoals positienauwkeurigheid of het brontype, zodat u handen en controllers kunt onderscheiden.

Polling voor de status van handen en bewegingscontrollers

U kunt peilen naar de status van dit frame voor elke interactiebron (hand- of bewegingscontroller) met behulp van de methode GetCurrentReading .

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

Elke InteractionSourceState die u terugkrijgt, vertegenwoordigt een interactiebron op het huidige moment in de tijd. De InteractionSourceState toont informatie zoals:

  • Welke soorten persen zich voordoen (Select/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Andere gegevens die specifiek zijn voor bewegingscontrollers, zoals de XY-coördinaten van de touchpad en/of duimstick en de aangeraakte status

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • De InteractionSourceKind om te weten of de bron een hand of een bewegingscontroller is

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

Polling voor doorstuur voorspelde renderinghoudingen

  • Wanneer u pollingt naar interactiebrongegevens van handen en controllers, zijn de houdingen die u krijgt, voor het moment in de tijd dat de fotonen van dit frame de ogen van de gebruiker bereiken. Vooruit voorspelde poses kunnen het beste worden gebruikt voor het weergeven van de controller of een vastgehouden object per frame. Als u zich richt op een bepaalde pers of release met de controller, is dat het meest nauwkeurig als u de api's voor historische gebeurtenissen gebruikt die hieronder worden beschreven.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • U kunt ook de vooruit voorspelde hoofdhouding voor dit huidige frame krijgen. Net als bij de bronhouding is dit handig voor het weergeven van een cursor, hoewel het richten op een bepaalde pers of release het meest nauwkeurig is als u de historische gebeurtenis-API's gebruikt die hieronder worden beschreven.

    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;
         // ...
    }
    

Interactiebronevenementen verwerken

Als u invoerevenementen wilt afhandelen wanneer deze plaatsvinden met de nauwkeurige historische posegegevens, kunt u interactiebronevenementen afhandelen in plaats van polling.

Ga als volgende te werk om interactiebron gebeurtenissen te verwerken:

  • Registreer u voor een InteractionManager-invoerevenement . Voor elk type interactie-gebeurtenis waarin u geïnteresseerd bent, moet u zich hierop abonneren.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • De gebeurtenis afhandelen. Zodra u zich hebt geabonneerd op een interactiegebeurtenis, krijgt u de callback zo nodig. In het voorbeeld SourcePressed is dit nadat de bron is gedetecteerd en voordat deze wordt vrijgegeven of verloren gaat.

    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
    }
    

Stoppen met het afhandelen van een gebeurtenis

U moet stoppen met het afhandelen van een gebeurtenis wanneer u niet meer geïnteresseerd bent in de gebeurtenis of als u het object vernietigt dat is geabonneerd op de gebeurtenis. Als u de verwerking van de gebeurtenis wilt stoppen, meldt u zich af van de gebeurtenis.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Lijst met gebeurtenissen van interactiebron

De beschikbare gebeurtenissen voor interactiebron zijn:

  • InteractionSourceDetected (bron wordt actief)
  • InteractionSourceLost (wordt inactief)
  • InteractionSourcePressed (tikken, drukken op de knop of 'Selecteren' uiting)
  • InteractionSourceReleased (einde van een tik, knop vrijgegeven of einde van 'Selecteren' uiting)
  • InteractionSourceUpdated (verplaatst of een andere status wijzigt)

Gebeurtenissen voor historische doelposities die het meest nauwkeurig overeenkomen met een pers of release

De polling-API's die eerder zijn beschreven, geven uw app vooraf voorspelde poses. Hoewel deze voorspelde poses het beste zijn voor het weergeven van de controller of een virtueel handheld-object, zijn toekomstige poses niet optimaal voor targeting, om twee belangrijke redenen:

  • Wanneer de gebruiker op een knop op een controller drukt, kan er ongeveer 20 ms draadloze latentie via Bluetooth zijn voordat het systeem de druk ontvangt.
  • Als u vervolgens een vooruit voorspelde houding gebruikt, zou er nog eens 10-20 ms aan forward voorspelling worden toegepast op het tijdstip waarop de fotonen van het huidige frame de ogen van de gebruiker bereiken.

Dit betekent dat polling u een bronhouding of hoofdhouding geeft die 30-40 ms vooruit is vanaf waar het hoofd en de handen van de gebruiker daadwerkelijk terug waren toen de pers of release plaatsvond. Voor handinvoer van HoloLens, terwijl er geen draadloze transmissievertraging is, is er een vergelijkbare verwerkingsvertraging om de pers te detecteren.

Als u zich nauwkeurig wilt richten op basis van de oorspronkelijke intentie van de gebruiker voor een hand- of controllerpers, moet u de historische bronhouding of hoofdhouding van die inputgebeurtenis InteractionSourcePressed of InteractionSourceReleased gebruiken.

U kunt zich richten op een pers of release met historische posegegevens van het hoofd of de controller van de gebruiker:

  • De hoofdhouding op het moment waarop een beweging of controllerpers heeft plaatsgevonden, die kan worden gebruikt om te bepalen waar de gebruiker naar keek:

    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;
             // ...
         }
    }
    
  • De bronhouding op het moment waarop een bewegingscontroller optrad, die kan worden gebruikt om te bepalen waar de gebruiker de controller op wijst. Dit is de status van de controller die de pers heeft ervaren. Als u de controller zelf weergeeft, kunt u de aanwijzerpositie aanvragen in plaats van de griphouding om de doelstraal te schieten van wat de gebruiker de natuurlijke tip van die gerenderde controller beschouwt:

    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;
                 // ...
             }
         }
    }
    

Voorbeeld van gebeurtenis-handlers

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.
}

Bewegingscontrollers in MRTK

U kunt beweging en bewegingscontroller openen vanuit de invoerbeheer.

Volg de zelfstudies

Stapsgewijze zelfstudies, met meer gedetailleerde aanpassingsvoorbeelden, zijn beschikbaar in de Mixed Reality Academy:

MR Input 213 - Bewegingscontroller
MR Input 213 - Bewegingscontroller

Volgend controlepunt voor ontwikkeling

Als u het Unity-ontwikkeltraject volgt dat we hebben opgesteld, bevindt u zich midden in het verkennen van de bouwstenen van de MRTK-kern. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar de mogelijkheden en API's van het Mixed Reality-platform:

U kunt altijd op elk gewenst moment teruggaan naar de Unity-ontwikkelingscontrolepunten .

Zie ook