Übung: Steuern von 3D-Objekten mithilfe eines Begrenzungssteuerelements
Durch das ObjectManipulator-Skript wird ein Objekt mit einer oder zwei Händen verschiebbar, skalierbar und drehbar. Dieses Skript unterstützt das Eingabemodell der direkten Steuerung, da es Benutzer*innen die Möglichkeit gibt, Hologramme direkt mit den Händen zu berühren. Hier verwenden Sie ObjectManipulator, um Handinteraktionen zu ermöglichen, sodass Sie den Rover Explorer bewegen, skalieren und drehen können.
Darüber hinaus konfigurieren Sie den Rover Explorer so, dass Sie die Teile des Rovers auf dem Rover platzieren können, um daraus eine vollständige Rover-Assembly zu machen. Erweitern Sie im Bereich „Hierarchie“ das Objekt RoverExplorer >RoverParts, und wählen Sie alle untergeordneten „RoverParts“-Objekte und das RoverAssembly-Objekt aus. Verwenden Sie anschließend im Bereich „Inspektor“ die Schaltfläche Komponente hinzufügen, um allen ausgewählten Objekten die folgenden Komponenten hinzuzufügen:
- Object Manipulator (Script) -Komponente
- Part Assembly Controller (Script) -Komponente (Teilassembly-Controller (Skript))
Wenn alle „RoverParts“-Objekte und das Objekt „RoverAssembly“ noch ausgewählt sind, konfigurieren Sie im Bereich „Inspector“ die Komponente Object Manipulator (Script) (ObjektManipulator-Skript) wie folgt:
Suchen Sie unter Base Interactable Settings nach dem Ereignis On Clicked(). Klicken Sie auf das Symbol +, um ein neues Ereignis hinzuzufügen. Konfigurieren Sie das Ereignis wie folgt:
a. Weisen Sie das RoverAssembly-Objekt als Listener für das On Clicked ()-Ereignis zu, indem Sie es aus Hierarchy in das Feld None (Object) ziehen.
b. Wählen Sie in der Dropdownliste No FunctionTapToPlace>StartPlacement() aus, um diese Methode beim Auslösen des Ereignisses aufzurufen.
Deaktivieren Sie in der Dropdownliste Allowed Manipulation Type das Kontrollkästchen „Scale“, sodass nur Move und Rotate aktiviert sind:
Wählen Sie nur das RoverAssembly-Objekt aus, und entfernen Sie dessen „Stateful Interactable“-Komponente, falls vorhanden. Wählen Sie die drei Punkte ganz rechts neben der Komponente und dann Remove Component aus.
Navigieren Sie im Projektbereich zum Ordner Packages>MRTK Standard Assets>Audio>HoloLens2, um die Audioclips zu suchen:
Wählen Sie im Bereich „Hierarchy“ (Hierarchie) alle RoverParts-Objekte aus. Wählen Sie anschließend im Bereich „Inspector“ die Option Add Component (Komponente hinzufügen) aus, um die Komponente Audio Source (Audioquellen) hinzuzufügen und wie folgt zu konfigurieren:
- Weisen Sie den Audioclip MRTK_Scale_Start dem Feld AudioClip zu
- Deaktivieren Sie das Kontrollkästchen Play On Awake (Nach Laden wiedergeben)
- Legen Sie für Spatial Blend (Räumliche Mischung) den Wert 1 fest.
Erweitern Sie im Bereich „Hierarchie“ das Objekt RoverAssembly > RoverModel_PlacementHints_XRay >Parts_PlacementHints, um alle PlacementHint-Objekte anzuzeigen. Wählen Sie anschließend das erste Rover-Teil (RoverParts >Camera_Part) aus, und konfigurieren Sie die Komponente Part Assembly Controller (Script) wie folgt:
- Weisen Sie das Objekt Camera_PlacementHint dem Feld Location To Place zu
Wiederholen Sie Schritt 5 für alle übrigen „RoverParts“-Objekte und das „RoverAssembly“-Objekt, um die Komponente Part Assembly Controller (Script) wie folgt zu konfigurieren:
- Weisen Sie für Generator_Part das Generator_PlacementHint-Objekt dem Feld Location To Place (Ort zum Platzieren) zu.
- Weisen Sie für Lights_Part das Lights_PlacementHint-Objekt dem Feld Location To Place (Ort zum Platzieren) zu.
- Weisen Sie für UHFAntenna_Part das UHFAntenna_PlacementHint-Objekt dem Feld Location To Place (Ort zum Platzieren) zu.
- Weisen Sie für das Spectrometer_Part das Spectrometer_PlacementHint-Objekt dem Feld Location To Place zu
- Weisen Sie für RoverAssembly das Objekt selbst, d. h. dasselbe RoverAssembly-Objekt dem Feld Location To Place (Ort zum Platzieren) zu.
Wählen Sie im Bereich „Hierarchy“ das Schaltflächenobjekt „RoverExplorer“ > „Buttons“ >Reset aus. Konfigurieren Sie anschließend im Bereich „Inspector“ das Ereignis „PressableButton“ OnClicked () wie folgt:
- Weisen Sie das RoverAssembly-Objekt dem Feld None (Object) (Ohne (Objekt)) zu
- Wählen Sie in der Dropdownliste No Function (Keine Funktion) PartAssemblyController>ResetPlacement () aus, um diese Funktion als die Aktion festzulegen, die beim Auslösen des Ereignisses ausgeführt wird.
Wenn Sie jetzt in den Spielmodus wechseln, können Sie die Rover-Teile mithilfe der „NearInteraction“ oder „FarInteraction“ auf dem Rover platzieren. Sobald sich das Teil nahe am entsprechenden Platzierungshinweis befindet, rastet es an der vorgesehenen Position ein und wird zu einem Teil des Rovers. Zum Zurücksetzen der Platzierungen können Sie auf die Schaltfläche „Zurücksetzen“ klicken:
Hinzufügen eines Begrenzungssteuerelements
Wählen Sie im Fenster „Hierarchy“ das RoverExplorer-Objekt aus, und verwenden Sie dann im Fenster „Inspector“ die Schaltfläche Add Component, um die BoundsControl-Komponente hinzuzufügen. Deaktivieren Sie das Kontrollkästchen neben der Komponente, um sie standardmäßig zu deaktivieren:
Navigieren Sie im Projektfenster zum Ordner Packages>MRTK Spatial Manipulation>BoundsControl>Prefabs, und ziehen Sie das BoundingBoxWithHandles-Prefab auf das Feld Bounds Visuals Prefab der Komponente Bounds Control.
Erweitern Sie im Bereich „Hierarchy“ das Objekt „Menu“ >Buttons-GridLayout (Buttons), um die drei Schaltflächen anzuzeigen. Geben Sie der dritten Schaltfläche den Namen BoundsControl_Enable, und konfigurieren Sie dann im Fenster „Hierarchy“ das Spielobjekt BoundsControl_Enable wie folgt:
- Wählen Sie das Objekt Frontplate > AnimatedContent > Icon > Label aus, und ändern Sie die TextMeshPro-Komponente in Enable. Achten Sie darauf, dass das Label-Objekt in der Hierarchie aktiviert ist.
- Konfigurieren Sie das PressableButton.OnClicked()-Ereignis, indem Sie das RoverExplorer-Objekt dem Feld None (Object) zuweisen und BoundsControl>bool Enabled in der Dropdownliste No Function auswählen. Stellen Sie sicher, dass das Kontrollkästchen für das Argument aktiviert ist.
- Wählen Sie das kleine +-Symbol aus, um ein weiteres Ereignis hinzuzufügen.
- Weisen Sie das RoverExplorer-Objekt dem Feld None (Object) (Ohne (Objekt)) zu
- Wählen Sie in der Dropdownliste No Function die Option ObjectManipulator>bool Enabled aus, sodass dieser Eigenschaftswert beim Auslösen des Ereignisses aktualisiert wird. Stellen Sie außerdem sicher, dass das Kontrollkästchen für das Argument aktiviert ist.
- Wählen Sie das kleine +-Symbol aus, um ein weiteres Ereignis hinzuzufügen.
- Weisen Sie das RoverExplorer-Objekt dem Feld None (Object) (Ohne (Objekt)) zu
- Wählen Sie in der Dropdownliste No FunctionBoundsControl>bool HandlesActive aus, sodass dieser Eigenschaftswert beim Auslösen des Ereignisses aktualisiert wird. Stellen Sie außerdem sicher, dass das Kontrollkästchen für das Argument aktiviert ist.
- Wählen Sie das Objekt Frontplate > AnimatedContent > Icon > UIButtonFontIcon aus, und ändern Sie Icon in das Symbol mit vier Pfeilen in der Komponente Font Icon Selector. Sie finden dies in der Liste der Symbole, oder Sie legen ** Aktueller Symbolname** auf „Icon 40“ fest.
Duplizieren Sie die Schaltfläche BoundsControl_Enable, und benennen Sie sie in BoundsControl_Disable um. Konfigurieren Sie anschließend im Bereich „Inspector“ die Komponente Button Config Helper (Script) wie folgt:
- Wählen Sie das Objekt Frontplate > AnimatedContent > Icon > Label aus, und ändern Sie die „TextMeshPro“-Komponente in Disable.
- Konfigurieren Sie das PressableButton.OnClicked()-Ereignis, indem Sie sicherstellen, dass alle Kontrollkästchen unter den Ereignissen deaktiviert sind.
Wenn Sie jetzt in den Spielemodus wechseln und Enable (Aktivieren) auswählen, um „BoundsControl“ zu aktivieren, können Sie mithilfe der NearInteraction oder FarInteraction „BoundsControl“ verschieben, drehen und skalieren. Wählen Sie Disable (Deaktivieren) aus, um „BoundsControl“ wieder zu deaktivieren: