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

0 Shares

Ein falsch skaliertes Objekt in Ihrer HoloLens-App kann Ihr Projekt verändern oder zerstören. Daher ist es wichtig, die Skalierung in Unity zu verringern, z. B. mit einheitlichen und uneinheitlichen Faktoren zu arbeiten, bevor Sie mit anderen Aspekten Ihrer App fortfahren.

Diese HoloLens Dev 101-Serie wurde entwickelt, um Ihnen nicht nur das Mixed Reality Toolkit und sein Eingabemodul sowie viele andere Elemente der HoloLens- und Unity-Entwicklung näher zu bringen, sondern auch um die Ideen herauszufordern, die wir automatisch erwarten wenn es um Benutzeroberflächen geht. Auf den Schultern von Riesen zu stehen ist relativ einfach im Vergleich dazu, allein zu stehen und das Vorherige zu überdenken.

Während die Verwendung von Unity den Prozess definitiv vereinfacht, ist die Erstellung eines Systems, das Objekte im realen Raum bewegt, skaliert und dreht, immer noch ein ziemliches Unterfangen. In der vorherigen Lektion haben wir es endlich geschafft, unsere Objekte zu bewegen. So massiv die vorherige Lektion auch gewesen sein mag, wir werden sie direkt verwenden, um das zu erstellen, was wir für diese Lektion benötigen. Trotzdem mag diese Lektion im Vergleich etwas dünn erscheinen, aber ich werde ein paar Codierungsprinzipien hinzufügen, um die Dinge frisch zu halten.

Vorher: Erstellen einer dynamischen Benutzeroberfläche für die HoloLens, Teil 9 (Verschieben unserer Objekte)

Skalieren in Einheit

Einfach ausgedrückt bezieht sich die Skalierung auf die Größe eines Objekts. In Unity wird das Skalieren oder Ändern der Größe eines Objekts über die Transformationskomponente behandelt, ähnlich wie das Ändern der Position und Drehung eines Objekts. Jede dieser Eigenschaften enthält drei Elemente: X, Y und Z. Für die Position werden die Elemente in Auf / Ab, Links / Rechts und In / Out übersetzt. X, Y und Z bei der Skalierung haben einen ähnlichen Effekt, entsprechen jedoch der Größe eines Objekts.

Wenn Sie die Skalierung eines Objekts mit demselben Faktor auf der X-, Y- und Z-Achse bearbeiten, ist der Effekt eine gleichmäßige Skalierung. Wenn Sie jedoch mit einem ungleichmäßigen Faktor (z. B. X = 1, Y = 2, Z = 0,5) über die verschiedenen Achsen der Skalierungseigenschaft skalieren, erhalten Sie eine ungleichmäßige Skalierung. In dieser Lektion machen wir beides und haben die Möglichkeit zu wechseln.

Das Prinzip der Einzelverantwortung

Wenn Sie erfahren möchten, warum wir separate Klassen für unsere Skalierungsfunktionen erstellen, anstatt eine große Klasse zu erstellen, die Bewegung, Skalierung und Rotation enthält, sollten Sie sich mit den sogenannten SOLID-Prinzipien befassen. Diese Sammlung von fünf objektorientierten Programmiermethoden wurde entwickelt, um Code zeitfest, skalierbar und einfach zu erweitern.

Es gibt eine Reihe von Prinzipien, die ich noch am besten umsetze (viele davon sind sehr kontextbezogen), aber das Prinzip, das wir derzeit hier verwenden, das Single Responsibility Principle (SRP), ist ein guter Weg, dies zu tun helfen Ihnen dabei, eine Anwendung in verständliche Teile zu zerlegen (und sie bietet ein gutes Stück mehr).

Das Prinzip besagt, dass “jedes Modul oder jede Klasse die Verantwortung für einen einzelnen Teil der von der Software bereitgestellten Funktionalität haben sollte und dass die Verantwortung vollständig von der Klasse gekapselt werden sollte.”

