Mozgásvezérlők a Unityben

A Unitybenkét fő módon lehet a unityben, a kézmozdulatok és a mozgásvezérlők a HoloLens és a Modern HMD-ben. A térbeli bemenet mindkét forrásának adatait ugyanazokon az API-kon keresztül férheti hozzá a Unityben.

A Unity két elsődleges módszert kínál a térbeli bemeneti adatok eléréséhez Windows Mixed Reality. A közös Input.GetButton/Input.GetAxis API-k több Unity XR-SDK-n működnek, míg az Windows Mixed Reality-ra jellemző InteractionManager/GestureRecognizer API a térbeli bemeneti adatok teljes készletét elérhetővé teszi.

Unity XR bemeneti API-k

Új projektek esetén javasoljuk az új XR bemeneti API-k használatát az elejétől kezdve.

Az XR API-król itt talál további információt.

Unity gomb-/tengelyleképezési táblázat

A Unity mozgásvezérlőkhöz Windows Mixed Reality Input Manager támogatja az alább felsorolt gomb- és tengely-adatokat az Input.GetButton/GetAxis API-kon keresztül. Az "Windows MR-specifikus" oszlop a InteractionSourceState típuson elérhető tulajdonságokra vonatkozik. Ezen API-k mindegyikét részletesen az alábbi szakaszok ismertetik.

A hozzárendelések gomb-/tengelyazonosító-Windows Mixed Reality általában megfelelnek az Oculus gomb-/tengelyazonosítóinak.

A két eszköz gomb-/tengelyazonosító-Windows Mixed Reality két módon térnek el az OpenVR leképezéseitől:

  1. A leképezés a ujjlenyomattól eltérő touchpad-kiosztásokat használ, hogy támogassa a vezérlőket mindkét ujjlenyomattal és az érintőpadokkal.
  2. A leképezés elkerüli a menügombok A és X gombjainak túlterhelését, így azok elérhetők a fizikai ABXY gombok számára.
BevitelCommon Unity API-k
(Input.GetButton/GetAxis)
Windows MR-specifikus bemeneti API használata
(XR. WSA. Bemenet)
Bal kéz Jobb kéz
Az eseményindító lenyomása 9. tengely = 1,0 10. tengely = 1,0 selectPressed (Lenyomás)
Eseményindítóhoz hasonló érték kiválasztása 9. tengely 10. tengely selectPressedAmount
Az eseményindító részleges lenyomása kiválasztása 14. gomb (gamepad compat) 15. gomb (gamepad compat) selectPressedAmount > 0.0
Menü gomb megnyomva 6. gomb* 7. gomb* menuPressed (menü lenyomás)
Gomb megnyomása 11. tengely = 1.0 (nincs analóg érték)
4. gomb (gamepad compat)
12. tengely = 1.0 (nincs analóg érték)
5. gomb (gamepad compat)
Megragadni
X ujjlenyomat (bal: -1.0, jobb: 1.0) 1. tengely 4. tengely thumbstickPosition.x
Thumbstick Y (top: -1.0, bottom: 1.0) 2. tengely 5. tengely thumbstickPosition.y
Lenyomás az ujjlenyomattal 8. gomb 9. gomb thumbstickPressed
Touchpad X (left: -1.0, right: 1.0) 17. tengely* 19. tengely* touchpadPosition.x
Touchpad Y (top: -1.0, bottom: 1.0) 18. tengely* 20. tengely* touchpadPosition.y
Érintőpad érintett 18. gomb* 19. gomb* touchpad Touched
Touchpad pressed (Touchpad lenyomása) 16. gomb* 17. gomb* touchpadPressed (touchpadpressed)
6DoF testtartás vagy mutatótartás Csak testtartás: XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Adja át a Mutatót vagy a Mutatót argumentumként: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Nyomon követési állapot A pozíció pontossága és a forrásvesztési kockázat csak MR-specifikus API-n keresztül érhető el sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Megjegyzés

Ezek a gomb/tengelyek az OpenVR-hez használt, a Unity által használt, a gamepadek, az Oculus Touch és az OpenVR által használt leképezések ütközései miatt eltérnek a Unity által használttól.

