Entwickeln

Hände und Controller gleichzeitig nutzen (multimodal)

Aktualisiert: 17.02.2026
Multimodal Input bietet das gleichzeitige Tracking von Händen und Controllern. Die Funktion zeigt auch an, ob Nutzer*innen den/die Controller in den Händen halten oder nicht. Dank Multimodal Input können Nutzer*innen das Beste aus beiden Welten erleben: Sie können für eine stärkere Immersion ihre Hände nutzen oder für Genauigkeit und Haptik zum Controller greifen. Das System erkennt automatisch, ob du Controller in der Hand hältst oder sie abgelegt hast (z. B. auf einem Schreibtisch) und ermöglicht so den nahtlosen Übergang zwischen Hand-Tracking und Controller-Eingabe. Wenn das Feature aktiv ist, überschreibt Multimodal Input andere Übergangsmethoden, einschließlich automatischer Übergänge und doppelt tippen.
Wenn du noch keine Erfahrung mit der Unity-Entwicklung auf der Quest hast, lies dir unseren Leitfaden „Hello World“ durch, um deine erste VR-App zu erstellen.

Vorteile von Multimodal Input

  • Hand- und Controller-Spielweise: Nutze einen Controller in der einen Hand als Werkzeug oder Waffe (für hohe Genauigkeit, Haptik und ein breites Sichtfeld), während du die andere Hand frei hast, um mit Objekten zu interagieren oder Zauber zu wirken (für starke Immersion).
  • Einzelcontroller-Spielweise: Wenn für dein Spielerlebnis nur ein Controller bei den meisten Interaktionen nötig ist, können Nutzer*innen nur einen Controller halten und ihre andere Hand bei Bedarf für Immersion und lockere Interaktionen einsetzen (z. B. einen Controller als Schläger nutzen und mit der freien Hand den Ball aufheben oder mit Menüs interagieren).
  • Hände und Controller abwechselnd nutzen für mehr Komfort: Nutze eine Hand für direkte Interaktionen mit Steuerungselementen, während die andere Hand einen Controller als „Fernbedienung“ für mühelose indirekte Interaktionen hält.
  • Sofortiger Übergang zwischen Händen und Controllern: Wenn Hand-Tracking aktiv ist, können wir sofort feststellen, wenn Nutzer*innen den Controller nicht mehr in der Hand halten. Manuelle Übergänge sind dadurch kaum noch nötig und langsame oder fehlgeschlagene automatische Übergänge werden vermieden.
  • Controller finden: Da die Controller jetzt auch getrackt werden, während Nutzer*innen ihre Hände einsetzen, kann die App anzeigen, wo sich die Controller befinden, sobald Nutzer*innen sie in die Hand nehmen wollen. Das ermöglicht einen reibungsloseren Übergang zurück zum Controller, ohne die Immersion durch Passthrough oder das Absetzen des Headsets zu zerstören.

Bekannte Einschränkungen

  • Das In-der-Hand-Signal basiert auf verschiedenen nicht perfekten Signalen, unter anderem der Hand- und Controller-Position sowie den Controller-Signalen. Dadurch kann es in bestimmten Szenarien dazu kommen, dass das System fälschlicherweise anzeigt, dass Nutzer*innen den Controller nicht in der Hand halten – zum Beispiel wenn das Tracking unterbrochen oder falsch ist, oder wenn Nutzer*innen den Controller für eine Weile nicht bewegen. Wir raten dazu, diese Einschränkungen bei der Entwicklung zu berücksichtigen. Vermeide etwa, dass Objekte fallengelassen werden, wenn das System fälschlicherweise einen kurzzeitigen Übergang von Controllern zu Händen meldet.
  • Wenn die Pause-Funktion aufgerufen wird, wechselt die App zurück zum Nicht-gleichzeitig-Modus, in dem herkömmliche Hände-und-Controller-Apps ausgeführt werden, sodass Nutzer*innen jederzeit sowohl ihre Hände als auch die Controller verwenden können. Das Tracking-System benötigt möglicherweise einige Sekunden, um die korrekte Eingabe zu erkennen und zu wählen, je nachdem wie Nutzer*innen die Controller in dem Moment halten.
  • Wenn du Link mit einem PC verwendest, sind die Haltungsdaten für Controller nicht verfügbar, wenn du sie nicht aktiv verwendest (z. B. wenn sie auf einem Tisch liegen).

