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 hebt toegang tot 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 Input.GetButton/Input.GetAxis API's werken op 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 vanaf het begin de nieuwe XR-invoer-API's te gebruiken.

Meer informatie over de XR-API's vindt u hier.

Toewijzingstabel voor Unity-knop/as

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

De knop-/as-id-toewijzingen voor Windows Mixed Reality over het algemeen overeenkomen met de Oculus-knop-/as-id's.

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

  1. De toewijzing maakt gebruik van touchpad-id's die verschillen van duimstick, om controllers met zowel duimsticks als touchpads te ondersteunen.
  2. De toewijzing voorkomt dat de A- en X-knop-id's voor de menuknoppen overbelast raken, zodat ze beschikbaar blijven voor de fysieke ABXY-knoppen.
Invoer Algemene Unity-API's
(Input.GetButton/GetAxis)
Windows MR-specifieke invoer-API
(XR. WSA. Invoer)
Linkerhand Rechterhand
Selecteer trigger ingedrukt As 9 = 1,0 As 10 = 1,0 selecteer Ingedrukt
Analoge waarde activeren selecteren As 9 As 10 selectPressedAmount
Selecteer de trigger die gedeeltelijk is ingedrukt Knop 14 (gamepadcompatibil) Knop 15 (gamepadcompatibil) selectPressedAmount > 0.0
Menuknop ingedrukt Knop 6* Knop 7* menu Ingedrukt
Gripknop ingedrukt As 11 = 1,0 (geen analoge waarden)
Knop 4 (gamepadcompend)
As 12 = 1,0 (geen analoge waarden)
Knop 5 (gamepadcompatibil)
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 duimstick Ingedrukt
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* touchpad Ingedrukt
6DoF grippositie of aanwijzerpositie Alleen grippositie : XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Grip ofaanwijzer doorgeven als argument: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Status bijhouden Positienauwkeurigheid en risico van bronverlies alleen beschikbaar via MR-specifieke API sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Opmerking

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

OpenXR

Ga naar de Unity Manual for Unity XR Input (Unity-handleiding voor Unity XR-invoer) voor meer informatie over mixed reality-interacties in Unity. Deze Unity-documentatie behandelt de toewijzingen van controllerspecifieke invoer tot 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 extra invoerinteractieprofielen, toegewezen aan standaard InputFeatureUsages, zoals hieronder wordt beschreven:

InputFeatureUsage HP Reverb G2 Controller (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Joystick - Klikken
Trigger Trigger
Grip Grip Lucht tikken of knijpen
primaryButton [X/A] - Druk op Luchtkraan
secondaryButton [Y/B] - Druk op
gripButton Grip - Pers
triggerButton Trigger - Druk op
menuButton Menu

Griphouding versus aanwijzende houding

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

Om deze controllers beter weer te geven, zijn er twee soorten houdingen die u kunt onderzoeken voor elke interactiebron: de greeppositie en de aanwijzerpositie. Zowel de coördinaten van de grippositie als de aanwijzer worden uitgedrukt door alle Unity-API's in globale Unity-wereldcoördinaten.

Greeppositie

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

Op insluitende headsets kan de grippositie het beste worden gebruikt om de hand van de gebruiker of een object in de hand van de gebruiker weer te geven. De grippositie wordt ook gebruikt bij het visualiseren van een bewegingscontroller. Het renderbare model van Windows voor een bewegingscontroller gebruikt de greeppositie als oorsprong en draaipunt.

De grippositie wordt specifiek als volgt gedefinieerd:

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

U hebt toegang tot de grippositie via de XR (Cross-Vendor Input API) van Unity. InputTracking. GetLocalPosition/Rotation) of via de Windows MR-specifieke API (sourceState.sourcePose.TryGetPosition/Rotation, het aanvragen van posegegevens voor het Grip-knooppunt ).

Aanwijzerpositie

De positie van de aanwijzer vertegenwoordigt de punt van de controller die naar voren wijst.

De door het systeem opgegeven aanwijzerpositie kan het beste worden gebruikt om te raycasten wanneer u het controllermodel zelf weergeeft. Als u een ander virtueel object weergeeft in plaats van de controller, zoals een virtueel pistool, moet u een straal aanwijzen die het meest natuurlijk is voor dat virtuele object, zoals een straal die langs de loop van het door de app gedefinieerde pistoolmodel gaat. Omdat gebruikers het virtuele object kunnen zien en niet de fysieke controller, is het aanwijzen van het virtuele object waarschijnlijk natuurlijker voor degenen die uw app gebruiken.

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