OpenXR

Ha meg szeretne ismerkedni a Unityben a vegyes valósággal való interakciók alapjaival, olvassa el a Unity XR Input Unity-kézikönyvét. Ez a Unity-dokumentáció a vezérlőspecifikus bemenetek leképezését tartalmazza az általánosabb InputFeatureUsage-adatokra,az elérhető XR-bemenetek azonosításának és kategorizálásának, az adatok beolvassának ezekből a bemenetekből stb.

Az Mixed Reality OpenXR beépülő modul további bemeneti interakciós profilokat biztosít, amelyek a standard InputFeatureUsage-hezvan leképezve az alábbiak szerint:

InputFeatureUsage HP Reverb G2 Controller (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Fogka – Kattintson a
Ravaszt Eseményindító
Markolat Markolat Légi koppintás vagy légnyomás
primaryButton (elsődleges gomb) [X/A] – Nyomja le Légi koppintás
secondaryButton (másodlagos gomb) [Y/B] – Nyomja le
butbutton (gomb) Gomb – Nyomja le
triggerButton Trigger – Nyomja le
menuButton (menügomb) Menü

A testtartás és a rámutató testtartás

Windows Mixed Reality számos űrlaptényezőben támogatja a mozgásvezérlőket. Az egyes vezérlők kialakítása eltérő a felhasználó kézpozíciója és a természetes "továbbítási" irány között, amit az alkalmazásoknak a vezérlő renderelése során használniuk kell.

A vezérlők jobb ábrázolása érdekében kétféle testtartást vizsgálhat meg az egyes interakciós forrásokkal, a testtartással és a mutatótartással. Mind a testtartás, mind a mutatótartás koordinátáit az összes Unity API fejezi ki a globális Unity-világ koordinátáiban.

Testtartás

A testtartás a felhasználók helyét jelöli, amelyet egy HoloLens mozgásvezérlővel észlelnek.

Modern headsetek esetén a lebilincselő testtartás a legmegfelelőbb a felhasználó kezében vagy egy, a felhasználó kezében lévő objektum megjelenítésére. A mozgásvezérlő vizualizációjakor a testtartás is használatos. A mozgásvezérlőhöz Windows renderelhető modell a testtartást használja forrásként és a rotáció középpontjának.

A testtartás meghatározása kifejezetten a következő:

  • A fogópont pozíciója:A középpont, amikor a vezérlőt természetes módon tartja, balra vagy jobbra igazítva középre igazítva a fogóponton belüli pozíciót. A Windows Mixed Reality mozgásvezérlőn ez a pozíció általában igazodik a Befogás gombhoz.
  • A tájolásjobb oldali tengelye: Ha teljesen megnyitja a kézzel, hogy vízszintes 5-ujjlenyomatos testtartást hoz létre, akkor az a sugár, amely normális a testben (balról előre, a jobb oldaltól visszafelé)
  • A tájolás Forward(Továbbítás) tengelye: Ha részlegesen bezárja a kézzel (mintha a vezérlőt tartja), akkor a nem ujjlenyomatos fogópont által formált sugáron keresztül "előre" mutat.
  • A tájolás felfelé tengelye: AJobb és a Továbbítás definíció által érintett Fel tengely.

A testtartás a Unity gyártóközi bemeneti API-jával(XR) érhető el. InputTracking. GetLocalPosition/Rotation) vagy a Windows MR-specifikus API-n keresztül(sourceState.sourcePose.TryGetPosition/Rotation),amely lekért pozícióadatokat kér a Node-csomóponthoz).

Mutató pozíciója

A mutató pozíciója a vezérlő előre mutató csúcsát jelöli.

Maga a vezérlőmodell renderelése esetén a legjobb a rendszer által biztosított mutatóleképet használni a sugárkép-küldéshez. Ha egy másik virtuális objektumot renderel a vezérlő helyett, például egy virtuális gépet, akkor olyan sugárra kell rámutatni, amely a leg természetesebb az adott virtuális objektumhoz, például egy olyan sugárra, amely az alkalmazás által meghatározott gun modellen halad végig. Mivel a felhasználók láthatják a virtuális objektumot, és nem a fizikai vezérlőt, a virtuális objektumra való rámutatás valószínűleg természetesebb lesz az alkalmazást használó felhasználók számára.

