HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

0 Shares

Im vorherigen Abschnitt dieser Reihe über dynamische Benutzeroberflächen für HoloLens haben wir Informationen zu Delegierten und Ereignissen erhalten. Gleichzeitig haben wir diese Delegaten und Ereignisse verwendet, um nicht nur unser Menüsystem an den Blick des Benutzers anzuhängen, sondern auch um das Menü unter bestimmten Bedingungen zu aktivieren und zu deaktivieren. Nehmen wir nun dieses Wissen und bauen darauf auf, um unser Menüsystem ein bisschen komfortabler zu gestalten.

Eine der Best Practices für die Entwicklung von HoloLens besteht darin, zu vermeiden, dass Benutzeroberflächenelemente für den Blick des Benutzers gesperrt werden. Während Heads-up-Displays in Ego-Spielen üblich sind, scheinen sie sich nicht sehr bequem in die reale Welt zu übertragen. Aufgrund einer Abkürzung, die im Voraus in der Serie geplant war, begehen wir genau diese Sünde und werden dies hier beheben.

Bevor wir fortfahren, werde ich auf der Grundlage des Feedbacks unserer Leser von nun an die Version der von mir verwendeten Softwaretools hinzufügen, damit Sie mit jedem der Tutorials synchronisieren können.

Versionsinformation:

Visual Studio 2017 15.3.5 Unity Version 2017.1.1.p1 eine Version von HoloToolkit vom 5.29.2017

Vorher: Erstellen einer dynamischen Benutzeroberfläche für die HoloLens, Teil 6 (Delegat und Ereignisse)

Schritt 1: Komfortparameter verstehen

Komfort ist ein wichtiger Faktor in der gemischten Realität und ein wichtiger Entscheidungspunkt bei der Gestaltung des holographischen Raums. Es ist weniger wahrscheinlich, dass Benutzer Anwendungen verwenden, die sich nicht wohl fühlen. Hier einige Richtlinien:

Halten Sie den richtigen Abstand der 3D-Objekte und UI-Elemente zum Benutzer ein. 1,2 bis 5 Meter gelten als idealer Entfernungsbereich. Mit einer Vorliebe für die 2-Meter-Marke aufgrund der Gestaltung der Optik der HoloLens. Vermeiden Sie es, das gesamte Display zu füllen. Abgesehen davon, dass ein Benutzer nicht verstehen kann, was gerade passiert, und seinen Kopf bewegen muss, um den Kontext zu finden, kann dies auch zu Problemen mit der Füllrate der HoloLens-Anzeige führen. Keine Benutzersperre. Wie oben erwähnt, wird eine Kopfverriegelung nicht empfohlen. Ich kann das nicht genug betonen. Wenn Sie ein Objekt für den Benutzer sperren müssen, verwenden Sie stattdessen die Körpersperre.

Der Ansatz, den wir verfolgen werden, um unser Menü davon abzuhalten, an die Benutzer gebunden zu sein, besteht darin, die Bewegung zum Cursor zu lockern. Ähnlich wie Mitmachen Klasse im Mixed Reality Toolkit: Wenn sich der Blick des Benutzers außerhalb eines bestimmten Bereichs des Werkzeugobjekts bewegt, bewegt sich das Objekt in Richtung des Blicks des Benutzers.

Hier ist, wie wir es machen werden.

Derzeit besteht unser Transformationswerkzeugobjekt aus drei separaten Objekten mit drei separaten Collidern. Sie sind alle an einen einzigen Elternteil gebunden.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Verwenden Sie eine ähnliche Funktion wie beim Erstellen der BoundingBoxWir werden die Grenzen aller Kollider der Kinder von unserem übergeordneten Objekt erhalten. Dann werden wir sie kombinieren, um etwas zu erhalten, das sich mehr wie das verhält, was wir in diesem Bild sehen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

An diesem Punkt können wir den Abstand zwischen unserem Cursorobjekt und dem Transformationswerkzeugobjekt testen und feststellen, ob wir das Werkzeug bewegen müssen oder nicht.

Schritt 2: Passen Sie frühere Arbeiten an