OpenXR

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

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

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

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

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

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

Haptics

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

Status van controllertracering

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

Als de gebruiker de controllers uit het gezichtsveld van de headset verplaatst, blijft Windows in de meeste gevallen de positie van de controller afleiden. Wanneer de controller de visuele tracering lang genoeg heeft verloren, zullen de posities van de controller afnemen tot posities met een geschatte nauwkeurigheid.

Op dit moment vergrendelt het systeem de controller voor de gebruiker, waarbij de positie van de gebruiker wordt gevolgd terwijl deze zich verplaatst, terwijl de werkelijke richting 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 het doorheegt.

Redenering over het expliciet bijhouden van de status

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

Status bijhouden SourceLossRisk PositionAccuracy TryGetPosition
Hoge nauwkeurigheid < 1.0 Hoog Waar
Hoge nauwkeurigheid (risico op verlies) == 1,0 Hoog Waar
Geschatte nauwkeurigheid == 1,0 Geschatte Waar
Geen positie == 1,0 Geschatte Valse

Deze bewegingscontrollerstatussen worden als volgt gedefinieerd:

  • Hoge nauwkeurigheid: Hoewel de bewegingscontroller zich in het gezichtsveld van de headset bevindt, biedt deze over het algemeen zeer nauwkeurige posities op basis van visuele tracking. Een bewegende controller die tijdelijk het gezichtsveld verlaat of tijdelijk wordt verborgen voor de headsetsensoren (bijvoorbeeld door de andere hand van de gebruiker) blijft gedurende korte tijd zeer nauwkeurige houdingen 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 verplaatst, kan de headset binnenkort de positie van de controller niet meer visueel volgen. De app weet wanneer de controller deze FOV-grens heeft bereikt door het SourceLossRisk-bereik 1.0 te zien. Op dat moment kan de app ervoor kiezen om controllerbewegingen te onderbreken waarvoor een gestage stroom van hoogwaardige poses is vereist.
  • Nauwkeurigheid bij benadering: Wanneer de controller de visuele tracering lang genoeg heeft verloren, zullen de posities van de controller afnemen tot posities met een geschatte nauwkeurigheid. Op dit moment vergrendelt het systeem de controller voor de gebruiker, waarbij de positie van de gebruiker wordt gevolgd terwijl deze zich verplaatst, terwijl de werkelijke richting 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 bij benadering nauwkeurig werken zonder dat de gebruiker het doorheegt. Apps met zwaardere invoervereisten kunnen ervoor kiezen om deze daling van Hoge nauwkeurigheid naar Geschatte nauwkeurigheid te herkennen door de eigenschap PositionAccuracy te inspecteren, bijvoorbeeld om de gebruiker in deze periode een genereuzer hitbox te geven voor doelen buiten het scherm.
  • Geen positie: Hoewel de controller lange tijd bij benadering nauwkeurig kan werken, weet het systeem soms dat zelfs een met de body vergrendelde positie op dit moment niet zinvol is. Een ingeschakelde controller is bijvoorbeeld mogelijk nooit visueel waargenomen of een gebruiker kan een controller neerzetten die vervolgens door iemand anders wordt opgehaald. Op die momenten geeft het systeem geen positie aan de app en retourneert TryGetPosition false.

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

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

Unity gebruikt momenteel 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 handen en bewegingscontrollers. Als uw app deze API's voor invoer gebruikt, kan deze eenvoudig bewegingscontrollers ondersteunen in meerdere XR SDK's, waaronder Windows Mixed Reality.

De status van een logische knop indrukken

Als u de algemene Unity-invoer-API's wilt gebruiken, begint u meestal door knoppen en assen te verbinden met logische namen in Unity Input Manager, waarbij u een knop of as-id's aan elke naam bindt. U kunt vervolgens 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-positieve knop om joystickknop 14 te lezen, zoals dit:

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 status van een fysieke knop rechtstreeks indrukken

U kunt knoppen ook handmatig openen met hun volledig gekwalificeerde naam, met behulp van Input.GetKey:

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