Kompatibilität

Hardwarekompatibilität

  • Quest 2
  • Quest Pro
  • Quest 3
  • Quest 3S

Softwarekompatibilität

  • Unity Version 2022.3.15f1 oder höher (wir empfehlen Unity 6 oder höher)
  • Meta XR Core SDK v62 oder höher

Funktionskompatibilität

  • Multimodal Input ist inkombapibel mit Inside-Out Body-Tracking (IOBT) sowie Ganzkörpersynthese (Full Body Synthesis; FBS). Verwende diese Modi bitte nicht gleichzeitig.
  • Du kannst Multimodal Input aber zusammen mit dem Fast Motion Mode (FMM) verwenden. Wenn beide Modi aktiviert sind, gilt Multimodal vorrangig. Da FMM im Manifest definiert wird, kannst du FMM auf App-Ebene aktivieren, und Multimodal nur für bestimmte Erfahrungen einsetzen, bei denen FMM weniger wichtig ist.
  • Bei Quest 2 kannst du Multimodal nicht zugleich mit LipSync aktivieren.
  • Passthrough, Multimodal Input und Wide Motion Mode (WMM) können nicht gleichzeitig aktiviert sein. Wenn alle drei gleichzeitig eingeschaltet werden, deaktiviert das System WMM.
  • Vollständig kompatibel mit Capsense-Händen.
  • Vollständig kompatibel mit Haptik.

Setup

  1. Installiere das Meta XR Core SDK Package V74 oder höher.
  2. Folge den Schritten im Hello World-Tutorial für Meta Quest-VR-Headsets, um ein Kamera-Rig und Controller einzurichten.
  3. Suche das Script OVR Manager, das OVRCameraRig angehängt ist. Dort findest du die Option: „Concurrent Hands and Controllers support“.
    Enable concurrent hands and controllers
  4. Wähle unter Window > Package Manager den Eintrag Meta XR Core SDK und klicke im Tab Samples auf Import. Damit importierst du die Multimodal-Beispielszene.
    Import the sample scene
  5. Suche unter Project nach OVRControllerPrefab.
  6. Ziehe OVRControllerPrefab aus den Suchergebnissen zur Hierarchy der neuen GameObjects LeftHandAnchorDetached und RightHandAnchorDetached. Eine Demonstration findest du unter Assets/Samples/Meta XR Core SDK/<version>/Sample Scenes/SimultaneousHandsAndControllers.unity.
    Add OVRControllerPrefab objects
  7. Richte für die neuen GameObjects OVRControllerPrefab als ShowState die Option Controller Not In Hand ein und stelle für den Controller die Option Touch ein.
    Set ShowState
  8. Suche unter Project nach OVRControllerPrefab.
  9. Ziehe OVRControllerPrefab aus den Suchergebnissen zu LeftControllerInHandAnchor.
  10. Wähle unter Hierarchy die Option OVRControllerPrefab aus.
  11. Stelle im Inspector ein, dass der Controller mit der Hand übereinstimmt, und stelle als Show State die Option Controller In Hand ein.
    Anchor setup for controllers
  12. Wiederhole die Schritte sechs bis zehn für RightControllerInHandAnchor.
  13. Suche unter Project nach OVRHandPrefab.
  14. Ziehe OVRHandPrefab aus den Suchergebnissen zu LeftHandOnControllerAnchor.
  15. Achte im Inspector darauf, dass Hand Type mit der Hand übereinstimmt, und stelle als Show State die Option Controller In Hand ein.
    Anchor setup for hands
  16. Wiederhole die Schritte 11 bis 14 für RightHandOnControllerAnchor.

