Mozgásvezérlők a Unityben

A Unityben, kézmozdulatokkal és mozgásvezérlőkkel a HoloLensben és a modern HMD-ben kétféleképpen hajthat végre műveleteket a tekintetén. Mindkét térbeli bemeneti forrás adatait ugyanazon API-kon keresztül érheti el a Unityben.

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

Unity XR bemeneti API-k

Új projektek esetén javasoljuk, hogy az elejétől kezdve használja az új XR bemeneti API-kat.

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

Unity gomb/tengely leképezési táblázat

A Unity Windows Mixed Reality mozgásvezérlőkhöz készült Input Managere támogatja az alább felsorolt gomb- és tengelyazonosítókat az Input.GetButton/GetAxis API-kon keresztül. A "Windows MR-specifikus" oszlop az InteractionSourceState típuson kívül elérhető tulajdonságokra hivatkozik. Ezen API-k mindegyikét részletesen ismertetjük az alábbi szakaszokban.

A Windows Mixed Reality gomb-/tengelyazonosító-leképezései általában megegyeznek az Oculus gomb/tengely azonosítójával.

A Windows Mixed Reality gomb-tengelyazonosító-leképezései kétféleképpen különböznek az OpenVR-leképezésektől:

  1. A leképezés a pendrive-tól eltérő érintőpad-azonosítókat használ a vezérlők és az érintőpárnák támogatásához.
  2. A leképezéssel elkerülhető, hogy túlterhelje a menügombok A és X gombazonosítóit, hogy azok elérhetők legyenek a fizikai ABXY-gombok számára.
BevitelCommon Unity API-k
(Input.GetButton/GetAxis)
Windows MR-specifikus bemeneti API
(XR. WSA. Bemenet)
Bal kéz Jobb kéz
Az eseményindító kiválasztása lenyomva 9. tengely = 1.0 Tengely 10 = 1,0 selectPressed
Trigger analóg értékének kiválasztása 9. tengely 10. tengely selectPressedAmount
Az eseményindító kiválasztása részlegesen lenyomva Gomb 14 (gamepad compat) Gomb 15 (gamepad compat) selectPressedAmount > 0.0
Menü gomb megnyomva 6. gomb* Gomb 7* menuPressed
Markolat gomb megnyomva Tengely 11 = 1,0 (nincs analóg érték)
Gomb 4 (gamepad compat)
Tengely 12 = 1,0 (nincs analóg érték)
5. gomb (gamepad compat)
Megragadni
Ujjlenyomat X (balra: -1.0, jobb: 1.0) 1. tengely 4. tengely thumbstickPosition.x
Hüvelykujj Y (felül: -1,0, alul: 1,0) 2. tengely 5. tengely thumbstickPosition.y
Nyomva a hüvelykujj Gomb 8 Gomb 9 thumbstick Nyomva
Touchpad X (balra: -1.0, jobb: 1.0) Tengely 17* Tengely 19* touchpadPosition.x
Érintőpad Y (felül: -1,0, alul: 1,0) Tengely 18* Tengely 20* touchpadPosition.y
Érintőpárnával megérintve Gomb 18* Gomb 19* touchpadTouched
Érintőpárnát lenyomva Gomb 16* Gomb 17* touchpadPressed
6DoF markolat póz vagy mutató póz Markolat csak: XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Fogó vagy mutató átadása argumentumként: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Nyomon követés állapota Pozíció pontossága és a forrásveszteség kockázata csak MR-specifikus API-val érhető el sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Megjegyzés

Ezek a gomb-/tengelyazonosítók különböznek a Unity által az OpenVR-hez használt azonosítóktól a játékpadok, az Oculus Touch és az OpenVR által használt leképezések ütközései miatt.

OpenXR

A Unity vegyes valósági interakcióinak alapjait a Unity manual for Unity XR Input (Unity Manual for Unity XR Input) című cikkben ismerheti meg. Ez a Unity-dokumentáció ismerteti a vezérlőspecifikus bemenetek és az általánosabb InputFeatureUsages leképezéseit, a rendelkezésre álló XR-bemenetek azonosítását és kategorizálását, az ezen bemenetekből származó adatok beolvasását és egyebeket.

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

