HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

0 Shares

In diesem Kapitel möchten wir einige echte Fortschritte in unserer dynamischen Benutzeroberfläche sehen. Zu diesem Zweck wird unser neu erstelltes Toolset aus dem vorherigen Kapitel dort angezeigt, wo wir suchen, wenn wir ein Objekt betrachten. Um dies zu erreichen, werden wir einen sehr nützlichen Teil der C # -Sprache verwenden: Delegierte und Veranstaltungen.

Bevor wir zum Kern der Lektion kommen, müssen wir zunächst eine Klasse für unsere erstellen TransformUITool. Dieser Code ist für die Position, Drehung und Skalierung des Objekts während seiner Arbeit verantwortlich. Es wird auch auf die Ereignisse reagieren, die wir später in diesem Kapitel einrichten werden.

Vorher: Erstellen einer dynamischen Benutzeroberfläche für die HoloLens, Teil 5 (Erstellen der UI-Elemente)

Schritt 1: Fügen Sie Tools eine neue Klasse hinzu

Mit dem TransformUITool Klicken Sie bei ausgewähltem Objekt auf die Schaltfläche “Komponente hinzufügen”. Art ActivateToolSet und klicken Sie auf “Neues Skript”. Klicken Sie anschließend auf die angezeigte Schaltfläche “Erstellen und Hinzufügen”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Im Moment machen wir nur die Ersteinrichtung für ActivateToolSet. Zuerst müssen wir unsere Variablen oder Felder und Eigenschaften deklarieren.

Wir brauchen einen öffentlichen Wagen, den wir nennen werden Skalierungsfaktor und, während wir die Standardeinstellung festlegen 0,4fNatürlich können wir im Editor nach Belieben zu allem wechseln, was wir wollen. Wir brauchen ein GameObject um einen Verweis auf unser Cursorobjekt zu erhalten, der als Anleitung für unser Toolset verwendet werden kann. bool isActive – Wir werden diesen Bool brauchen, um den aktuellen aktiven Status der Objekte in Zukunft zu verfolgen. Endlich haben wir eine Liste <> von SpriteRenderer, und wir werden diese im Editor selbst ausfüllen, also muss es öffentlich sein.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Das ist alles, was wir in dieser Klasse jetzt brauchen. Wir werden gleich auf diesen Code zurückkommen. Speichern Sie es und kehren Sie zum Unity-Editor zurück.

Sie sollten jetzt etwas haben, das ähnlich aussieht, oder zumindest beim Tippen 3 in das Größenfeld und tippen Sie auf die “Tab” -Taste.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Nehmen Sie jetzt die Kinder von TransformUITool – – Bewegen, skalieren und Drehen – und ziehen Sie jeden in einen offenen Steckplatz in der Zerreißen Abschnitt der ActivateToolSet Komponente.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Mit dem TransformUITool Wenn Sie noch ausgewählt sind, klicken Sie auf das Ebenen-Dropdown-Menü und wählen Sie “Raycast ignorieren”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Wenn das Feld mit der Frage nach untergeordneten Objekten angezeigt wird, klicken Sie auf “Ja, untergeordnete Objekte ändern”.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Schritt 2: Definieren Sie Delegierte und Ereignisse

Lassen Sie uns über das Wort Delegat nachdenken und wie es auf die reale Welt zutrifft. Nach einem Wahljahr erinnern wir uns wahrscheinlich alle noch daran, dieses Wort viel zu oft gehört zu haben. Ein Delegierter ist eine Person, die entsandt wird, um andere zu vertreten. Eine Person, die anstelle einer anderen Person handelt.

In C # ist ein Delegat ein Referenztyp, aber anstatt auf etwas wie a zu verweisen GameObject oder Rendererkönnen Sie auf eine Methode verweisen. Es handelt sich also eher um einen Verweis auf eine Aktion als um eine strikte Referenzierung von Daten. Dies ist in Bezug auf die ursprüngliche Definition sinnvoll.

Hier ist die Syntax für einen Delegaten:

delegate returntype delegateName (Parameter);

Und hier ist die, die wir in Kürze in unserem NRSRManager verwenden werden:

öffentlicher Delegat void OnObjectFocused ();

Sie können nach dem Wort bemerken delegierensieht es aus wie eine Standardmethode. Bei Bedarf können Sie sogar einen Rückgabewert und Parameter übergeben. Dies ist unsere Delegiertenvorlage. Jede Methode, die wir diesem Delegaten zuordnen möchten, muss genau dieselbe Signatur haben.