Prefab-Änderungen

OVRControllerHelper und OVRHand haben einen enum von ShowState mit folgenden Optionen:
  • Always: Das Objekt wird nicht automatisch anhand des Controller- und Handstatus deaktiviert.
  • Controller in Hand or no Hand: Dieses Objekt wird deaktiviert, wenn sich der Controller nicht in der Hand des*der Nutzer*in befindet oder Hand-Tracking vollständig deaktiviert ist.
  • Controller in Hand: Das Objekt wird deaktiviert, wenn sich der Controller derzeit nicht in der Hand des*der Nutzer*in befindet.
  • Controller Not in Hand: Das Objekt wird deaktiviert, wenn es sich in der Hand eines*einer Nutzer*in befindet. Diese Option wird in Situationen verwendet, wenn der Controller auf dem Schreibtisch liegt.
  • No Hand: Hierdurch wird das Rendern des Objekts deaktiviert, wenn das Hand-Tracking aktiviert ist und eine Hand vorhanden ist.
OVRControllerPrefab: OVRControllerHelper
  • Show State
  • When Hands Are Powered By Natural Controller Poses: Dieses Kontrollkästchen steuert, ob die Controller auch dann gerendert werden können, wenn natürliche Handhaltungen aktiviert sind. Dies wird verwendet, wenn die Controller nicht in der Hand sind.
OVRHandPrefab: OVRHand
  • Show State

Neue Anker für die Multimodal-Funktion

  • LeftHandAnchorDetached und RightHandAnchorDetached: Diese Anker kommen für Controller zum Einsatz, die Nutzer*innen nicht in der Hand haben, während Simultaneous Hands und die Controller-Schnittstelle aktiviert sind. Das standardmäßige CameraRig-Prefab enthält unter diesen Ankern keine Controller-Prefabs. Du musst sie also hinzufügen, wenn du sie nutzen möchtest. Als Show State solltest du für diese Prefabs Controller Not in Hand einstellen.

Separate Controller-Profile

Wenn Multimodal aktiviert ist, verwendet das SDK spezielle, separate Controller-Profile, um Controller zu tracken, die sich nicht in der Hand des*der Nutzer*in befinden. Für die folgenden Controllertypen werden diese Profile automatisch registriert:
  • Oculus Touch Controller – Standard-Touch-Controller
  • Meta Quest Touch Pro-Controller – Touch Pro-Controller mit erweiterten Funktionen
  • Meta Quest Touch Plus-Controller – Touch Plus-Controller
Das SDK wechselt automatisch zwischen den Standard-Controller-Profilen (wenn Controller in der Hand gehalten werden) und den Profilen für separate Controller (wenn Controller abgelegt wurden), je nach dem aktiven Interaktionsprofil, das von der OpenXR-Runtime erkannt wird. Dadurch kann das System gleichzeitig deine Hände und die physische Position der abgelegten Controller tracken.

Fehlerbehebung

Woran erkenne ich, dass Multimodal auf meinem Headset läuft?

Überprüfe, ob der Aktionspfad des abgesetzten Controllers Daten bereitstellt.

Kann ich die Funktion auf meinem Headset testen, ohne meinen Code zu ändern?

Nein.

Der Wechsel zwischen Controllern und Händen funktioniert in diesem Beispiel nicht.

Stelle sicher, dass du Quest 2 (mit Meta Quest Pro-Controllern, die mit deinem Headset gekoppelt sind), Quest 3 oder Quest Pro verwendest.
Using OVRCameraRig -> TrackingSpace to get positions of hands and controllers simultaneously
Die Objekthierarchie des OVRCameraRig-Tracking-Bereichs erschwert es, mit veralteten Ankern gleichzeitig Hand- und Controller-Daten zu liefern. Wir mussten deshalb mehrere neue Anker im Tracking-Bereich erstellen und für die Controller- und Hand-Prefabs eine Gating-Logik hinzufügen, die bestimmt, ob sie gerendert werden oder nicht.