Für uns bedeutet dies also, dass wir, wenn wir dieses System irgendwann in etwas Wesentlicheres eingebaut haben, und aus irgendeinem Grund die Funktionsweise der Skalierung im System ändern müssen, wenn wir diese Änderungen vornehmen, die Chancen von Das Brechen des restlichen Codes im Projekt wird auf nahezu Null gesenkt.

Obwohl es weit über den Rahmen dieser Reihe hinausgeht, sich eingehend mit dem Thema SOLID zu befassen, empfehle ich dringend, sich Zeit zu nehmen, um diese Prinzipien zu betrachten. Wenn Sie bereit sind, stellen Sie sicher, dass sowohl Unity als auch Visual Studio ausgeführt werden. Laden Sie das Projekt aus der vorherigen Lektion und legen Sie los.

Schritt 1: Erstellen Sie die Skalierungsklasse

Ähnlich wie die Klasse, die wir zuvor erstellt haben, um unsere Bewegung zu handhaben, werden wir eine ähnliche Klasse zum Skalieren unseres Objekts erstellen.

Schauen Sie in Unity in das Hierarchiefenster. Suchen Sie und klicken Sie, um das Unterobjekt “Skalieren” von “TransformUITool” auszuwählen. Wenn diese Option ausgewählt ist, klicken Sie im Inspektorfenster auf die Schaltfläche “Komponente hinzufügen”, scrollen Sie nach unten und wählen Sie die Option “Neues Skript”.

Wir sollten unsere Klassen immer benennen, um ihren Zweck leicht verständlich zu halten. Dies ist eine hervorragende Möglichkeit, Ihnen als Systemdesigner dabei zu helfen, Ihr Projekt zu pflegen, wenn es größer wird, indem Sie ein Projekt in leicht verwaltbare Teile aufteilen. Es hilft Ihnen jedoch auch dabei, sich auf SRP einzulassen und sich darauf zu konzentrieren (siehe oben).

In diesem Sinne möchten wir unserer neuen Klasse einen genauen Namen geben. “ScaleToolInteraction” scheint eine feste Wahl zu sein (Wortspiel beabsichtigt). Geben Sie das in das neue Skript ein Name Klicken Sie dann auf die Schaltfläche “Erstellen und Hinzufügen”.

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

Es ist Zeit, Code zu schreiben. Wenn Sie Visual Studio nach Abschluss der letzten Lektion noch nicht geöffnet haben, können Sie dies jetzt tun, indem Sie im Unity Project-Fenster auf die neu erstellte Klassendatei “ScaleToolInteraction” doppelklicken.

Suchen Sie nach dem Öffnen von Visual Studio nach der Registerkarte “MoveTool.cs” und klicken Sie darauf, um sie anzuzeigen. Wählen Sie nun den gesamten Code über die Tastenkombination aus Strg + A., dann schlagen Strg + C. um die gesamte Klasse zu kopieren. (Sie können es auch einfach von unserem Pastebin-Link kopieren.)

Hinweis: Da wir im Begriff sind, eine Klasse buchstäblich zu kopieren und in eine neue Klasse einzufügen, ist das Prinzip “Nicht wiederholen” (oder “TROCKEN”) erwähnenswert. Darin heißt es: “Jedes Wissen muss eine einzige, eindeutige und maßgebliche Darstellung innerhalb eines Systems haben.” Einfach ausgedrückt, verwenden Sie nicht denselben Code an mehreren Stellen in einem Projekt. Das Ergebnis ist, dass es viel schwieriger wird, das Problem zu finden und zu beheben, wenn etwas kaputt geht. In diesem Sinne verwenden wir die MoveTool-Klasse als Vorlage für die ScaleToolInteraction-Klasse. Die Kernlogik wird ersetzt.

Wählen Sie nun in Visual Studio die Registerkarte “ScaleToolInteraction.cs”, um sie zur aktiven Klasse zu machen. Verwenden Sie erneut den Tastaturbefehl Strg + A. Um alles in der Klasse auszuwählen, verwenden Sie Strg + V. um den Inhalt, den wir in der Zwischenablage haben, in die neue Klasse einzufügen.