InputFeatureUsage HP Reverb G2 vezérlő (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Joystick – Kattintás
Ravaszt Eseményindító
Markolat Markolat Légcsap vagy facsart
primaryButton [X/A] – Nyomja le a Légi koppintás
secondaryButton [Y/B] – Nyomja le a
gripButton Markolat – Nyomja le a
triggerButton Trigger – Nyomja le a
menuButton Menü

Markolat-póz és mutató póz

Windows Mixed Reality számos formában 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 "előre" irány között, amelyet az alkalmazásoknak a vezérlő megjelenítésekor használniuk kell.

Ezeknek a vezérlőknek a jobb ábrázolása érdekében kétféle pózt vizsgálhat meg minden interakciós forrásnál, a fogó póznál és a mutató póznál. A fogó póz és a mutató póz koordinátáit is a Unity API-k fejezik ki a globális Unity világkoordinátákban.

Markolatos póz

A markolat a felhasználók tenyérének helyét jelöli, amelyet egy HoloLens észlel, vagy egy mozgásvezérlőt tart.

Modern mikrofonos fejhallgatókon a markolat póz a legjobban a felhasználó kezének vagy afelhasználó kezében tartott objektumnak a megjelenítésére szolgál. A fogó pózt mozgásvezérlők vizualizációjakor is használják. A Windows által a mozgásvezérlőhöz biztosított renderelhető modell a markolatot használja a forgás forrásaként és középpontjában.

A markolati póz kifejezetten a következőképpen van definiálva:

  • A markolat helyzete: A tenyér centroid, ha a vezérlőt természetes módon tartja, balra vagy jobbra igazítva a markolaton belüli pozíció középre állításához. A Windows Mixed Reality mozgásvezérlőn ez a pozíció általában a Fogógombhoz igazodik.
  • A fogó tájolás jobb tengelye: Amikor teljesen felnyitja a kezét, hogy lapos ötujjas pózt alakítson ki, a tenyérre normál sugarat (a bal tenyérről előre, a jobb tenyérről visszafelé)
  • A fogó tájolás Előre tengelye: Ha részlegesen bezárja a kezét (mintha a vezérlőt tartana), a nem hüvelykujja által létrehozott csőben "előre" mutató sugár.
  • A fogó tájolás felfelé tengelye: A Jobbra és Előre definíciók által sugallt Fel tengely.

A markolatot a Unity szállítók közötti bemeneti API-ján (XR) keresztül érheti el. InputTracking. GetLocalPosition/Rotáció) vagy a Windows MR-specifikus API-n keresztül (sourceState.sourcePose.TryGetPosition/Rotation, pózadatok kérése a Grip-csomóponthoz ).

Mutató póza

A mutató póz a vezérlő előre mutató csúcsát jelöli.

A rendszer által biztosított mutatópóz a legjobban a vezérlőmodell renderelésekor használható. Ha egy másik virtuális objektumot jelenít meg a vezérlő helyett, például egy virtuális fegyvert, akkor az adott virtuális objektum számára a legtermdenesebb sugárra kell mutatnia, például egy olyan sugárra, amely az alkalmazás által definiált fegyvermodell hordója mentén halad. Mivel a felhasználók nem a fizikai vezérlőt, hanem a virtuális objektumot láthatják, a virtuális objektummal való rámutatás valószínűleg természetesebb lesz az alkalmazást használó felhasználók számára.

A mutató póz jelenleg csak a Unityben érhető el a Windows MR-specifikus API-jának, a sourceState.sourcePose.TryGetPosition/Rotációnak az InteractionSourceNode.Pointer argumentumként való átadásával.

OpenXR

OpenXR bemeneti interakciókon keresztül két pózkészlethez férhet hozzá:

  • A markolat a kézen lévő objektumok renderelésével jár
  • A cél az, hogy a világra mutassunk.

Erről a kialakításról és a két póz közötti különbségekről az OpenXR Specifikáció – Bemeneti alútvonal című témakörben talál további információt.

Az InputFeatureUsages DevicePosition, a DeviceRotation, a DeviceVelocity és a DeviceAngularVelocity által biztosított pózok mind az OpenXR markolatot képviselik. A tapadási pózokhoz kapcsolódó InputFeatureUsage-eket a Unity CommonUsage-jai határozzák meg.

Az InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity és PointerAngularVelocity által biztosított pózok mind az OpenXR-cél pózt képviselik. Ezek az InputFeatureUsage-fájlok nincsenek definiálva egyetlen C#-fájlban sem, ezért a következő módon kell definiálnia saját InputFeatureUsage-jait:

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

Haptics

A haptik a Unity XR-beviteli rendszerében való használatáról a Unity Manual for Unity XR Input – Haptics című cikkben talál további információt.

Vezérlőkövetési állapot

A headsetekhez hasonlóan a Windows Mixed Reality mozgásvezérlőhöz sem szükséges külső nyomkövető érzékelők beállítása. Ehelyett a vezérlőket maga a headset érzékelői követik nyomon.

Ha a felhasználó áthelyezi a vezérlőket a headset nézetéből, a Windows a legtöbb esetben továbbra is vezérlőpozíciókra következtet. Ha a vezérlő elég hosszú ideig elvesztette a vizualizációkövetést, a vezérlő pozíciói hozzávetőleges pontosságra csökkennek.

Ezen a ponton a rendszer törzsbe zárja a vezérlőt a felhasználóhoz, nyomon követi a felhasználó helyzetét, miközben a belső tájolás érzékelőivel továbbra is felfedi a vezérlő valódi tájolását. A felhasználói felület elemeire mutató és aktiváló vezérlőket használó alkalmazások közül sok a felhasználó észrevenése nélkül, hozzávetőleges pontossággal működik.

Az állapotok explicit nyomon követésének indoklása

Azok az alkalmazások, amelyek a nyomkövetési állapot alapján eltérően kívánják kezelni a pozíciókat, továbbhaladhatnak, és megvizsgálhatják a vezérlő állapotát, például a SourceLossRisk és a PositionAccuracy tulajdonságait:

Nyomon követés állapota SourceLossRisk PositionAccuracy TryGetPosition
Nagy pontosság < 1.0 Magas true
Nagy pontosság (a veszteség kockázatának kitéve) == 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ő-nyomkövetési állapotok a következőképpen vannak definiálva:

  • Nagy pontosság: Bár a mozgásvezérlő a headset látómezőjén belül van, általában nagy pontosságú pozíciót biztosít a vizualizációkövetés alapján. Az olyan mozgó vezérlők, amelyek átmenetileg elhagyják a látómezőt, vagy a headset érzékelői (például a felhasználó másik keze) átmenetileg elhomályosulnak, rövid ideig továbbra is nagy pontosságú pózokat ad vissza a vezérlő tehetetlenségi nyomon követése alapján.
  • Nagy pontosság (a veszteség kockázatának kitéve): Amikor a felhasználó a mozgásvezérlőt a headset látómezőjének szélén túlra helyezi, a headset hamarosan nem fogja tudni vizuálisan nyomon követni a vezérlő pozícióját. Az alkalmazás a SourceLossRisk 1.0-s értékének megtekintésével tudja, hogy a vezérlő mikor érte el ezt az FOV-határt. Ezen a ponton az alkalmazás dönthet úgy, hogy szünetelteti a vezérlő kézmozdulatait, amelyek folyamatos, kiváló minőségű pózokat igényelnek.
  • Hozzávetőleges pontosság: Ha a vezérlő elég hosszú ideig elvesztette a vizualizációkövetést, a vezérlő pozíciói hozzávetőleges pontosságra csökkennek. Ezen a ponton a rendszer törzsbe zárja a vezérlőt a felhasználóhoz, nyomon követi a felhasználó helyzetét, miközben a belső tájolás érzékelőivel továbbra is felfedi a vezérlő valódi tájolását. A felhasználói felület elemeire mutató és aktiváló vezérlőket használó alkalmazások közül sok a szokásos módon, hozzávetőleges pontossággal működhet anélkül, hogy a felhasználó észrevenned. A nagyobb bemeneti követelményekkel rendelkező alkalmazások a PositionAccuracy tulajdonság vizsgálatával érzékelhetik ezt az esést a Nagy pontosságtól a Hozzávetőleges pontosságig, például azért, hogy ez idő alatt a felhasználó nagyvonalúbb hitboxot kapjon a képernyőn kívüli célokon.
  • Nincs pozíció: Bár a vezérlő hosszú ideig képes hozzávetőleges pontossággal működni, néha a rendszer tudja, hogy még a test által zárolt pozíció sem jelent semmit. Előfordulhat például, hogy egy bekapcsolva lévő vezérlőt nem figyeltek meg vizuálisan, vagy egy felhasználó elhelyezhet egy vezérlőt, amelyet aztán valaki más fog átvenni. Ilyenkor a rendszer nem biztosít semmilyen pozíciót az alkalmazásnak, és a TryGetPosition 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 közzétételéhez, beleértve a kéz- és mozgásvezérlőket is. Ha az alkalmazás ezeket az API-kat használja bemenetként, könnyen támogatja a mozgásvezérlőket több XR SDK-ban, beleértve a Windows Mixed Reality.

Logikai gomb megnyomott állapotának lekérése

Az általános Unity bemeneti API-k használatához általában a gombok és tengelyek logikai nevekhez való csatlakoztatásával kell kezdenie a Unity Input Managerben, amelyek minden névhez egy gombot vagy tengelyazonosítót kötnek. Ezután írhat olyan kódot, amely a logikai gomb/tengely nevére hivatkozik.

Ha például le szeretné képezni a bal oldali mozgásvezérlő eseményindító gombját a Küldés műveletre, lépjen a Projektbeállítások > bevitelének szerkesztése > a Unityben területre, és bontsa ki a Küldés szakasz tulajdonságait a Tengelyek területen. Módosítsa a Pozitív gomb vagy az Alt Pozitív gomb tulajdonságot a joystick gomb 14 olvasásához, a következőképpen:

Unity InputManager
Unity InputManager

A szkript ezután ellenőrizheti a Küldés műveletet az Input.GetButton használatával:

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

További logikai gombok hozzáadásához módosítsa a Tengelyek területen a Méret tulajdonságot.

Fizikai gomb megnyomott állapotának közvetlen lekérése

A gombokat manuálisan is elérheti a teljes névvel, az Input.GetKey használatával:

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

Kéz vagy mozgásvezérlő pózának lekérése

A vezérlő pozícióját és elforgatását az XR használatával érheti el . InputTracking:

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

Megjegyzés

A fenti kód a vezérlő markolati pózát jelöli (ahol a felhasználó a vezérlőt tartja), amely hasznos egy kard vagy fegyver a felhasználó kezében való megjelenítéséhez, vagy magának a vezérlőnek a modelljéhez.

A fogó póz és a mutató póz közötti kapcsolat (ahol a vezérlő csúcsa mutat) eltérő lehet a vezérlők között. Jelenleg a vezérlő mutatópózának elérése csak az MR-specifikus bemeneti API-n keresztül lehetséges, az alábbi szakaszokban leírtak szerint.

Windows-specifikus API-k (XR. WSA. Bemenet)

Figyelemfelhívás

Ha a projekt az XR bármelyikét használja. WSA API-k, ezeket az XR SDK javára fokozatosan bontjuk ki a jövőbeni Unity-kiadásokban. Új projektek esetén az XR SDK használatát javasoljuk az elejétől kezdve. Az XR bemeneti rendszeréről és API-járól itt talál további információt.

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

Ha részletesebb információkat szeretne kapni Windows Mixed Reality kézi bevitelről (a HoloLens esetében) és a mozgásvezérlőkről, a UnityEngine.XR.WSA.Input névtérben használhatja a Windows-specifikus térbeli bemeneti API-kat. Így további információkhoz, például a pozíció pontosságához vagy a forrás típusához férhet hozzá, így megkülönböztetheti a kezeket és a vezérlőket.

Lekérdezés a kéz- és mozgásvezérlők állapotáról

A Képkocka állapotát a GetCurrentReading metódussal kérdezheti le az egyes interakciós források (kéz- vagy mozgásvezérlők) esetében.

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

Minden visszaérkezett InteractionSourceState egy interakciós forrást jelöl az aktuális pillanatban. Az InteractionSourceState a következő adatokat teszi elérhetővé:

  • Milyen típusú prések történnek (Select/Menu/Grasp/Touchpad/Thumbstick)

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

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • Az InteractionSourceKindből megtudhatja, hogy a forrás kéz vagy mozgásvezérlő-e

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

Előrejelzett renderelési pózok lekérdezése

  • Az interakció forrásadatainak lekérdezésekor a kapott pózok előrejelzett pózok lesznek arra a pillanatra, amikor a képkocka fotonjai elérik a felhasználó szemét. A előrejelzett pózok a legjobban a vezérlő vagy egy tárolt objektum minden egyes keretének renderelésére használhatók. Ha egy adott sajtóközleményt vagy kiadást céloz meg a vezérlővel, az lesz a legpontosabb, ha az alább ismertetett előzményesemény API-kat használja.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Az aktuális keret előrejelzett fejpózát is lekérheti. A forráspózhoz hasonlóan ez is hasznos a kurzor megjelenítéséhez , bár egy adott sajtóközlemény vagy kiadás megcélzása a legpontosabb, ha az alább ismertetett történelmi 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;
         // ...
    }
    

