Kézi menü – MRTK3
A kézi menük lehetővé teszik a felhasználók számára, hogy kézzel csatlakoztatott felhasználói felületet hozzanak létre a gyakran használt függvényekhez. Ezek általában kis gombcsoportok , amelyek gyors műveleteket kínálnak. Néha azonban összetettebb elrendezések jelennek meg az információk vagy beállítások megjelenítéséhez a felhasználó számára kéz menüként, gyakran azzal a lehetőséggel, hogy "elszakítjuk" a menüt a kéztől, és lehorgonyozjuk a világon.
A Hand (Kéz) menü "Lapos kéz megkövetelése" és "Tekintet aktiválásának használata" lehetőséget biztosít, hogy megakadályozza a hamis aktiválást más objektumokkal való interakció során. Javasoljuk, hogy ezeket a beállításokat használja a nemkívánatos aktiválás megakadályozása érdekében.
Példajelenet és előképek
Ha a sablonprojektet használja, HandMenuExamples.unity
számos gyakori konfigurációt mutat be a kézi menükhöz, amelyek mindegyike a HandConstraintPalmUp
szkriptet használja.
HandMenuLarge
Ez az előfab egy nagy vagy összetett felhasználói felület példáját mutatja be, amely hosszabb interakciós időt igényel. Az ilyen típusú felhasználói felület esetén ajánlott a menüt kézzel rögzíteni, hogy javuljon a használhatóság és a karfáradtság. Ez a példa a menü világzárolásához is támogatja a "behúzást és lekérést".
Ebben a példában a menü láthatóvá és láthatatlanná válik az OnFirstHandDetected() esemény MenuContent objektumának aktiválásával. Az OnLastHandLost() esemény esetén a bezárás gomb aktiválódik, és az elhelyezési animáció aktiválódik. Az animáció egy egyszerű skálázási ingadozás. Mivel nem rejtettük el a MenuContentet az OnLastHandLost() eseményen, a menü automatikusan zárolva lesz, ha a kéz nem látható. A Palm Up szakaszban található értékek úgy lettek optimalizálva, hogy a menüt a világ minden részén zárolják anélkül, hogy túl sokat húztak volna le a kézből.
Ez a példa a menü alsó részén található megragadható sávot és az automatikus világzárolási viselkedést tartalmazza. A felhasználó explicit módon leválaszthatja a menüt a kézről, és elhelyezheti a világon azáltal, hogy megragadja ezt. Ennek eléréséhez az ObjectManipulator ManipulationStarted() eseményén letiltjuk a SolverHandler.UpdateSolvers parancsot. Ellenkező esetben a menü nem lesz leválasztható, mivel a HandConstraint solver megpróbálja a menüt a kéz pozíciója közelében elhelyezni. A HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine parancsot is használjuk, hogy a felhasználó felemelje a kezét a menü újbóli leosztásához.
Végül a bezárás gombnak újra kell aktiválnia a SolverHandler.UpdateSolvers parancsot a HandConstraint solver funkcióinak visszaállításához.
Parancsfájlok
A HandConstraint
viselkedés egy olyan megoldási megoldást biztosít, amely a nyomon követett objektumot egy olyan régióra korlátozza, amely biztonságos a korlátozott tartalom (például a kézi felhasználói felület, a menük stb.) számára. A biztonságos régiók olyan területeknek minősülnek, amelyek nem metsződnek a kézzel. A rendszer egy nevű HandConstraintPalmUp
származtatott osztályt HandConstraint
is tartalmaz, amely bemutatja a solver-tracked objektum aktiválásának gyakori viselkedését, amikor a tenyér a felhasználóval szemben áll.
További dokumentációért tekintse meg az egyes HandConstraint
tulajdonságokhoz elérhető elemleírásokat. Alább néhány tulajdonságot határozunk meg részletesebben.
Biztonságos zóna: A biztonságos zóna határozza meg, hogy hol legyen korlátozva a tartalom. Javasoljuk, hogy a tartalmat az Ulnar oldalán helyezze el, hogy elkerülje a kézzel való átfedést és a jobb interakciós minőséget. A biztonságos zónákat a kezek ortogonális síkba vetített tájolása alapján számítják ki, és a kéz körüli határolókeretre sugárzottak. A biztonságos zónák a következővel
XRNode
való együttműködésre vannak definiálva: . Javasoljuk, hogy vizsgálja meg, hogy az egyes biztonságos zónák mit képviselnek a különböző vezérlőtípusokon.Kövesse a kezét, amíg a kamera felé nem néz Ezzel az aktív megoldással a solver addig fogja követni a kéz forgását, amíg a menü nem igazodik megfelelően a tekintethez, amikor a kamerával néz szembe. A művelet elvégzéséhez módosítsa a
SolverRotationBehavior
() változót aHandConstraintSolver
-rőlLookAtTrackedObject
a-raLookAtMainCamera
, mivel aGazeAlignment
solver szöge változó.
Aktiválási események: Jelenleg négy
HandConstraint
aktiválási eseményt aktivál. Ezek az események számos különböző kombinációban használhatók egyediHandConstraint
viselkedések létrehozásához.- OnHandActivate: akkor aktiválódik, ha egy kéz megfelel az IsHandActive metódusnak.
- OnHandDeactivate: akkor aktiválódik, ha az IsHandActive metódus már nem teljesül.
- OnFirstHandDetected: akkor fordul elő, ha a kézkövetés állapota egyetlen kézről a nézetben való első kézre változik.
- OnLastHandLost: akkor fordul elő, ha a kézkövetés állapota legalább egy kézről nézetben nem láthatóra változik.
Solver-aktiválási/deaktiválási logika: Jelenleg a logika aktiválására és deaktiválására
HandConstraintPalmUp
vonatkozó javaslat az, hogy az objektum letiltása/engedélyezése helyett használja azSolverHandler
'sUpdateSolver
értéket. Ez a példajelenetben a csatolt menü ManipulationHandler "OnManipulationStarted/Ended" eseményei után aktivált szerkesztőalapú horgokon keresztül látható.-
A hand-constraint logika leállítása: Amikor a kézi korlátozású objektumot a leállításra próbálja beállítani (és nem futtatja az aktiválási/deaktiválási logikát), állítsa az UpdateSolver értékét Hamis értékre a HandConstraintPalmUp letiltása helyett.
- Ha engedélyezni szeretné a tekintetalapú (vagy akár nem tekintetalapú) reattach logikát, akkor ezt a függvény meghívása
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine()
követi. Ez elindít egy koroutint, amely továbbra is ellenőrzi, hogy teljesülnek-e a "IsValidController
" feltételek, és az UpdateSolver értékét True (Igaz) értékre állítja, ha az (vagy az objektum le van tiltva).
- Ha engedélyezni szeretné a tekintetalapú (vagy akár nem tekintetalapú) reattach logikát, akkor ezt a függvény meghívása
- A kézkényszerítés logikájának elindítása: Amikor a kézzel korlátozott objektumot úgy próbálja beállítani, hogy újra elkezdje követni a kezét (attól függően, hogy megfelel-e az aktiválási feltételeknek), állítsa a SolverHandler UpdateSolver értékét true (igaz) értékre.
-
A hand-constraint logika leállítása: Amikor a kézi korlátozású objektumot a leállításra próbálja beállítani (és nem futtatja az aktiválási/deaktiválási logikát), állítsa az UpdateSolver értékét Hamis értékre a HandConstraintPalmUp letiltása helyett.
-
Logikai újrapróbálkozás: Jelenleg a
HandConstraintPalmUp
rendszer automatikusan újraaktiválhatja a célobjektumot a nyomon követett ponthoz, függetlenül attól, hogy azSolverHandler
"sUpdateSolver
" értéke Igaz-e. Ez úgy történik, hogy meghívja azHandConstraintPalmUp
'sStartWorldLockReattachCheckCoroutine()
függvényt, miután az a világ zárolva lett (amely ebben az esetben hatékonyan állítja be a SolverHandler UpdateSolverjét Hamis értékre).