HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

0 Shares

Nachdem wir alles eingerichtet, das System erstellt, mit Fokus und Blick gearbeitet, unsere Begrenzungsrahmen- und UI-Elemente erstellt, die Menübewegung freigeschaltet und durch Rahmen gesprungen sind, die einige Teile des Systems selbst umgestaltet haben, haben wir es endlich geschafft Der Punkt in unserer Serie über dynamische Benutzeroberflächen für HoloLens, an dem wir eine echte Interaktion erhalten.

Es ist jetzt an der Zeit, unsere Objekte als Reaktion auf Eingaben aus unserem Menü zu bewegen, zu skalieren und zu drehen. In vielerlei Hinsicht hat diese ganze Tutorial-Serie viel harte Arbeit geleistet, um das Back-End zu vereinfachen. So einfach, dass es praktisch auf diese Linie ankommt:

HostTransform.position = Vector3.Lerp (HostTransform.position, HostTransform.position + manipulationDelta, PositionLerpSpeed);

Als ich im Juli anfing, diese Serie neu zu planen, begann ich diesen Teil mit der HandDraggable-Klasse aus dem MixedRealityToolkit. Es ist eine robuste Klasse, die einige Faktoren und eine Menge Mathematik berücksichtigt, um die Bewegung auszuführen. Ich mochte es nicht, wie es als Lektion herauskam, also beschloss ich, es anders zu versuchen.

Zuvor: Erstellen einer dynamischen Benutzeroberfläche, Teil 8 (Raycasting & der Blickmanager)

Einige der HandDraggable-Setups sind noch vorhanden, denn warum das Rad neu erfinden? Habe ich recht?

Wählen Sie in Ihrem Unity-Projekt das Unterobjekt “Verschieben” von aus TransformUITool Klicken Sie im Hierarchiefenster auf die Schaltfläche “Komponente hinzufügen” in der Inspektor. Wählen Sie “Neues Skript” und geben Sie ein MoveTool und klicken Sie auf die Schaltfläche “Erstellen und Hinzufügen”. Doppelklicken Sie dann auf das MoveTool-Feld, das im Inspektor angezeigt wird, um Visual Studio zu öffnen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Der Rest von dem, was Sie in dieser Lektion sehen werden, ist Code aus derselben Klasse. Geben Sie es entweder ein, während wir gehen, oder kopieren Sie es und fügen Sie es aus unserer Pastebin-Datei ein. Sobald das aus dem Weg ist, können wir es Stück für Stück durchgehen.

Sie können in der bemerken Klasse Erklärung aus der Vergangenheit MonoBehaviour dass es einige Schnittstellen gibt, ähnlich wie wir sie in Teil 3 dieser Serie verwendet haben. Der Unterschied besteht darin, dass wir diesmal eine Reihe von Schnittstellen implementieren.

IFocusable: Diese kennen wir bereits, da wir sie in Verbindung mit Delegierten und Ereignissen verwendet haben, um eine Reihe von Dingen im gesamten Code zu erledigen. IInputHandler: Diese Schnittstelle implementiert eine einfache zeigerähnliche Eingabe. ISourceStateHandler: Diese Schnittstelle behandelt Änderungen in der Quelle, z. B. wenn sich die Hand außer Sichtweite bewegt. IManipulationHandler: Eine Schnittstelle zur Handhabung von Manipulationsgesten. Dies ist diejenige, die in HandDraggable nicht verwendet wurde, aber die meiste Arbeit für uns erledigt.

Möglicherweise bemerken Sie die Attribute [Range(0.0.1f, 1.0f)] auf einigen unserer Immobilien. Diese zeichnen einen Schieberegler in Unitys Inspector. Ein sehr nützlicher Weg, um die Auswahl einzuschränken. Darüber hinaus haben wir die normale Auswahl an Bools, Floats, Vector3s und GameObjects mit dem neuen Zusatz IInputSource. Letzteres kann eine Referenz auf alles sein, was ein Benutzer zur Interaktion mit einem Gerät verwenden würde.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

In unserer Start () -Methode setzen wir unsere Transformation auf HostTransform. Das ist vorübergehend. Aufgrund des Zeitpunkts, zu dem der NRSRManager bereit sein wird, gibt es Situationen, die diese Klasse zulassen Aktualisieren ausgeführt werden, bevor der NRSRManager bereit ist, was eine Nullausnahme verursachen würde.

Dann machten wir uns auf den Weg Camera.main auf das Grundstück Hauptkamera.

In dem Aktualisieren Funktion überprüfen wir, ob NRSRManager ein fokussiertes Objekt hat, und wenn ja, setzen wir unser HostTransform dieses Objekt sein. Ich habe dir doch gesagt, dass es nur vorübergehend ist.