A mutató pozíciója jelenleg csak a Windows MR-specifikus API-n (sourceState.sourcePose.TryGetPosition/Rotation)keresztül érhető el a Unityben, és a InteractionSourceNode.Pointer argumentumként van átvéve.

OpenXR

OpenXR bemeneti interakciók révén két pozíciókészlethez férhet hozzá:

  • A tartás a kezében lévő objektumok renderelését teszi lehetővé
  • A cél a világra való rámutatás.

Erről a kialakításról és a két pozíció közötti különbségekről további információt az OpenXR-specifikáció– Bemeneti alhálózatok oldalon talál.

Az InputFeatureUsages DevicePosition,DeviceRotation,DeviceVelocity, és DeviceAngularVelocity által biztosított testtartások mind az OpenXR-beli testtartást képviselik. Az InputFeatureUsages a tokos testtartásokkal kapcsolatos definíciója a Unity CommonUsages függvényében van meghatározva.

Az InputFeatureUsages PointerPosition,PointerRotation,PointerVelocityés PointerAngularVelocity által biztosított pozíció az OpenXR célpozícióját képviseli. Ezek az InputFeatureUsage-fájlok nincsenek definiálva egyik C#-fájlban sem, ezért saját InputFeatureUsages-t kell definiálni az alábbiak szerint:

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

Haptics

A haptics Unity XR Input rendszerben való használatával kapcsolatos információkért a dokumentációt a Unity XR Input – Haptics Unity-kézikönyvében találhatja meg.

Vezérlő követési állapota

A headsethez Windows Mixed Reality mozgásvezérlőhöz sem kell külső követési érzékelőket beállítani. Ehelyett a vezérlőket magában a headsetben található érzékelők követik nyomon.

Ha a felhasználó kiveszi a vezérlőket a headsetnézetből, a Windows a legtöbb esetben továbbra is kiveszi a vezérlő pozícióit. Ha a vezérlő elég ideig nem követi a vizualizációt, a vezérlő pozíciói hozzávetőleges pontosságúra csökkennek.

Ezen a ponton a rendszer törzszárolással lezárja a vezérlőt a felhasználóhoz, nyomon követi a felhasználó pozícióját a mozgás közben, miközben a vezérlő valódi tájolását a belső tájolás-érzékelőivel teszi ki. Számos alkalmazás, amely vezérlőket használ a felhasználói felületi elemekre való rámutatáshoz és aktiváláshoz, a szokásos módon, a felhasználó értesítése nélkül, közelítő pontossággal működhet.

Az állapot explicit nyomon követésével kapcsolatos érvelés

Az olyan alkalmazások, amelyek eltérő módon szeretnék kezelni a pozíciót a követési állapot alapján, továbbmehetnek, és megvizsgálhatja a vezérlő állapotának tulajdonságait, például SourceLossRisk és PositionAccuracy:

Nyomon követési állapot SourceLossRisk (Forráskizárások) PositionAccuracy (Pozíció-pontatlanság) TryGetPosition (Áthelyezési próbálkozás)
Nagy pontosság < 1.0 Magas true
Nagy pontosság (fennáll a veszteség kockázata) == 1,0 Magas true
Hozzávetőleges pontosság == 1,0 Hozzávetőleges true
Nincs pozíció == 1,0 Hozzávetőleges hamis

Ezek a mozgásvezérlő-követési államok a következőképpen vannak definiálva:

  • Nagy pontosság: Bár a mozgásvezérlő a headset látómezőjéhez van csatlakoztatva, a vizuális követés alapján általában nagy pontosságú pozíciót biztosít. Egy mozgó vezérlő, amely egy pillanat alatt elhagyja a látóteret, vagy rövid időre el van fedve a headset-érzékelők elől (például a felhasználó által) rövid ideig továbbra is nagy pontosságú pozíciót fog visszaadni magának a vezérlőnek az inertial trackingje alapján.
  • Nagy pontosság (fennáll a veszteség kockázata): Amikor a felhasználó a headset látómezője szélén túlra mozgatja a mozgásvezérlőt, a headset hamarosan nem tudja vizuálisan nyomon követni a vezérlő pozícióját. Az alkalmazás a SourceLossRisk 1.0 elérésekor tudja, hogy a vezérlő mikor érte el ezt az FOV-határt. Ezen a ponton az alkalmazás szüneteltetheti a vezérlők olyan kézmozdulatokat, amelyekhez folyamatos, kiváló minőségű állapotok streamelése szükséges.
  • Hozzávetőleges pontosság: Ha a vezérlő elég ideig nem követi a vizualizációt, a vezérlő pozíciói hozzávetőleges pontosságúra csökkennek. Ezen a ponton a rendszer törzszárolással lezárja a vezérlőt a felhasználóhoz, nyomon követi a felhasználó pozícióját a mozgás közben, miközben a vezérlő valódi tájolását a belső tájolás-érzékelőivel teszi ki. Számos alkalmazás, amely vezérlőket használ a felhasználói felületi elemekre való rámutatáshoz és aktiváláshoz, a szokásos módon, a felhasználó értesítése nélkül, közelítő pontossággal működhet. A nagyobb bemeneti követelményeket használó alkalmazások dönthetnek úgy, hogy a Nagy pontosságtól a Hozzávetőleges pontosságig esnek, ha megvizsgálják a PositionAccuracy tulajdonságot, például úgy, hogy ez idő alatt egy több érzetes találati dobozt adjanak a felhasználónak a képernyőn kívüli célokon.
  • Nincs pozíció: Bár a vezérlő hosszabb ideig is képes körülbelüli pontossággal működni, néha a rendszer tudja, hogy még a testhez zárolt pozíció sem értelmezhető. Előfordulhat például, hogy egy bekapcsolt vezérlőt soha nem figyeltek meg vizuálisan, vagy a felhasználó le is adhatja azt a vezérlőt, amelyet aztán valaki más fog fel. Ilyen esetben a rendszer nem ad pozíciót az alkalmazásnak, a TryGetPosition pedig false (hamis) értéket ad vissza.

Common Unity API-k (Input.GetButton/GetAxis)

Névtér:UnityEngine,UnityEngine.XR
Típusok:Bemenet,XR. InputTracking

A Unity jelenleg az általános Input.GetButton/Input.GetAxis API-kat használja az Oculus SDK,az OpenVR SDK és Windows Mixed Reality bemenetének, beleértve a kéz- és mozgásvezérlőket is. Ha az alkalmazás ezeket az API-kat használja a bemenethez, könnyedén támogathatja a mozgásvezérlőket több XR SDK-ra, beleértve a Windows Mixed Reality.

Logikai gomb lenyomási állapotának lekért állapota

Az általános Unity bemeneti API-k használatának első lépéseként általában gombokat és tengelyeket kell logikai nevekhez kötni a Unity Input Managerben,és mindegyik névhez egy gombot vagy tengelyt kell összekötni. Ezután írhat olyan kódot, amely az adott logikai gomb/tengely nevére hivatkozik.

Ha például a bal oldali mozgásvezérlő eseményindító gombját a Submit műveletre szeretné leképezni, akkor a Unityben az Edit Project Gépház > Input (Bemenet szerkesztése) elemre kattintva bontsa ki a Submit (Küldés) szakasz tulajdonságait a Tengelyek alatt. Módosítsa a Pozitív gomb vagy az Alt Positive Button tulajdonságot a 14. gombolvasására a következő szerint:

Unity InputManager
Unity InputManager

A szkript ezután ellenőrizheti a Submit műveletet az Input.GetButton használatával:

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

További logikai gombokat is hozzáadhat, ha a Tengelyek alatt módosítja a Mérettulajdonságot.

Fizikai gomb megnyomott állapotának közvetlen lekért állapota

A gombokat manuálisan is elérheti a teljes nevük alapján az Input.GetKey használatával:

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

Kéz- vagy mozgásvezérlő testmozgásának le- és leerelése

Az XR használatával elérheti a vezérlő pozícióját és rotációját. InputTracking:

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

Megjegyzés

A fenti kód a vezérlő testtartását jelöli (ahol a felhasználó a vezérlőt tartja), ami hasznos lehet a felhasználó kezében egy motor vagy egy gun renderelése során, vagy magának a vezérlőnek a modelljében.

A testtartás és a mutató pozíciója (ahol a vezérlő csúcsa mutat) közötti kapcsolat eltérő lehet a vezérlők között. Jelenleg a vezérlő mutatójának pozíciója csak az MR-specifikus bemeneti API-n keresztül érhető el, amelyről az alábbi szakaszokban olvashat.

Windows API-k (XR. WSA. Bemenet)

Figyelemfelhívás

Ha a projekt az XR bármelyikét használja. A WSA API-k esetében a későbbi Unity-kiadásokban ezek ki vannak lépve az XR SDK helyett. Új projektek esetén az elejétől javasoljuk az XR SDK használatát. Az XR bemeneti rendszerről és AZ API-król itt talál további információt.

Névtér:UnityEngine.XR.WSA.Input
Típusok:InteractionManager,InteractionSourceState,InteractionSource,InteractionSource, InteractionSourceProperties,InteractionSourceKind,InteractionSourceLocation

Az Windows Mixed Reality bemeneti vezérlőkről (HoloLens) és a mozgásvezérlőkről részletesebb információkat kaphat, ha a UnityEngine.XR.WSA.Input névtér Windows-specifikus térbeli bemeneti API-kat használja. Így további információkhoz férhet hozzá, például a pozíció pontossága vagy a forrás fajtája, így megszabadhatja a kézzel és a vezérlőket.

A kéz- és mozgásvezérlők állapotának lekérdezése

A képkocka állapotát a GetCurrentReading metódussal lekérdezheti az egyes interakciós forrás (kéz vagy mozgásvezérlő) alapján.

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

Az egyes visszaért InteractionSourceState állapotok az aktuális pillanatban egy interakciós forrást képviselnek. A InteractionSourceState a következő információkat teszi elérhetővé:

  • Milyen típusú nyomás történik (Select/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • A mozgásvezérlőkre jellemző egyéb adatok, például az érintőpad és/vagy a ujjlenyomat XY-koordinátái és érintett állapota

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • A InteractionSourceKind, amely tudni tudja, hogy a forrás kéz vagy mozgásvezérlő-e

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

Előrejel jelzett renderelési testek lekérdezése

  • A kézből és vezérlőkből származó interakciós forrásadatok lekérdezésekor a testek előrejelezték a testeket arra az időre, amikor a képkockák fotonja eléri a felhasználó tekintetét. Az előrejelezett testek a legjobban a vezérlő vagy egy-egy objektum képkockákra való renderelése során használhatók. Ha egy adott lenyomást vagy kiadást céloz meg a vezérlővel, az az alábbiakban ismertetett esemény-API-k használata esetén lesz a legpontosabb.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Emellett előrejelezhető fejlében is kaphatja az aktuális képkockát. Mint a forrás pozíció esetében, ez is hasznos a kurzor renderelése során, bár egy adott lenyomás vagy kiadás megcélzása a legpontosabb lesz, ha az alább leírt esemény-esemény API-kat használja.

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

Kezelési forrásesemények kezelése

Ha úgy tudja kezelni a bemeneti eseményeket, ahogy azok a pontos helyadatokkal történnek, lekérdezés helyett kezelhetők az interakciós forrásesemények.

Az interakciós forrásesemények kezeléshez:

  • Regisztráljon egy InteractionManager bemeneti eseményre. Minden olyan interakciós eseménytípusra elő kell iratkoznia, amely önt érdekli.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Kezelje az eseményt. Miután feliratkozott egy interakciós eseményre, szükség esetén visszahívást kap. A SourcePressed példában ez a forrás észlelése után, illetve a felszabadítása vagy elveszítésekor lesz.

    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
    }
    