Die Veranstaltungen gehen Hand in Hand mit den Delegierten. Ein Ereignis ist eine Nachricht einer Aktion. Während es eine Reaktion auf einen auftretenden Zustand ist, kann es auch ein Auslöser sein, wie sie im Allgemeinen verwendet werden. Die Syntax für ein Ereignis sieht folgendermaßen aus:

event delegateName eventHandlerResponse;

Eine andere Syntaxmethode, wie unsere in Kürze erscheinen wird, sieht folgendermaßen aus:

public static OnObjectFocused ObjectFocused;

Was Delegierte und Ereignisse so leistungsfähig macht, ist die Fähigkeit, Code zu entkoppeln. Wenn sich ein Objekt um ein Ereignis kümmert, kann es dieses Ereignis abonnieren. Sobald es ein Abonnement für dieses Ereignis hat, wartet es einfach darauf, dass dieses Ereignis eintritt, und antwortet dann.

Zu diesem Zeitpunkt kann sich der ursprüngliche Code ändern, ohne das Abonnement zu beeinträchtigen. Dadurch wird der Code robuster und es ist weniger wahrscheinlich, dass er so einfach auf die Zeit fällt. Dies kann einen Programmierstil ermöglichen, der als Black-Box-Programmierung bezeichnet wird.

Was ist Black Box-Programmierung?

Die Hauptidee hinter Black Box ist, dass wir eine Box eingeben und als Antwort ausgeben. Was zwischen diesen beiden Punkten passiert, sind unnötige Kleinigkeiten. Als langjähriger Live-Toningenieur und Musiker spricht mich das an, denn so ist die Technologie, die diesen Raum umgibt, so gestaltet. Heutzutage leitet ein Gitarrist seinen Sound durch eine Sammlung verschiedener Effektboxen mit jeweils einer Sammlung von Reglern, Schiebereglern und Schaltern, um den gewünschten Ton zu erreichen.

Obwohl dieser Ansatz definitiv einige fragwürdige und möglicherweise langfristige Nachteile hat, ist dies eine großartige Möglichkeit, ein Programm als Gesamtsystem zu betrachten. Die meisten Musiker, die sich wirklich für den Sound interessieren, den sie produzieren, wissen zunächst nicht, was die Black Boxes tun, aber sie lernen, um ihren Sound zu maximieren und möglicherweise ihre eigenen Versionen dieser Black Boxes zu erstellen.

Delegierte & Veranstaltungen in Aktion

Jetzt müssen wir unsere aktualisieren NRSRManager um unserer neuen Wahl in Ansätzen Rechnung zu tragen.
Fügen Sie die vier unten abgebildeten Zeilen zu den Variablendeklarationen von hinzu NRSRManager.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Hier können Sie sehen, dass wir a deklarieren GameObject, gefolgt von einem Delegierten namens OnObjectFocused (). Dann haben wir zwei statische Ereignisse, genannt ObjectFocused und ObjectUnFocused. Sie sollten beachten, dass beide auf den Delegaten verweisen OnObjectFocused (). Mit dem statischen Schlüsselwort wird alles, worauf wir verweisen, von allen Instanzen gemeinsam genutzt.

Während wir schon eine haben FixedUpdate () Funktion von vor ein paar Kapiteln, jetzt brauchen wir eine Aktualisieren() auch. Während FixedUpdate () läuft als feste Framerate, Aktualisieren() Läuft jeden Frame.

Fügen Sie den folgenden Code hinzu Aktualisieren().

Wir überprüfen es die GameObject FocusedObject ist Null. Schon seit NRSRManager ist die Quelle des Delegierten und der Veranstaltung. Wenn wir die Veranstaltung anrufen, müssen wir sicherstellen, dass jemand unsere Veranstaltung abonniert hat. Also prüfen wir, ob es null ist. Wenn es so ist, kehren wir zurück; Andernfalls starten Sie das Ereignis, damit die Abonnenten es wissen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Jetzt haben wir unseren Delegierten und unsere Veranstaltungen in unserem Manager eingerichtet. Wir müssen einige Klassen einrichten, um die Ereignisse anzuhören oder zu abonnieren.

Schritt 3: Werkzeugsatz aktivieren

