Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit Handmenüs können Benutzer eine handgefügte Benutzeroberfläche für häufig verwendete Funktionen aufrufen. Dies sind in der Regel kleine Schaltflächengruppen , die schnelle Aktionen bieten. Manchmal werden dem Benutzer jedoch komplexere Layouts zum Anzeigen von Informationen oder Einstellungen als Handmenü bereitgestellt, oft mit der Option, das Menü von der Hand "wegzureißen" und es in der Welt zu verankern.
Das Menü Hand enthält die Optionen "Flache Hand erforderlich" und "Aktivierung des Anvisierens verwenden", um eine falsche Aktivierung bei der Interaktion mit anderen Objekten zu verhindern. Es wird empfohlen, diese Optionen zu verwenden, um eine unerwünschte Aktivierung zu verhindern.
Beispielszene und Prefabs
Wenn Sie das Vorlagenprojekt verwenden, HandMenuExamples.unity veranschaulicht mehrere gängige Konfigurationen für Handmenüs, die alle das HandConstraintPalmUp Skript verwenden.
HandMenuLarge
Dieses Prefab veranschaulicht das Beispiel einer großen oder komplexen Benutzeroberfläche, die eine längere Interaktionszeit erfordert. Für diese Art von Benutzeroberfläche wird empfohlen, das Menü auf der Hand zu sperren, um die Benutzerfreundlichkeit zu verbessern und Armermüdung zu vermeiden. In diesem Beispiel wird auch "greifen und ziehen" unterstützt, um das Menü zu sperren.
In diesem Beispiel wird das Menü sichtbar und unsichtbar, indem das MenuContent-Objekt für das OnFirstHandDetected() -Ereignis aktiviert wird. Mit dem OnLastHandLost() -Ereignis wird die Schaltfläche zum Schließen aktiviert, und die Platzierungsanimation wird ausgelöst. Die Animation ist eine einfache Skalierungsschwankung. Da das MenuContent on OnLastHandLost() -Ereignis nicht ausgeblendet wurde, wird das Menü automatisch weltgesperrt, wenn die Hand nicht sichtbar ist. Die Werte im Abschnitt Palm up wurden optimiert, um das Menü weltgebunden zu machen, ohne beim Ablegen zu viel nach unten gezogen zu werden.
In diesem Beispiel wird die Ziehleiste im unteren Bereich des Menüs und das automatische Weltsperrverhalten bereitgestellt. Der Benutzer kann das Menü explizit von der Hand trennen und es in der Welt platzieren, indem er diese tastet. Um dies zu erreichen, deaktivieren wir solverHandler.UpdateSolvers beim ManipulationStarted()-Ereignis in ObjectManipulator. Andernfalls kann das Menü nicht getrennt werden, da der HandConstraint-Solver versucht, das Menü in der Nähe der Handposition zu positionieren. Wir verwenden auch HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine , damit der Benutzer die Hand heben kann, um das Menü erneut an die Hand anfügen zu können.
Schließlich muss die Schaltfläche zum Schließen die SolverHandler.UpdateSolvers reaktivieren, um die Funktionalität des HandConstraint-Solvers wiederherzustellen.
Skripts
Das HandConstraint Verhalten stellt einen Solver bereit, der das nachverfolgte Objekt auf einen Bereich einschränkt, der für handbeschränkte Inhalte (z. B. Handbenutzeroberfläche, Menüs usw.) sicher ist. Sichere Regionen werden als Bereiche betrachtet, die sich nicht mit der Hand überschneiden. Eine abgeleitete Klasse von HandConstraint aufgerufen HandConstraintPalmUp ist ebenfalls enthalten, um ein allgemeines Verhalten der Aktivierung des solvertracked-Objekts zu veranschaulichen, wenn die Handfläche dem Benutzer zugewandt ist.
Weitere Dokumentation finden Sie in den für jede HandConstraint Eigenschaft verfügbaren QuickInfos. Einige Eigenschaften werden unten ausführlicher definiert.
Sichere Zone: Die sichere Zone gibt an, wo Inhalte eingeschränkt werden sollen. Es wird empfohlen, Inhalte auf der Ulnar-Seite zu platzieren, um Überschneidungen mit der Hand und eine verbesserte Interaktionsqualität zu vermeiden. Sicherheitszonen werden durch die Ausrichtung der Hände berechnet, die in eine orthogonale Ebene auf die Ansicht der Kamera projiziert wird, und raycasting gegen einen Begrenzungsrahmen um die Hände. Sichere Zonen werden für die Arbeit mit
XRNodedefiniert. Es wird empfohlen, zu untersuchen, was jede sichere Zone für verschiedene Controllertypen darstellt.Hand folgen, bis kamera Wenn dieser aktiviert ist, folgt der Solver der Handdrehung, bis das Menü ausreichend am Anvisieren ausgerichtet ist, wenn es der Kamera zugewandt ist. Damit dies funktioniert, ändern Sie in
SolverRotationBehaviorHandConstraintSolvervon in ,LookAtTrackedObjectLookAtMainCamerada derGazeAlignmentWinkel mit dem Solver variiert.
Aktivierungsereignisse: Derzeit löst vier
HandConstraintAktivierungsereignisse aus. Diese Ereignisse können in vielen verschiedenen Kombinationen verwendet werden, um eindeutigeHandConstraintVerhaltensweisen zu erstellen.- OnHandActivate: Wird ausgelöst, wenn eine Hand die IsHandActive-Methode erfüllt.
- OnHandDeactivate: Wird ausgelöst, wenn die IsHandActive-Methode nicht mehr erfüllt ist.
- OnFirstHandDetected: tritt auf, wenn sich der Zustand der Handverfolgung von "Keine Hände in Sicht" in die erste Hand in der Ansicht ändert.
- OnLastHandLost: tritt auf, wenn sich der Zustand der Handverfolgung von mindestens einer Hand in Der Ansicht in keine Hände ändert.
Solver-Aktivierungs-/Deaktivierungslogik: Derzeit wird empfohlen
HandConstraintPalmUp, dies mithilfe desSolverHandlerWertsUpdateSolvervon zu tun, anstatt das Objekt zu deaktivieren/zu aktivieren. Dies ist in der Beispielszene durch die editorbasierten Hooks zu sehen, die nach den ManipulationHandler-Ereignissen "OnManipulationStarted/Ended" des angefügten Menüs ausgelöst werden.-
Beenden der Handeinschränkungslogik: Legen Sie UpdateSolver auf False fest, anstatt HandConstraintPalmUp zu deaktivieren.
- Wenn Sie die Anvisieren-basierte (oder sogar nicht anvisieren-basierte) Neuanfügen-Logik aktivieren möchten, wird darauf die -Funktion aufgerufen
HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Dadurch wird eine Coroutine ausgelöst, die weiterhin überprüft, ob die "IsValidController"-Kriterien erfüllt sind, und UpdateSolver auf True festsetzt, sobald dies der Fall ist (oder das Objekt deaktiviert ist).
- Wenn Sie die Anvisieren-basierte (oder sogar nicht anvisieren-basierte) Neuanfügen-Logik aktivieren möchten, wird darauf die -Funktion aufgerufen
- Starten der Handeinschränkungslogik: Wenn Sie versuchen, das handbeschränkte Objekt so festzulegen, dass es ihrer Hand erneut folgt (basierend darauf, ob sie die Aktivierungskriterien erfüllt), legen Sie updateSolver von SolverHandler auf true fest.
-
Beenden der Handeinschränkungslogik: Legen Sie UpdateSolver auf False fest, anstatt HandConstraintPalmUp zu deaktivieren.
-
Logik erneut anfügen: Derzeit kann das
HandConstraintPalmUpZielobjekt automatisch erneut an den nachverfolgten Punkt angefügt werden, unabhängig davon, ob trueSolverHandlerUpdateSolverist. Dies erfolgt durch Aufrufen derHandConstraintPalmUpFunktion vonStartWorldLockReattachCheckCoroutine(), nachdem sie weltgesperrt wurde (was in diesem Fall effektiv das UpdateSolver von SolverHandler auf False festlegt).