Da wir gerade eine Klasse in eine andere kopiert haben, hat die Klassendeklaration jetzt natürlich den falschen Namen. Ändern Sie in Zeile 6 “MoveTool” in “ScaleToolInteraction”.

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

Schritt 2: Erstellen Sie einen auswählbaren Modus mithilfe einer Aufzählung

Jetzt werden wir einen umschaltbaren Modus für die Skalierung erstellen, der auf den oben erwähnten einheitlichen und ungleichmäßigen Typen basiert. Wir werden auch zwei Arten von einheitlichen Maßstäben herstellen. Die erste dient zum horizontalen Bewegen Ihrer Hand (UniformXScale) und die andere zur vertikalen Option (UniformYScale).

Fügen Sie im Eigenschaftenbereich unserer neuen Klasse direkt unter unserem zuvor deklarierten Kameraobjekt und dem IInputSource-Objekt (Zeile 31, wenn Sie über den Pastebin-Link kopiert und eingefügt haben) die beiden folgenden Codezeilen hinzu.

öffentliche Aufzählung TransformMode {UniformXScale, UniformYScale, NonUniformScale}
public TransformMode transformMode = TransformMode.UniformXScale;

In der ersten Zeile deklarieren wir eine Aufzählung namens TransformMode mit den drei Auswahlmöglichkeiten, die wir haben möchten. UniformXScale, UniformYScale und NonUniformScale. Für diejenigen, die mit C # und Unity nicht vertraut sind, wird neben den typischen Verwendungszwecken, die eine “Aufzählung” für die C # -Programmierung bietet, wie z. B. leicht umschaltbare Codepfade, im Unity-Editor angezeigt, wenn wir eine öffentliche Aufzählung verwenden, die Aufzählung im Inspektor angezeigt als Dropdown-Menü.

In der zweiten Zeile erstellen wir unser TransformMode-Objekt basierend auf der Aufzählung aus der vorherigen Zeile und verwenden das Kamelgehäuse, um das Objekt “transformMode” zu benennen. Wir setzen dann die Standardoption auf UniformXScale, meine persönliche Präferenz. Was auch immer wir als Standard im Code festlegen, wird als Standard-Dropdown-Option für unsere Klasse im Inspektorfenster festgelegt.

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

Jetzt ist es Zeit für die Kernlogik der Klasse. Löschen Sie genau wie in der vorherigen Lektion im Block “if (IsDraggingEnabled && isDragging)” der Update () -Methode die aktuell vorhandene Codezeile und ersetzen Sie sie durch den folgenden Codeblock.

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

Sie können den Code aus dem folgenden Blockabschnitt kopieren und einfügen, aber ich habe das obige Bild eingefügt, da unser System den C # -Code derzeit nicht korrekt formatiert. Sie können es auch aus Pastebin kopieren und einfügen.

if (transformMode == TransformMode.NonUniformScale)
{
HostTransform.localScale = Vector3.Lerp (HostTransform.localScale,
HostTransform.localScale + manipulationDelta * DistanceScale,
PositionLerpSpeed);
}}
if (transformMode == TransformMode.UniformXScale)
{
HostTransform.localScale = Vector3.Lerp (HostTransform.localScale, HostTransform.localScale +
neuer Vector3 (manipulationDelta.x,
manipulationDelta.x,
manipulationDelta.x) * DistanceScale,
PositionLerpSpeed);
}}
if (transformMode == TransformMode.UniformYScale)
{
HostTransform.localScale = Vector3.Lerp (HostTransform.localScale, HostTransform.localScale +
neuer Vector3 (manipulationDelta.y,
manipulationDelta.y,
manipulationDelta.y) * DistanceScale,
PositionLerpSpeed);
}}

Um der von uns erstellten enum-Eigenschaft Leben einzuhauchen und eine auswählbare Auswahl für einen Designer in Unity zu treffen, haben wir hier drei if-Anweisungen, die nach der aktuellen transformMode-Auswahl suchen, die im Inspector ausgewählt wurde.