Öffne die ActivateToolSet Klasse und löschen Sie die Aktualisieren() Funktion, die wir in der vorherigen Lektion erstellt haben, da es eine vorübergehende Maßnahme war, uns bis zu dieser Lektion zu binden.

Klicken Sie in Ihrer Projektansicht im Skriptordner mit der rechten Maustaste auf “ActivateToolset.cs” und klicken Sie dann auf “Öffnen”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Scrollen Sie beim Öffnen von Visual Studio nach unten zu Aktualisieren() Funktion. Wählen Sie alle Zeilen aus – 21–26, wenn Sie im vorherigen Kapitel aus Pastebin kopieren und einfügen – und drücken Sie die Taste “Löschen”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Schritt 3: Erstellen Sie die Bewegungsklasse des Transformationsmenüs

Klicken Sie bei ausgewähltem “TransformUITool” auf die Schaltfläche “Komponente hinzufügen”. Klicken Sie auf die Option “Neues Skript”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Geben Sie im Fenster “Neues Skript” “TransformMenuMovement” in das Feld ein Name Feld und klicken Sie dann auf “Erstellen und Hinzufügen”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Schritt 4: Erstellen Sie die Felder

Wie oben erwähnt, verwendet diese Klasse die Grenzen der übergeordneten und untergeordneten Objekte, um zu bestimmen, wann und wie sich das Menü bewegt. Das wird also unser erstes Feld sein, das wir beschriften werden toolBounds.

Wir werden als nächstes einen Verweis auf unsere benötigen Mauszeigerals Katalysator für unsere Bewegung. Grundsätzlich haben wir es gerade von einer Klasse in eine andere verschoben.

Und schließlich brauchen wir eine Bool damit wir Prozesse nicht unnötig wiederholen. Seit unserem Ausgangszustand für das, was wir verwenden werden Bool denn sollte ja sein, setzen wir es auf wahr.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Schritt 5: Binden Sie die Delegierten ein

Anstelle der ständigen Aktualisierung unserer Position und Rotation wie in der vorherigen Lektion – der eigentliche Grund für die Headlock-Benutzeroberfläche – müssen wir die Art und Weise ändern, wie wir damit umgehen. Wir müssen Bedingungen schaffen, unter denen sich das Menü bewegt und nicht bewegt.

Wir müssen auch die anfängliche Positionierung und Drehung einstellen und zurücksetzen, wenn der Blick des Benutzers mit einem Objekt verbunden ist. Glücklicherweise haben wir bereits den perfekten Auslöser für dieses Setup und Reset – unsere Delegierten.

Geben Sie die folgende Funktion ein.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Wenn der Benutzer den OnFocus-Delegaten auslöst, wird dies ausgelöst. Seit unserem Bool initialSetupComplete Wenn dies zutrifft, wird dieser Code einmal ausgeführt, wodurch die Position und Drehung des Cursors ermittelt und das Transformationsmenü an dieselbe Stelle verschoben wird.

Ich stieß auf ein Problem, bei dem das Menü rückwärts kam. Deshalb haben wir die (Sternchen) Quaternion.Euler (0,0,180); Ergänzung zu unserer Rotation; Es ist ein 180-Grad-Flip auf der Z-Achse.

Ich bin auch auf ein Problem gestoßen, bei dem die Im Fokus feuerte ständig, wenn ein Gegenstand angeschaut wurde, was der Grund für die ist initialSetupComplete Falle. Damit es funktioniert, müssen wir es jedoch zurücksetzen, wenn OnFocusExit passiert, was der Zweck der nächsten Funktion ist.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Jetzt können wir unsere OnEnable- und OnDisable-Funktionen erstellen und sie an die entsprechenden Delegaten binden. Verwenden Sie außerdem in der OnEnable-Funktion die Funktion GetBoundsForAllChildren (gameObject) um unsere Grenzen zu schaffen und dann verwenden wir GameObject.Find (“Cursor”); um einen Verweis auf unser Cursorobjekt zu erhalten.

Wie vorab erwähnt, Finden ist in vielen Situationen der langsamste Weg, ein verfügbares Objekt zu finden, aber auch der einfachste. Und obwohl Sie oft so effizient wie möglich sein möchten, wäre dies nicht möglich, wenn bestimmte Qualitätskriterien nicht erfüllt würden. Also, während Sie es auf jeden Fall sparsam verwenden möchten, haben Sie keine Angst, es zu verwenden.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Wie bei Delegierten und Veranstaltungen üblich, in unserem OnDisable () Funktion, die wir einfach abbestellen ObjectFocused und ObjectUnFocused Ereignisse, um keine potenziellen Speicherlecks zu erzeugen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Schritt 6: Holen Sie sich die Grenzen

Jetzt müssen wir den Umriss festlegen, den unser Cursor bewegen kann, bevor wir eine Bewegung über das Menüsystem einleiten. Dazu verwenden wir die Grenzen des Menüs, zu dem auch seine Kinder gehören, das Fleisch des Menüs.

Diese Funktion nimmt a auf GameObject als Parameter und gibt seine zurück Grenzen. Dies ist eine Dienstprogrammfunktion, die ich für viele Projekte, an denen ich arbeite, behalte, und ich halte sie oft statisch, obwohl sie in diesem Fall perfekt als privat funktionieren würde. Dies ist fast genau der gleiche Prozess, den wir in unserem verwendet haben BoundingBox Klasse, um die zu bekommen MeshFilters Von den untergeordneten Objekten verwenden wir diesmal nur Collider und es befindet sich in einer Funktion.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Schritt 7: Damit die Menübewegung funktioniert

Hier ist der Hauptschwerpunkt dieser Lektion, unsere Update-Funktion. Hier legen wir die Bedingungen für die Bewegung fest, über die ich zuvor gesprochen habe.

Das Wenn Aussage sieht aus wie ein langer und beängstigender Ausdruck, aber es ist wirklich nicht so schlimm, wenn Sie einmal darin bohren. Hier ist die Aufschlüsselung:

Die vier separaten Ausdrücke für die Richtung (links, rechts, oben und unten) überprüfen den Abstand zwischen dem GameObject transformieren und die Transformation des Cursors. Wenn die Entfernung oder Deltas weiter entfernt sind als das angemessene Ausmaß der durch geteilten Grenzen 3. Mit dem Operator /. Zwischen jedem dieser Ausdrücke teilen wir dem System mit: “Wenn eine dieser Bedingungen erfüllt ist, führen Sie den Code in Klammern aus.”

Hinweis: Oft im Umgang mit Grenzen Sie arbeiten mit dem Center, Ausmaße, und Größe. Halfs und Ganzes, was im Allgemeinen dazu führt, dass gerade Variablen verwendet werden. Als ich diesen Teil zum Laufen brachte 2 fühlte sich einfach nicht richtig an, daher die 3. Sie können es gerne selbst versuchen.

Der Code in der Klammer verwendet eine lineare Interpolation oder Lerp, um das Menü mit einer Geschwindigkeit von von seiner aktuellen Position an die Position des Cursors zu verschieben 0,02f. Die Bewegungsrate sollte wahrscheinlich ein öffentlicher Float sein, damit sie im Editor geändert werden kann. Sie können es natürlich gerne ändern. Ich würde gerne einige der anderen Lösungen sehen, die sich die Leute einfallen lassen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Nach unserer if-Anweisung wird die Rotation mit gesetzt Quaternion.Lerp auf die gleiche Weise wie die Position, aber mit einer viel schnelleren Geschwindigkeit.

Und schließlich, weil wir möchten, dass das z unseres Menüs immer vorne ist, aktualisieren wir die Menüs Z in jedem Frame anstatt nur, wenn die Bedingungen erfüllt sind. Und weil es einige Situationen gab, in denen ich sah, dass das Menü in das Objekt einsank, habe ich es gezogen 0.1f weiter vom Objekt entfernt.

Wenn Sie nun die App ausführen, sollten Sie etwas Ähnliches sehen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 7 (Entsperren der Menübewegung)

Bild von Jason Odom / Nächste Realität

Hier ist der Pastebin-Link für alle, die Ihr Ergebnis kopieren und einfügen oder einfach nur mit dem vergleichen möchten, was ich habe.

Jetzt werden wir am Raycasting und am Blickmanager arbeiten.

Next Up: Erstellen einer dynamischen Benutzeroberfläche für die HoloLens, Teil 8 (Raycasting & Gaze Manager)

0 Shares