Dann testen wir, ob IsDraggingEnabled ist aktiviert, was standardmäßig sein sollte, und wenn isDragging true ist, führen wir diese Codezeile aus, die im obigen Intro veröffentlicht wurde.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Sehen Sie, es ist eine wirklich einfache Klasse. Wir Lerp das Objekt von seiner aktuellen Position zu seiner Position plus manipulationDelta zu der Rate, die wir im Inspektor festgelegt haben. Wie setzen wir? isDragging zu wahr, und wo tut manipulationDelta kommst du, fragst du? Nun, hier kommt der Rest des Codes ins Spiel.

StartDragging () und StopDragging () sind einfache Catch-and-Release-Fallen, die ein paar Bools überprüfen, ähnlich wie wir es in der Vergangenheit getan haben. Wenn diese Bedingungen es uns ermöglichen, durchzukommen, setzen wir unsere:

NRSRManager.holdSelectedObject_USingTransformTool

StopDragging () wirkt auch als Reset durch Aufbruch currentInputSource auf null setzen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Jetzt beginnen wir mit der Implementierung der Schnittstelle. Und zu Beginn haben wir OnFocusEnter und OnFocusExit. Dies ist fast genau das, was es in der Vergangenheit für uns getan hat. Einfach ausgedrückt, sie helfen uns dabei, Zustände wie zu setzen StartDragging und StopDraggingIn diesem Fall ist das Endergebnis das isGazed ist wahr oder falsch.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

OnInputDown ist der erste der IInputHandler Funktionen. Es werden einige Flags überprüft, und es wird überprüft, ob wir Positionsinformationen von unserer Quelle erhalten, was für unsere Zwecke wichtig ist.

Wenn wir es durch das Minenfeld der Bools schaffen, sind wir jetzt in einem isDragging = true; Wir greifen nach Hinweisen zu Eingabequelle und führen Sie die StartDragging () Methode.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Das andere IInputHandler Methode ist OnInputUp, was, wenn die currentInputSource ist nicht null, dann wir StopDragging (), was es auf null setzt.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Die Sache mit Schnittstellen ist, dass Sie zwar eine Funktion in ihrem Vertrag implementieren müssen, aber was Sie damit tun, ganz bei Ihnen liegt. Im Falle von ISourceStateHandler, wir haben keine Verwendung für OnSourceDetectedWährend die Methode vorhanden ist, ist sie leer.

Auf der anderen Seite mit OnSourceLosttesten wir nochmal auf currentInputSource, und wenn es nicht null ist, dann laufen wir StopDragging () nochmal.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Und schließlich sind wir bei IManipulationHandler, die vier Methoden zu implementieren hat, anstatt der traditionellen zwei, die wir bisher gesehen haben. Und obwohl Sie beim Betrachten des Codes vielleicht etwas nervös werden, ist es wirklich einfach.

    Sowohl OnManipulationStarted und OnManipulationUpdatedDer erste Codeblock ist eine einfache Debug-Anweisung, die Informationen an die Unity-Konsole ausgibt. Dies sind Informationen, die ich als nützlich empfunden habe, um zu sehen, was mit den eventData los ist. Im OnManipulationStarted, setzen wir Klassenvariable manipulationEventData gleich sein mit dem eventData.CumulativeDelta hereinkommen. In OnManipulationUpdatedsetzen wir eine lokale Variable Delta als eventData.CumulativeDelta minus unserer manipulationEventData. Erstellen eines Deltas mit Delta-Informationen. Dann setzen wir unser Klassenfeld manipulationDelta das Delta multipliziert mit sein DistanceScale. Dies ist das letzte Stück unseres Bewegungsalgorithmus von Anfang an. DistanceScale ist ein Float, den wir im Inspector festlegen können, der jedoch standardmäßig auf 8 gesetzt wurde. Zuletzt legen wir unseren Klassenbereich fest manipulationEventData gleich sein eventData.CumulativeDelta wieder, so dass wir einen Referenzrahmen für das nächste Update haben.
HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)
    Endlich haben wir OnManipulationComplete, wo wir unsere beiden Vector3-Variablen auf setzen Vector3.zero oder 0,0,0.

Wenn Sie unvorhersehbaren, aber harmlosen Spaß haben möchten, kommentieren Sie diese beiden Zeilen aus und führen Sie die App aus.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 9 (Verschieben von Objekten)

Wie oben verlinkt, können Sie den gesamten Code aus der Datei MoveTool.cs in Pastebin kopieren. Wenn Sie hier Fragen haben, lesen Sie bitte die folgenden Kommentare.

Als nächstes werden wir uns in dieser Serie mit Skalierung und Rotation befassen, also bleiben Sie dran.

Weiter oben: Erstellen einer dynamischen Benutzeroberfläche für die HoloLens, Teil 10 (Skalieren von Objekten)

0 Shares