De positie van een hand of bewegingscontroller krijgen

U hebt toegang tot de positie en draaiing van de controller met behulp van XR. InputTracking:

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

Opmerking

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

De relatie tussen deze greeppositie en de aanwijzerpositie (waar de punt van de controller wijst) kan per controller verschillen. Op dit moment is toegang tot de aanwijzerpositie van de controller alleen mogelijk via de MR-specifieke invoer-API, die in de onderstaande secties wordt beschreven.

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

Voorzichtigheid

Als uw project een van de XR gebruikt. WSA-API's, deze worden geleidelijk 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. Meer informatie over het XR-invoersysteem en API's vindt u hier.

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

Als u gedetailleerdere informatie wilt over Windows Mixed Reality handinvoer (voor HoloLens) en bewegingscontrollers, kunt u ervoor kiezen om de Windows-specifieke ruimtelijke invoer-API's te gebruiken onder de naamruimte UnityEngine.XR.WSA.Input. Hiermee hebt u toegang tot aanvullende informatie, zoals positienauwkeurigheid of het brontype, zodat u handen en controllers van elkaar 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 geeft informatie weer zoals:

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

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

    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 voorwaarts voorspelde renderingsposities

  • Wanneer u pollt naar interactiebrongegevens van handen en controllers, zijn de poses die u krijgt naar voren voorspelde poses voor het moment in de tijd dat de fotonen van dit frame de ogen van de gebruiker bereiken. Voorwaarts voorspelde houdingen 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 historische gebeurtenis-API's 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 naar voren voorspelde hoofdhouding voor dit huidige frame krijgen. Net als bij de bronpositie 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;
         // ...
    }
    

Interactiebron-gebeurtenissen verwerken

Als u invoerevenementen wilt afhandelen terwijl deze plaatsvinden met hun nauwkeurige historische posegegevens, kunt u interactiebron-gebeurtenissen afhandelen in plaats van polling.

Interactiebron-gebeurtenissen afhandelen:

  • Registreer u voor een InteractionManager-invoer-gebeurtenis. 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 indien nodig. In het voorbeeld SourcePressed is dit nadat de bron is gedetecteerd en voordat deze is vrijgegeven of verloren is gegaan.

    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
    }
    

De verwerking van een gebeurtenis stoppen

U moet stoppen met het verwerken van een gebeurtenis wanneer u niet langer 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, moet u zich afmelden voor de gebeurtenis.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Lijst met interactiebron-gebeurtenissen

De beschikbare interactiebron-gebeurtenissen zijn:

  • InteractionSourceDetected (bron wordt actief)
  • InteractionSourceLost (wordt inactief)
  • InteractionSourcePressed (tik, druk op de knop of selecteer uit)
  • InteractionSourceReleased (einde van een tik, knop vrijgegeven of einde van 'Selecteren')
  • InteractionSourceUpdated (verplaatst of wijzigt een bepaalde status)

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

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

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

Dit betekent dat polling u een bronpositie of hoofdpositie geeft die 30-40 ms vooruit is van waar het hoofd en de handen van de gebruiker daadwerkelijk terug waren toen de pers of release plaatsvond. Voor HoloLens handinvoer is er geen vertraging bij draadloze verzending, maar er is een vergelijkbare verwerkingsvertraging om de pers te detecteren.

Als u nauwkeurig wilt targeten op basis van de oorspronkelijke intentie van de gebruiker voor een hand- of controllerdruk, moet u de historische bronpositie of hoofdhouding van die InteractionSourcePressed - of InteractionSourceReleased-invoergebeurtenis gebruiken.

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

  • De hoofdpositie op het moment dat een beweging of controller-druk optrad, 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 bronpositie bevindt zich op het moment dat er een bewegingscontroller is opgetreden, die kan worden gebruikt om te bepalen waarnaar de gebruiker de controller heeft gericht. 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 grippositie, om de doelstraal af te schieten van wat de gebruiker beschouwt als de natuurlijke tip van die gerenderde controller:

    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 hebt toegang tot de bewegings- en bewegingscontroller vanuit 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-ontwikkelingstraject volgt dat we hebben uitgetekend, bent u bezig met het verkennen van de basisbouwstenen van MRTK. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

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

Zie ook