Hier in unserem ActivateToolSet Klasse, mach weiter und tippe das ab Start() und Aktualisieren() Methoden.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

In unserer OnEnable Ereignis müssen wir die Ereignisse abonnieren, die für uns wichtig sind. Dazu rufen wir das Ereignis auf und fügen ihm mit dem eine eigene Methode hinzu + = Symbole.

Was dies bedeutet ist, dass wenn die ObjectFocused Ereignis passiert, ActivateThis wird auch laufen. Wann ObjectUnfocused läuft, so wird Deaktivieren Sie dies.

Aufgrund von Speicherverwaltungsproblemen, um Speicherlecks und dergleichen zu vermeiden, melden wir uns auch von den Ereignissen ab, wenn die Klasse deaktiviert ist. Ähnlich wie beim Abonnieren erfordert das Abbestellen die Verwendung von – = Symbolkombination.

Geben Sie den Rest der Klasse ein. Sie werden sehen wie ActivateThis ist eine Schleife, die alle aktiviert SpriteRenders in unserer Liste <> und Deaktivieren Sie dies macht das Gegenteil. Wie sehr symmetrisch von mir.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Schritt 4: Fügen Sie FadeObjectNotActive hinzu

Jetzt, FadeObjectNotActive ist eine weitere Klasse, die wir abonnieren werden ObjectFocused und ObjectUnfocused. Wir werden den Fading-Code noch nicht implementieren, da dies eine weitere Lektion ist. Dies ist jedoch ein weiteres wichtiges Element von Delegierten und Veranstaltungen. Die Möglichkeit für mehrere Objekte, dasselbe Ereignis zu abonnieren, bietet viel Flexibilität beim Design.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Wie Sie derzeit sehen können, bewirkt dies nur eine debug.log-Nachricht, um uns mitzuteilen, dass sie funktioniert.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Nun das FadeObjectNotActive existiert wir müssen das ändern FixedUpdate () im NRSRManager um es zu den Objekten hinzuzufügen, die wir brauchen.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Und schließlich müssen wir zwei Zeilen zu unserer hinzufügen BoundingBox Klasse. Im OnFocusEnter () und OnFocusExit (). Diese erzählen die NRSRManager Welche Objekte sind das aktuell ausgewählte Objekt? Und löscht diese Informationen, wenn der Blick weggezogen wird.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)
HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Wenn Sie jetzt kompilieren und ausführen, werden Sie feststellen, dass auf den Objekten, die wir jetzt betrachten, unsere Werkzeuge angezeigt werden. Und wenn wir wegschauen, verschwinden sie.

HoloLens Dev 101: Erstellen einer dynamischen Benutzeroberfläche, Teil 6 (Delegierte und Ereignisse)

Letztendlich verwenden wir auf diese Weise Delegierte und Veranstaltungen für unser Projekt.

Wenn der Benutzer auf ein Objekt fokussiert, BoundingBox erzählt NRSRManager welches Objekt ist das FocusedObject. NRSRManager, jetzt wo es ist FocusedObject ist nicht mehr null, prüft die ObjectFocused Ereignis und wenn es nicht null ist, wird es ausgeführt. ObjectFocused Das Ereignis wird ausgelöst und zwei Dinge passieren. Einer, ActivateToolSet löst seine gespeicherte Methode aus ActivateThis (), durchläuft die Renderer und aktiviert sie, damit wir unser Toolset sehen können. Zwei gleichzeitig, FadeObjectNotActive feuert ab FadeObject () Methode. Derzeit überprüft diese Methode, ob das Objekt nicht NRSRTools ist, und wenn dies nicht der Fall ist, wird a veröffentlicht Austestungsprotokoll().

Die Sache ist, dass wir so viele Methoden haben könnten, um dieses Ereignis auszulösen, was dieses System zu einem sehr leistungsfähigen macht.

Und wie immer für diejenigen, die nicht alles abtippen wollen:

Head-Locking in der gemischten Realität ist ein Nein-Nein. Und bevor wir die Werkzeuge wirklich nutzen können, um ihre Arbeit zu erledigen, müssen wir das anpassen. In der nächsten Lektion werden wir es schaffen, damit die Werkzeuge etwas hinter unserem Blick zurückbleiben.

Next Up: Erstellen einer dynamischen Benutzeroberfläche für die HoloLens, Teil 7 (Entsperren der Menübewegung)

0 Shares