Megosztás a következőn keresztül:


Mozgásvezérlők a Unityben

A Unityben kétféleképpen hajthat végre műveleteket a tekintetén, kézmozdulatok és mozgásvezérlők a HoloLensben és a modern HMD-ben. A térbeli bemenet mindkét forrásának adatait ugyanazokkal az API-kkal é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 esetében. A gyakori Input.GetButton/Input.GetAxis API-k több Unity XR SDK-n is működnek, míg a Windows Mixed Realityre jellemző InteractionManager/GestureRecognizer API a térbeli bemeneti adatok teljes készletét teszi elérhetővé.

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 Input Manager for Windows Mixed Reality mozgásvezérlői az alábbiakban felsorolt gomb- és tengelyazonosítókat támogatják az Input.GetButton/GetAxis API-kon keresztül. A "Windows MR-specifikus" oszlop az InteractionSourceState típuson kívül elérhető tulajdonságokra vonatkozik. Ezeket az API-kat részletesen az alábbi szakaszok ismertetik.

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éseitől:

  1. A leképezés az ujjlenyomatoktól eltérő érintőpad-azonosítókat használ, hogy támogassa a vezérlőket mind a hüvelykujjakkal, mind az érintőpárnákkal.
  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.
Bemenet Common Unity API-k
(Input.GetButton/GetAxis)
Windows MR-specifikus bemeneti API
(XR. WSA. Bemenet)
Bal kéz Jobb kéz
Az eseményindító kijelölése lenyomva Tengely 9 = 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ó kijelölése részlegesen lenyomva Gomb 14 (gamepad compat) Gomb 15 (gamepad compat) selectPressedAmount > 0.0
Menü gomb lenyomva Gomb 6* Gomb 7* menuPressed
Markoló gomb lenyomva Tengely 11 = 1,0 (nincs analóg érték)
Gomb 4 (gamepad compat)
Tengely 12 = 1,0 (nincs analóg érték)
Gomb 5 (gamepad compat)
Megragadni
Ujjlenyomat X (balra: -1,0, jobbra: 1,0) 1. tengely 4. tengely thumbstickPosition.x
Hüvelykujj Y (felül: -1,0, alul: 1,0) 2. tengely 5. tengely thumbstickPosition.y
Ujjlenyomat lenyomva Gomb 8 Gomb 9 ujjlenyomat lenyomva
Touchpad X (balra: -1.0, jobbra: 1.0) Tengely 17* Tengely 19* touchpadPosition.x
Touchpad 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ópont vagy mutató átadása argumentumként: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Nyomkövetési állapot A pozíció pontossága és a forrásveszteség kockázata csak MR-specifikus API-val érhető el sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Feljegyzés

Ezek a gomb/tengelyazonosítók eltérnek 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ág interakcióinak alapjait a Unity XR-bemenethez készült Unity Kézikönyvben ismerheti meg. Ez a Unity-dokumentáció ismerteti a vezérlőspecifikus bemenetek és az általánosabb InputFeatureUsages leképezéseit, az elérhető XR-bemenetek azonosítását és kategorizálását, az adatok beolvasását ezekből a bemenetekből, és így tovább.

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

