Udostępnij za pośrednictwem


Menu ręczne — MRTK3

Menu ręczne

Menu ręczne umożliwiają użytkownikom wyświetlanie ręcznie dołączonego interfejsu użytkownika do często używanych funkcji. Są to zwykle małe grupy przycisków , które oferują szybkie akcje. Jednak czasami bardziej złożone układy do wyświetlania informacji lub ustawień są udostępniane użytkownikowi jako menu ręczne, często z opcją "rozerwania" menu z ręki i zakotwiczenia go na świecie.

Menu Ręka zawiera opcje "Wymagaj płaskiej ręki" i "Użyj aktywacji spojrzenia", aby zapobiec fałszywej aktywacji podczas interakcji z innymi obiektami. Zaleca się użycie tych opcji, aby zapobiec niechcianej aktywacji.

Przykładowa scena i prefabryki

Jeśli używasz projektu szablonu, HandMenuExamples.unity demonstruje kilka typowych konfiguracji menu ręcznych, wszystkie przy użyciu skryptu HandConstraintPalmUp .

Przykładowa scena menu ręcznego

HandMenuLarge

Ten prefab przedstawia przykład dużego lub złożonego interfejsu użytkownika, który wymaga dłuższego czasu interakcji. W przypadku tego typu interfejsu użytkownika zaleca się zablokowanie menu na ręku, aby poprawić użyteczność i uniknąć zmęczenia ramieniem. W tym przykładzie jest również obsługiwane polecenie "chwytanie i ściąganie" w celu zablokowania menu.

W tym przykładzie menu staje się widoczne i niewidoczne przez aktywowanie obiektu MenuContent w zdarzeniu OnFirstHandDetected(). Po zdarzeniu OnLastHandLost() przycisk zamknięcia jest aktywowany, a animacja umieszczania jest wyzwalana. Animacja to proste wahania skalowania. Ponieważ nie ukrywaliśmy zdarzenia MenuContent w zdarzeniu OnLastHandLost(), menu zostanie automatycznie zablokowane, gdy ręka nie jest widoczna. Wartości w sekcji Palm Up zostały zoptymalizowane pod kątem tego, że menu jest zablokowane bez przeciągania zbyt dużej ilości na upuszczanie.

Przykład menu ręcznego — duży 1

Konfiguracja palm up

W tym przykładzie znajduje się pasek do chwytania w dolnej części menu oraz zachowanie automatycznego blokowania świata. Użytkownik może jawnie odłączyć menu od ręki i umieścić go w świecie, chwytając go. Aby to osiągnąć, w przypadku zdarzenia ManipulationStarted() w obiekcie ObjectManipulator wyłączymy moduł SolverHandler.UpdateSolvers. W przeciwnym razie menu nie będzie mogło zostać odłączone, ponieważ narzędzie do rozwiązywania HandConstraint spróbuje umieścić menu w pobliżu pozycji ręki. Używamy również handConstraintPalmUp.StartWorldLockReattachCheckCoroutine , aby umożliwić użytkownikowi podniesienie ręki w celu ponownego dołączenia menu do ręki.

Przykład menu ręcznego — duży 2

Na koniec przycisk zamknij musi ponownie uaktywnić funkcję SolverHandler.UpdateSolvers w celu przywrócenia funkcji narzędzia do rozwiązywania handConstraint.

Przykład menu ręcznego — duży 3

Skrypty

Zachowanie HandConstraint zapewnia rozwiązanie, które ogranicza śledzony obiekt do regionu bezpieczne dla zawartości ograniczonej ręcznie (na przykład interfejs użytkownika, menu itp.) Bezpieczne regiony są uznawane za obszary, które nie przecinają się ręką. Dołączono również klasę pochodną wywołaną HandConstraintHandConstraintPalmUp w celu zademonstrowania wspólnego zachowania aktywowania obiektu śledzonego przez rozwiązanie, gdy palma stoi przed użytkownikiem.