Wenn Sie sich den obigen Code ansehen und sich über die Variable “manipulationDelta” nicht sicher sind, handelt es sich bei manipulationDelta um eine Vector3-Struktur, die vom Eingabemodul des MRTK erstellt wurde und wie alle der vielen Vector3s, die wir in diesem Projekt verwendet haben, X enthält. Y- und Z-Elemente. Dieser spezielle Vektor3 ist das Ergebnis der Interaktion des Benutzers mit der HoloLens.

Um seine Funktion aufzuschlüsseln, ist ein Delta in der Mathematik einfach ein Unterschied. In unserem Fall ist das Manipulationsdelta der Unterschied in der Bewegung der Hand des Benutzers von einem Bild zum nächsten. Glücklicherweise wird die schwierige Mathematik von MRTK und Unity für uns erledigt, und wir erhalten die Ergebnisse nach Belieben.

In der Option NonUniformScale verwenden wir Code, der dem im vorherigen Kapitel zum Verschieben des Objekts verwendeten sehr ähnlich ist, aber die Ergebnisse auf die localScale des Objekts anstatt auf die Position des Objekts anwenden. Einfach genug. Wenn der Benutzer seine Hand horizontal bewegt, wird sie entlang der X-Achse skaliert. Die vertikale Bewegung der Hand verändert die Skala auf der Y-Achse.

In UniformXScale und UniformYScale nehmen wir das manipulationDelta und erstellen einen neuen Vector3 aus seinen X- bzw. Y-Elementen. In der X-Skala-Version wird jede vertikale Bewegung der Hand des Benutzers ignoriert, und die Y-Skala-Version macht dasselbe für die horizontale Bewegung.

Mit der DistanceScale-Variablen können wir die Empfindlichkeit der Funktionsweise unserer Waage gegenüber der Handbewegung des Benutzers anpassen. Unsere aktuelle Standardeinstellung funktioniert gut für die einheitlichen Skalierungsoptionen, ist jedoch etwas verrückt nach der ungleichmäßigen Option.

Schritt 3: Überprüfen Sie die neue Klasse in Unity

Wenn Sie jetzt den Inspektor in Unity aufrufen und sich das Objekt “Skalieren” ansehen, sollten Sie nach einigen Sekunden des Kompilierens von Unity-Code hinter den Kulissen sehen, dass unsere neue Komponente mit allen neuen Optionen auf dem Objekt angezeigt wird gegeben.

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

Beachten Sie die Transformationsmodus Dropdown-Liste, die als Ergebnis unserer Aufzählung erstellt wurde. Wenn Sie auf die Liste klicken, wird die vollständige Liste der Aufzählungsoptionen angezeigt: UniformXScale, UniformYScale und NonUniformScale. Eine großartige Funktion, die Unity bietet, ist das Hinzufügen von Leerzeichen in unseren Variablen, was wirklich eine nette Funktion ist. So wird “NonUniformScale” im Code im Unity-Editor zu “Non Uniform Scale”.

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

Jetzt können Sie auswählen, welchen Transformationsmodus Sie im Editor verwenden möchten, den Kompilierungs- und Erstellungsprozess durchlaufen und ihn dann ausprobieren. Ich würde empfehlen, alle Optionen auszuprobieren und zu sehen, welche für Sie am natürlichsten ist. Wenn Sie sich für die Option “Nicht einheitliche Skalierung” entscheiden, müssen Sie die Variable “Entfernungsskala” verringern, bis Sie eine Einstellung finden, die Ihnen gefällt. Bei der Standardeinstellung wird es ein bisschen verrückt sein.

Mit dem Schnittstellen- / Code-Design von Unity vereinfacht das Offenlegen dieser öffentlichen Variablen für den Unity-Editor den Test- und Iterationsprozess. Es ist wirklich ein schickes Design.

Unabhängig von Ihrer Wahl würde ich am Ende gerne hören, welche Optionen Sie bevorzugen. Bis zum nächsten viel Spaß beim Hacken.

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

0 Shares