InputFeatureUsage HP Reverb G2 vezérlő (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Botkormány
primary2DAxisClick Joystick - Kattintson
kivált Eseményindító
markolat Markolat Légcsapolás vagy szorítás
primaryButton [X/A] – Nyomja le a Levegő 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

A 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 vezérlő renderelése során az alkalmazások által a mutogatáshoz használt természetes "előre" irány között.

Ezeknek a vezérlőknek a jobb ábrázolása érdekében kétféle pózt vizsgálhat meg az egyes interakciós forrásokkal, a markolat pózával és a mutató pózával. A fogó póz és a mutató pózkoordinátáit a Unity összes API-ja kifejezi a globális Unity világkoordinátákban.

Markolatos póz

A markolat póz a felhasználók tenyérének helyét jelöli, vagy holoLens észleli, vagy mozgásvezérlőt tart.

Modern fejhallgatókon a markolat póz a legjobban a felhasználó kezének vagy a felhaszná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 fogó pózt használja a forgás forrásaként és középpontjában.

A markolat póza 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, hogy a markolaton belül középre helyezze a pozíciót. A Windows Mixed Reality mozgásvezérlőjén ez a pozíció általában a Fogd meg gombhoz igazodik.
  • A markolat tájolásának jobb tengelye: Amikor teljesen kinyitja a kezét, hogy lapos 5 ujjú pózt alakítson ki, a tenyérhez normál sugarat (a bal tenyértől előre, a jobb tenyértől visszafelé)
  • A fogó tájolás Előre tengelye: Ha a kezét részlegesen bezárja (mintha a vezérlőt tartana), a nem hüvelykujj ujjai által létrehozott csőben "előre" mutató sugár.
  • A fogó tájolás Fel tengelye: A Jobb és az Előre definíció által sugallt Fel tengely.

A markolatot a Unity gyártóközi 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/Rotáció, 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 más virtuális objektumot jelenít meg a vezérlő helyett, például egy virtuális fegyvert, akkor a virtuális objektum számára legtermlényesebb sugárra kell mutatnia, például egy 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 Windows MR-specifikus API-n, a sourceState.sourcePose.TryGetPosition/Rotáción keresztül érhető el a Unityben , argumentumként az InteractionSourceNode.Pointerben .

OpenXR

Az OpenXR bemeneti interakciói révén 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 mutasson.

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

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

Az InputFeatureUsages PointerPosition, a PointerRotation, a PointerVelocity és a 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 saját InputFeatureUsage-eket kell definiálnia az alábbiak szerint:

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

Haptics

A haptik a Unity XR bemeneti rendszerében való használatáról a Unity XR Input – Haptics unity kézikönyvében találhatók.

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ágúra csökkennek.

Ezen a ponton a rendszer a vezérlőt testesen zárolja a felhasználóhoz, nyomon követi a felhasználó pozícióját, miközben a vezérlő valódi tájolását is felfedi a belső tájolás érzékelőivel. Számos olyan alkalmazás, amely vezérlőket használ a felhasználói felület elemeinek rámutatására és aktiválására, a felhasználó értesítése nélkül is megfelelően, hozzávetőleges pontossággal működhet.

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

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ának tulajdonságait, például a SourceLossRisket és a PositionAccuracy-t:

Nyomkövetési állapot SourceLossRisk PositionAccuracy TryGetPosition
Nagy pontosság < 1.0 Magas true
Nagy pontosság (elvesztésének 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 false

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óteré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 egy pillanat alatt elhagyják a látómezőt, vagy amely a headset érzékelői elől (például a felhasználó másik keze által) elhomályosul, rövid ideig továbbra is nagy pontosságú pózokat ad vissza magának a vezérlőnek az inerciális nyomon követésén alapulva.
  • Nagy pontosság (elvesztésének kockázata): 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.
  • Közelítő 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ágúra csökkennek. Ezen a ponton a rendszer a vezérlőt testesen zárolja a felhasználóhoz, nyomon követi a felhasználó pozícióját, miközben a vezérlő valódi tájolását is felfedi a belső tájolás érzékelőivel. Számos olyan alkalmazás, amely vezérlőkkel mutat és aktivál felhasználói felületi elemeket, a szokásos módon, közelítő pontosságban működhet anélkül, hogy a felhasználó észrevenned. A nagyobb bemeneti követelményekkel rendelkező alkalmazások úgy dönthetnek, hogy a PositionAccuracy tulajdonság vizsgálatával érzékelik ezt a nagy pontosságtól a hozzávetőleges pontosságig való csökkenést, például 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, a rendszer néha tudja, hogy még a test által zárolt pozíció sem jelent semmit. Előfordulhat például, hogy egy bekapcsolt vezérlőt nem figyeltek meg vizuálisan, vagy egy felhasználó le is helyezhet egy vezérlőt, amelyet aztán valaki más vett fel. 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 a 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ámogathatja a mozgásvezérlőket több XR SDK-ban, beleértve a Windows Mixed Realityt is.

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

Az általános Unity bemeneti API-k használatához általában úgy kell kezdenie, hogy a gombok és tengelyek a Unity Input Manager logikai neveihez kötnek, és minden névhez egy gombot vagy tengelyazonosítót kötnek. Ezután írhat olyan kódot, amely erre a logikai gombra/tengelynévre hivatkozik.

Ha például le szeretné képezni a bal oldali mozgásvezérlő trigger gombját a Küldés műveletre, lépjen a Project Settings > Input szerkesztése > a Unityben elemre, és bontsa ki a Küldés szakasz tulajdonságait a Tengelyek csoportban. A Pozitív gomb vagy az Alt Pozitív gomb tulajdonság módosítása 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 gombokat a Tengelyek alatti Méret tulajdonság módosításával adhat hozzá.

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

A gombokat manuálisan is elérheti a teljes név alapján, 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);

Feljegyzés

A fenti kód a vezérlő fogó pózát jelöli (ahol a felhasználó a vezérlőt tartja), amely hasznos lehet 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 (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ó 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 bontják ki a jövőbeli Unity kiadásokban. Új projektek esetén az XR SDK használatát javasoljuk az elejétől kezdve. 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, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Ha részletesebb információkat szeretne kapni a Windows Mixed Reality kézi bemenetéről (HoloLens esetén) és a mozgásvezérlőkről, a UnityEngine.XR.WSA.Input névtér alatt választhatja a Windows-specifikus térbeli bemeneti API-kat. Ez lehetővé teszi további információk, például a pozíció pontosságának vagy a forrás típusának elérését, lehetővé téve a kezek és a vezérlők megkülönböztetést.

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

A GetCurrentReading metódussal lekérdezheti a keret állapotát az egyes interakciós forrásokkal (kéz- vagy mozgásvezérlőkkel).

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

Minden visszakapott InteractionSourceState egy interakciós forrást jelöl az aktuális időpontban. 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) {
         // ...
    }
    
  • Egyéb, mozgásvezérlőkre vonatkozó adatok, például az érintőpárnás és/vagy a hüvelykujj XY koordinátái és megérintett állapota

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • Az InteractionSourceKind tudni szeretné, 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 az időre, amikor a keret 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ényes esemé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ás pózhoz hasonlóan ez is hasznos lehet a kurzor megjelenítéséhez, bár egy adott sajtó 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ényadatokkal szeretné kezelni, a lekérdezés helyett kezelheti az interakció forráseseményeit.

Interakció forráseseményeinek 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;
    
  • 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 kiadás vagy az elveszett állapot 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 az eseményre előfizetett objektumot. 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

Az interakció forráseseményei 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 ki van adva, vagy a "Select" kifejezés vége kimondva)
  • InteractionSourceUpdated (áthelyez vagy más módon módosít valamilyen állapotot)

A történelmi célzás eseményei olyan eseményeket jelentenek, amelyek a legpontosabban egyeznek a sajtóval vagy a kiadással

A korábban ismertetett lekérdezési API-k előre jelezték az alkalmazást. Bár az előrejelzett pózok a vezérlő vagy egy virtuális kézi objektum megjelenítéséhez a legjobbak, 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 nyomja meg.
  • Ezután, ha előrejelzett pózt használ, akkor további 10–20 ms előrejelző előrejelzést 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ás pózt vagy fej pózt ad, amely 30-40 ms-ra előre, ahonnan a felhasználó feje és keze ténylegesen vissza volt, 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éssel észlelhető a sajtó.

Ha pontosan meg szeretné célozni a felhasználó eredeti szándékát egy kéz- vagy vezérlőpróba esetében, használja az adott InteractionSourcePressed vagy InteractionSourceReleased bemeneti esemény előzményforrás-pózát vagy fej pózt.

A felhasználó fejéből vagy vezérlőjéből származó előzményadatokkal rendelkező sajtóközleményt vagy kiadást célozhat meg:

  • A fej póz abban az időben, amikor egy kézmozdulat vagy 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 a mozgásvezérlő lenyomásának pillanatában jelenik meg, amely a célzáshoz használható annak meghatározására, hogy a felhasználó mire mutat a vezérlőre. Ez lesz a vezérlő állapota, amely a sajtót tapasztalta. Ha magát a vezérlőt rendereli, kérheti a mutató pózt a markolat póz helyett, hogy a célzási sugarat a felhasználó 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ézmozdulatok és a mozgásvezérlő a bemeneti kezelőből érhető el.

Kövesse az oktatóanyagokat

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

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 a Mixed Reality platform képességeire és API-ira:

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

Lásd még