Zobacz etykietki narzędzi dostępne dla każdej HandConstraint właściwości, aby uzyskać dodatkową dokumentację. Poniżej zdefiniowano kilka właściwości.

  • Bezpieczna strefa: strefa bezpieczna określa miejsce, w którym należy ograniczyć zawartość. Zaleca się umieszczenie zawartości na stronie Ulnar, aby uniknąć nakładania się na rękę i poprawy jakości interakcji. Bezpieczne strefy są obliczane przez orientację rąk rzutowaną na ortogonal płaszczyzny do widoku kamery i raycasting przed polem ograniczenia wokół rąk. Bezpieczne strefy są definiowane do pracy z usługą XRNode. Eksplorowanie, co każda bezpieczna strefa reprezentuje w różnych typach kontrolerów, jest zalecana.

  • Podążaj ręką, aż do kamery Dzięki temu aktywne narzędzie do rozwiązywania będzie podążać za rotacją dłoni, dopóki menu nie będzie wystarczająco wyrównane do spojrzenia, gdy stoi przed kamerą. Aby wykonać tę pracę, zmień wartość SolverRotationBehavior w elemecie HandConstraintSolver, z LookAtTrackedObject na LookAtMainCameraGazeAlignment kąt z modułem rozwiązywania różni się.

Przykładowa strefa bezpieczna menu ręcznego

  • Zdarzenia aktywacji: obecnie HandConstraint wyzwala cztery zdarzenia aktywacji. Te zdarzenia mogą być używane w wielu różnych kombinacjach do tworzenia unikatowych HandConstraint zachowań.

    • OnHandActivate: wyzwala, gdy ręka spełnia metodę IsHandActive.
    • OnHandDeactivate: wyzwala, gdy metoda IsHandActive nie jest już spełniona.
    • OnFirstHandDetected: występuje, gdy stan śledzenia ręki zmienia się z braku rąk w widoku do pierwszej ręki w widoku.
    • OnLastHandLost: występuje, gdy stan śledzenia ręki zmienia się z co najmniej jednej strony w celu braku rąk w widoku.
  • Logika aktywacji/dezaktywacji modułu rozwiązywania: obecnie zaleca się aktywowanie i dezaktywowanie HandConstraintPalmUp logiki przy użyciu SolverHandlerwartości "s UpdateSolver " zamiast wyłączania/włączania obiektu. Można to zobaczyć w przykładowej scenie za pomocą zaczepek opartych na edytorze wyzwalanych po dołączonym menuHandler "OnManipulationStarted/Ended" zdarzeń.

    • Zatrzymanie logiki ograniczenia ręcznego: podczas próby ustawienia obiektu ograniczonego do ręki zatrzymać (a nie uruchomić logiki aktywacji/dezaktywacji), ustaw wartość UpdateSolver na False, zamiast wyłączać HandConstraintPalmUp.
      • Jeśli chcesz włączyć logikę reattach opartą na spojrzeniu (a nawet nie opartej na spojrzeniu), następuje wywołanie HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() funkcji. Spowoduje to wyzwolenie coroutine, która będzie nadal sprawdzać, czy kryteria "IsValidController" są spełnione i ustawi wartość UpdateSolver na true po jego utworzeniu (lub obiekt jest wyłączony).
    • Uruchamianie logiki ograniczeń ręcznych: podczas próby ustawienia obiektu ograniczonego rąk, aby ponownie zacząć podążać za ręką (na podstawie tego, czy spełnia kryteria aktywacji), ustaw wartość UpdateSolver programu SolverHandler na true.
  • Ponowne dołączanie logiki: Obecnie HandConstraintPalmUp obiekt docelowy może automatycznie ponownie dołączyć obiekt docelowy do śledzonego punktu, niezależnie od tego, czy SolverHandlerwartość 's UpdateSolver ma wartość True). Jest to wykonywane przez wywołanie HandConstraintPalmUpfunkcji " StartWorldLockReattachCheckCoroutine() po jej zablokowaniu na świecie (co w tym przypadku skutecznie ustawia wartość UpdateSolver programu SolverHandler na false).