Kézmozdulatok a Unityben
A Unityben kétféleképpen hajthat végre műveleteket, kézmozdulatokat és mozgásvezérlőket 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 biztosít a térbeli bemeneti adatok elérésére Windows Mixed Reality. A gyakori Input.GetButton/Input.GetAxis API-k több Unity XR SDK-n is működnek, míg az InteractionManager/GestureRecognizer API Windows Mixed Reality teszi elérhetővé a térbeli bemeneti adatok teljes készletét.
Magas szintű összetett kézmozdulat API-k (GestureRecognizer)
Névtér:UnityEngine.XR.WSA.Input
Típusok: GestureRecognizer, GestureSettings, InteractionSourceKind
Az alkalmazás magasabb szintű összetett kézmozdulatokat is képes felismerni a térbeli bemeneti források, a Tap, a Hold, a Manipuláció és a Navigációs kézmozdulatokhoz. Ezeket az összetett kézmozdulatokat kéz - és mozgásvezérlők között is felismerheti a GestureRecognizerrel.
A GestureRecognizer minden kézmozdulat-eseménye biztosítja a SourceKindet a bemenethez, valamint a célzási fejsugarat az esemény időpontjában. Egyes események további környezetspecifikus információkat biztosítanak.
A kézmozdulatok kézmozdulat-felismerővel történő rögzítéséhez mindössze néhány lépés szükséges:
- Új Kézmozdulat-felismerő létrehozása
- Adja meg, hogy mely kézmozdulatokat watch
- Feliratkozás a kézmozdulatok eseményeire
- Kézmozdulatok rögzítésének megkezdése
Új Kézmozdulat-felismerő létrehozása
A GestureRecognizer használatához létre kell hoznia egy GestureRecognizert:
GestureRecognizer recognizer = new GestureRecognizer();
Adja meg, hogy mely kézmozdulatokat watch
Adja meg, hogy mely kézmozdulatok érdeklik a SetRecognizableGestures():
recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);
Feliratkozás a kézmozdulatok eseményeire
Iratkozzon fel az eseményekre az önt érdeklő kézmozdulatokhoz.
void Start()
{
recognizer.Tapped += GestureRecognizer_Tapped;
recognizer.HoldStarted += GestureRecognizer_HoldStarted;
recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}
Megjegyzés
A navigációs és a manipulációs kézmozdulatok kölcsönösen kizárják a GestureRecognizer egy példányát.
Kézmozdulatok rögzítésének megkezdése
Alapértelmezés szerint a GestureRecognizer csak a StartCapturingGestures() meghívása után figyeli a bemenetet. Előfordulhat, hogy a StopCapturingGestures() meghívása után egy kézmozdulat-esemény jön létre, ha a bemenetet a StopCapturingGestures() folyamatot feldolgozó keret előtt hajtották végre. A GestureRecognizer emlékezni fog arra, hogy be- vagy kikapcsolt volt-e az előző keretben, amelyben a kézmozdulat ténylegesen történt, így megbízható a kézmozdulatok monitorozásának elindítása és leállítása a keret tekintetének célzása alapján.
recognizer.StartCapturingGestures();
Kézmozdulatok rögzítésének leállítása
A kézmozdulat-felismerés leállítása:
recognizer.StopCapturingGestures();
Kézmozdulat-felismerő eltávolítása
Ne felejtsen el leiratkozni az előfizetett eseményekről, mielőtt megsemmisítené a GestureRecognizer objektumot.
void OnDestroy()
{
recognizer.Tapped -= GestureRecognizer_Tapped;
recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}
A mozgásvezérlő modell renderelése a Unityben
Mozgásvezérlő modell és teleportálás
Ha olyan mozgásvezérlőket szeretne megjeleníteni az alkalmazásban, amelyek megfelelnek a felhasználók által a különböző gombok lenyomásakor tartott és tagolt fizikai vezérlőknek, használhatja a MotionController előlapját a Mixed Reality Eszközkészletben. Ez az előfab dinamikusan betölti a megfelelő glTF-modellt futásidőben a rendszer telepített mozgásvezérlő illesztőprogramjából. Fontos, hogy ezeket a modelleket dinamikusan töltse be ahelyett, hogy manuálisan importálja őket a szerkesztőbe, hogy az alkalmazás fizikailag pontos 3D modelleket jelenítsen meg a felhasználók esetleges jelenlegi és jövőbeli vezérlőihez.
- Kövesse az Első lépések utasításokat a Mixed Reality Eszközkészlet letöltéséhez és a Unity-projekthez való hozzáadásához.
- Ha a kamerát a MixedRealityCameraParent előtagra cserélte a Első lépések lépések részeként, akkor jó, ha megy! Ez az előlap tartalmazza a mozgásvezérlő renderelését. Ellenkező esetben adja hozzá az Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab elemet a jelenethez a Projekt panelen. Ezt az előképet bármilyen szülőobjektum gyermekének kell hozzáadnia, amellyel áthelyezheti a kamerát, amikor a felhasználó teleportál a jeleneten belül, hogy a vezérlők a felhasználóval együtt legyenek. Ha az alkalmazás nem tartalmaz teleportálást, egyszerűen adja hozzá az előképet a jelenet gyökeréhez.
Objektumok eldobása
Az objektumok virtuális valóságban való üzembe helyezése nehezebb probléma, mint amilyennek elsőre tűnhet. A legtöbb fizikai interakcióhoz hasonlóan, amikor a játékba dobás váratlanul működik, azonnal nyilvánvaló és megszakítja a merítést. Sok időt töltöttünk azzal, hogy alaposan átgondoljuk, hogyan képviselhetjük a fizikailag helyes dobás viselkedését, és kitaláltunk néhány olyan irányelvet, amelyeket a platform frissítéseivel engedélyeztünk, amelyeket szeretnénk megosztani Önnel.
Itt talál egy példát arra, hogyan javasoljuk a dobás implementálását. Ez a minta az alábbi négy iránymutatást követi:
Pozíció helyett használja a vezérlő sebességét. A Windows novemberi frissítésében változást vezettünk be a viselkedésben, amikor a "Hozzávetőleges" pozíciókövetési állapotban van. Ha ebben az állapotban van, a vezérlő sebességadatait a rendszer mindaddig jelenti, amíg úgy véljük, hogy a nagy pontossága, amely gyakran hosszabb, mint a pozíció, továbbra is nagy pontosságú marad.
A vezérlő szögsebességének beépítése. Ez a logika mind a
throwing.cs
statikus metódusban található aGetThrownObjectVelAngVel
fájlban, a fent hivatkozott csomagban:A szögsebesség megőrzésekor a dobott objektumnak ugyanolyan szögsebességet kell fenntartania, mint a dobás pillanatában:
objectAngularVelocity = throwingControllerAngularVelocity;
Mivel a dobott objektum tömegének középpontja valószínűleg nem a markolati helyzet forrásánál van, valószínűleg más sebességgel rendelkezik, mint a vezérlő sebessége a felhasználó referenciakeretében. Az objektum sebességének ily módon hozzájárult része a dobott objektum tömegközéppontjának azonnali tangenciális sebessége a vezérlő eredete körül. Ez a tangenciális sebesség a vezérlő szögsebességének keresztterméke, és a vektor a vezérlő eredete és a dobott objektum tömegének középpontja közötti távolságot jelöli.
Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos; Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
A dobott objektum teljes sebessége a vezérlő sebességének összege és ez a tangenciális sebesség:
objectVelocity = throwingControllerVelocity + tangentialVelocity;
Ügyeljen arra, hogy mikor alkalmazzuk a sebességet. Ha megnyom egy gombot, akár 20 ms-ot is igénybe vehet, amíg az esemény a Bluetooth-on keresztül felborul az operációs rendszerhez. Ez azt jelenti, hogy ha lekérdezi, hogy a vezérlő állapota le van-e nyomva, vagy fordítva, a vezérlő olyan információkat tesz fel, amelyekhez hozzájut, valójában megelőzi ezt az állapotváltozást. Emellett a lekérdezési API által bemutatott vezérlői póz előre jelezve egy valószínű pózolást fog tükrözni a keret megjelenésekor, amely a jövőben több mint 20 ms lehet. Ez jó a megtartott objektumok rendereléséhez , de az időproblémát az objektum megcélzása során oldja meg, mivel kiszámítjuk a pályát abban a pillanatban, amikor a felhasználó elengedte a dobást. Szerencsére a novemberi frissítéssel, amikor egy Unity-eseményt, például az InteractionSourcePressed vagy az InteractionSourceReleased üzenetet küld, az állapot tartalmazza a gomb megnyomásakor vagy kiadásakor visszaről érkező előzmény pózadatokat. Ahhoz, hogy a legpontosabb vezérlő renderelése és a vezérlő célzása a dobások során, helyesen kell használnia a lekérdezést és az eseménykezelést, ha szükséges:
- Az egyes kereteket megjelenítő vezérlők esetében az alkalmazásnak a vezérlő GameObject elemét az aktuális keret fotonidejéhez előrejelzett kontroller pózhoz kell helyeznie. Ezeket az adatokat a Unity lekérdezési API-jából, például az XR-ből szerezheti be. InputTracking.GetLocalPosition vagy XR. WSA. Input.InteractionManager.GetCurrentReading.
- Ha a vezérlő egy sajtóközleményt vagy kiadást céloz meg, az alkalmazásnak raycast-et kell használnia, és ki kell számítania a pályát az adott sajtó- vagy kiadási esemény előzményvezérlő-póza alapján. Ezeket az adatokat a Unity eseménykezelő API-jából, például az InteractionManager.InteractionSourcePressedből szerezheti be.
Használja a markolat pózt. Angular sebesség és sebesség a markolathoz viszonyítva van jelentve, nem pedig a mutató pózhoz viszonyítva.
A dobás továbbra is javulni fog a Windows jövőbeli frissítéseivel, és várhatóan itt talál további információkat.
Kézmozdulat- és 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ákat tartalmazó részletes oktatóanyagok a Mixed Reality Akadémián érhetők el:
MR Bemenet 213 - Mozgásvezérlő
Következő fejlesztési ellenőrzőpont
Ha követi a Unity által meghatározott fejlesztési folyamatot, 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 .