Interakció forráseseményeinek kezelése

Ha a bemeneti eseményeket a pontos előzménypóz-adatokkal együtt szeretné kezelni, a lekérdezés helyett kezelheti az interakciós forráseseményeket.

Interakciós forrásesemények kezelése:

  • Regisztráljon egy InteractionManager bemeneti eseményre. Minden olyan interakciós eseményhez, amely érdekli, elő kell iratkoznia rá.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Az esemény kezelése. Miután feliratkozott egy interakciós eseményre, szükség esetén megkapja a visszahívást. A SourcePressed példában ez a forrás észlelése után, illetve a kiadás vagy az elvesztése előtt történik.

    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
    }
    

Esemény 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 megsemmisíti azt az objektumot, amely feliratkozott az eseményre. Az esemény kezelésének leállításához leiratkozhat az eseményről.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Interakció forráseseményeinek listája

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

  • InteractionSourceDetected (a forrás aktívvá válik)
  • InteractionSourceLost (inaktívvá válik)
  • InteractionSourcePressed (koppintás, gombnyomás vagy "Kiválasztás" kimondva)
  • InteractionSourceReleased (a koppintás vége, a gomb megjelent, vagy a "Select" kifejezés vége kimondva)
  • InteractionSourceUpdated (áthelyez vagy más módon módosít bizonyos állapotokat)

A korábbi célzási események olyan eseményeket jelentenek, amelyek a legpontosabban felelnek meg egy sajtóközleménynek vagy kiadásnak

A korábban ismertetett lekérdezési API-k előrejelzett pózokat biztosítanak az alkalmazásnak. Bár az előrejelzett pózok a legjobbak a vezérlő vagy egy virtuális kézi objektum megjelenítéséhez, a jövőbeli pózok nem optimálisak a célzáshoz, két fő okból:

  • 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-on keresztül, mielőtt a rendszer megkapja a nyomatot.
  • Ezután, ha előrejelzett pózt használ, további 10-20 ms előrejelzőt alkalmazna arra az időre, amikor az aktuális keret fotonjai elérik a felhasználó szemét.

Ez azt jelenti, hogy a lekérdezés olyan forráspózt vagy fejpózt ad, amely 30-40 ms-ra van előre, ahonnan a felhasználó feje és keze ténylegesen visszakerült, amikor a sajtó vagy a kiadás történt. HoloLens kézi bemenet esetén, bár nincs vezeték nélküli átviteli késleltetés, hasonló feldolgozási késleltetés van a nyomat észleléséhez.

Ahhoz, hogy a felhasználó eredeti szándéka alapján pontosan megcélzhassa a kéz vagy a vezérlő lenyomásával kapcsolatos szándékot, az adott InteractionSourcePressed vagy InteractionSourceReleased bemeneti esemény előzményforrás-pózát vagy fejpózt kell használnia.

Megcélzhat egy sajtóközleményt vagy kiadást, amelynek előzményadatokkal kell megjelennie a felhasználó vezetőjétől vagy a kontrollerétől:

  • A fej akkor jelenik meg, amikor egy kézmozdulat vagy egy vezérlő lenyomása történt, amely a célzáshoz használható annak meghatározására, hogy a felhasználó mit tekintett :

    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 akkor jelenik meg, amikor egy mozgásvezérlő lenyomása történt, amely a célzáshoz használható annak meghatározására, hogy a felhasználó mire mutat a vezérlőre. Ez lesz annak a vezérlőnek az állapota, amely a sajtót tapasztalta. Ha magát a vezérlőt rendereli, kérheti a mutató pózát a fogó póz helyett, hogy a célirányító sugarat a felhasználó által a renderelt vezérlő természetes csúcsának figyelembevételével lője le:

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

Példa eseménykezelőkre

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ézmozdulat- és mozgásvezérlőt a bemeneti kezelőből érheti el.

Kövesse az oktatóanyagokat

A részletes testreszabási példákkal rendelkező részletes oktatóanyagok a Mixed Reality Akadémián érhetők el:

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

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

Ha a Unity fejlesztési útját követi, akkor az MRTK alapvető építőelemeinek felfedezése közben jár. Innen továbbléphet a következő építőelemre:

Vagy ugorjon Mixed Reality platform képességeire és API-ira:

Bármikor visszatérhet a Unity fejlesztési ellenőrzőpontjaihoz .

Lásd még