Az események kezelésének leállítása

Le kell állítania egy esemény kezelését, ha már nem érdekli az esemény, vagy az eseményre előfizetett objektumot semmisít meg. Az esemény kezelésének leállítása érdekében leiratkozik az eseményről.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Interakciós forrásesemények listája

A rendelkezésre álló interakciós forrásesemények a következőek:

  • InteractionSourceDetected (a forrás aktívvá válik)
  • InteractionSourceLost (inaktívvá válik)
  • InteractionSourcePressed (koppintás, gombnyomás vagy "Select" kimondott szöveg)
  • InteractionSourceReleased (a koppintás, a gomb kiadott vagy a "Kijelölés" kifejezés vége)
  • InteractionSourceUpdated (áthelyez vagy más módon módosít egy állapotot)

A korábbi célcsoport-megcélzás eseményei, amelyek a legpontosabban illeszkednek a lenyomáshoz vagy kiadáshoz

A korábban ismertetett lekérdezési API-k előrejelzi az alkalmazást. Bár ezek az előrejelelt testek a legmegfelelőbbek a vezérlő vagy egy virtuális kézi objektum renderelése során, a jövőbeli testesetek két fő okból nem optimálisak a célcsoport-kezeléshez:

  • Amikor a felhasználó megnyom egy gombot egy vezérlőn, körülbelül 20 ms vezeték nélküli késés lehet Bluetooth mielőtt a rendszer megkapja a lenyomott gombot.
  • Ezután, ha előrejelezett testjelet használ, egy másik 10–20 ezredmásodperciót alkalmazna arra az időpontra, amikor az aktuális képkockán lévő fotonok el fogják érni a felhasználó tekintetét.

Ez azt jelenti, hogy a lekérdezés 30–40 ezredúton belül olyan forrás- vagy fej-pozíciót ad vissza, ahonnan a felhasználó fej- és kézfogása a lenyomás vagy a kiadás után visszatért. A HoloLens bevitelhez, miközben nincs vezeték nélküli átvitel késleltetése, hasonló feldolgozási késés észlelhető a lenyomás észleléséhez.

Ahhoz, hogy pontosan meg tudja célozni a felhasználót a kéz- vagy vezérlőlenyomás eredeti szándéka alapján, használja az adott InteractionSourcePressed vagy InteractionSourceReleased bemeneti esemény korábbi forrás- vagy fejlebenyét.

A lenyomási vagy kiadási célokat a felhasználó fejének vagy vezérlőinek korábbi testeset-adataival célozhatja meg:

  • A fej a kézmozdulat vagy a vezérlő lenyomása során áll, amely a célcsoport meghatározására használható annak meghatározásához, hogy a felhasználó mit nézett:

    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;
             // ...
         }
    }
    
  • A forrás a mozgásvezérlő lenyomásának pillanatában áll, amellyel meghatározható, hogy mire mutat a felhasználó a vezérlőre. Ez lesz annak a vezérlőnek az állapota, amelynél a lenyomást tapasztalták. Ha magát a vezérlőt rendereli, akkor a mutató testtartását kérheti a testtartás helyett, hogy a célmegcélzott sugár megrekedje attól, amit a felhasználó a renderelt vezérlő természetes csúcsának tekint:

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

Eseménykezelők – példa

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

Mozgásvezérlők az MRTK-ban

A kézmozdulatok és a mozgásvezérlő a bemeneti kezelőből is elérhető.

Kövesse az oktatóanyagokat

A részletes testreszabási példákkal és részletes oktatóanyagokkal a Mixed Reality Academy:

MR Input 213 – Mozgásvezérlő
MR Input 213 – Mozgásvezérlő

Következő fejlesztési ellenőrzőpont

Ha az eddig kifektetett Unity-fejlesztési utat követi, akkor az MRTK alapvető építőelemei vizsgálatának közepén van. Innen folytathatja a következő építőelemre:

Vagy ugorjon a Mixed Reality képességekre és API-kra:

Bármikor visszamehet a Unity fejlesztési ellenőrzőpontjaira.

Lásd még