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:
- 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.
- 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
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ő
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 .