Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Children Display

Parent = Elternelement

Child = Kindelement

Aspect Ratio = Seitenverhältnis

Performance Tipps

...

Device Simulator

[Beispiel - wie schaltet man ihn an?]

Mit dem Device Simulator kann man sehen, wie sich unter anderem die UI auf verschiedenen Geräten verhält. Es ist auch möglich das Gerät zu drehen und die Safe Zone anzeigen zu lassen.

[Beispiel]

Man sollte stets verschiedenste gängige Geräte testen - mindestens Android bzw. iOS jeweils als Phone und Tablet. Insbesondere bei der Safe Zone unterscheiden sich die Geräte sehr:

[Beispiel]

Apple macht die Safe Zone gerne symmetrisch und hat außerdem eine vertikale Safe Zone für den Home-Button.

[Beispiel]

Android ist hingegen oft asymmetrisch.

[Beispiel]

Tablets haben oft genug gar keine Safe Zone.

Um all diese Dinge sehen zu können und entsprechend mit Code oder Design zu reagieren, ist der Device Simulator unabdingbar.

UI Design Tools

Tools für UI- oder UX-Design, je nach dem wie genau man mit dem Namen ist, helfen massiv bei der Arbeit an UI. Von Wireframes bis hin zu Click-Prototypen kann man damit alles erstellen und das meistens sogar kollaborativ. Entwickler können später als Betrachter hinzugefügt werden, damit sie alle Layouts, Abstände und Größen genauestens ins Spiel bringen können.

Figma ist ein cloudbasiertes UI-Tool, was ich in den meisten meiner Projekte verwendet habe.

[Beispiele]

-zeigen: Basic layout in figma, inspector

Komponenten

Komponenten sind wiederverwendbare Elemente im eigenen Design. Sie können alles Mögliche sein, von einem simplen Button bis hin zu einer kompletten Navigationsleiste. Ein paar der geläufigsten Kandidaten für Komponenten sind:

  • UI Elemente (Button, Toggle, Slider etc,)
  • Icons
  • Firmenlogos oder andere Markenzeichen
  • Platform Komponenten (für Android, iOS)

[Beispiel]

Sobald man eine Komponente erstellt hat, kann man Kopien von dieser im Projekt verwenden. Die Kopien der sog. Master-Komponente sind mit ihr verbunden, das heißt wenn sich die Master-Komponente ändert, werden sich auch alle Kopien entsprechend verändern. Die Kopien selbst können aber immer noch lokal geändert werden - so kann ein und derselbe Button an verschiedenen Stellen in unterschiedlicher Farbe erscheinen, vielleicht auch nur um rumzuprobieren. Man kann dann später die lokalen Änderungen auf die Master-Komponente anwenden, wenn man sie für alle Kopien übernehmen will.

Ein weiterer Vorteil ist, dass man Komponenten auch schachteln kann.

[Beispiel]

Im Grunde genommen kann man sich so eine eigene Bibliothek an UI-Elementen aufbauen, die dann in vielen Designs verwendet werden.

Mit Komponenten kann man sich viel Arbeit sparen, indem man Designs und strukturieren wiederverwendbar macht, während Änderungen am gesamten Design mit wenig Aufwand möglich sind.

Styles

Styles sind ähnlich wie Komponenten, nur das mit ihnen das Aussehen bzw. Eigenschaften von Elementen festgelegt werden. Dazu gehören Dinge wie Farben, Textgröße, Schlagschatten oder gar Einstellungen von Layout-Grids.

[Beispiel]

Der Vorteil ist dann, dass man durch Änderungen am Style alle Elemente verändert, die diesen Style verwenden. So könnte man beispielsweise den im Projekt verwendeten Font für Seitentitel austauschen.

[Beispiel]

Neben der erhöhten Iterationsgeschwindigkeit kann man so auch bestimmte Teile des eigenen Designs benennen, um z.B. die Verwendung einer Farbe deutlich zu machen, kann man einen Style mit dem Namen "Highlight Color" erstellen. Jedes neue Teammitglied, dass am UI-Design arbeitet kann dann über die Bibliothek auf diesen Style zugreifen und seine Verwendung verstehen.

Flexibles Spacing

Ich verwende drei verschiedene Wege um in meinen Layouts Abstände einzubauen:

  • Spacing Option der Layoutgruppe
  • Force Expand Option der Layoutgruppe
  • Spacer Objekte mit Layout Element

Auf die Anwedungsgebiete, sowie Vor- und Nachteile möchte ich im Folgenden eingehen.

Spacing über die Gruppe

Der einfachste Weg ist es einen Wert für Spacing auf der Gruppe zu setzen.
Vorteil:

  • Dieser Wert ist fix - Auto Layout wird ihn immer einhalten. Er wird ebenfalls bei der Berechnung der Size mit einbezogen und somit auch an Fitter Komponenten kommuniziert.

Nachteil:

  • Dieser Wert ist fix. Wenn die Gruppe schrumpft, rücken Elemente nicht näher zusammen - es kann also vorkommen, das nun nicht mehr genug Platz für alle vorhanden ist und Elemente aus der Gruppe ragen.

Spacing als fixer Wert funktioniert am besten, wenn zuvor bereits absehbar ist, dass es problemlos eingehalten werden kann. Um dem Problem der fehlenden Flexibilität entgegenzuwirken, könnten die Childs der Gruppe flexible Größen haben, um eventuell zu schrumpfen oder zu wachsen - allerdings stellt sich hier die Frage, ob man festen Abständen so viel Priorität einräumen will.

Wichtig: Diese Spacing Variante unterstützt als einzige negative Werte, wodurch man Elemente überlappen lassen kann.

Spacing über Force Expand

Zur Wiederholung: Wenn auf einer Layoutgruppe die Option Child Force Expand angewählt ist, werden die Childs so verteilt, dass sie die Gruppe maximal ausfüllen. Wird die Größe der Childs nicht zusätzlich von der Gruppe kontrolliert, kann Leerraum entstehen, wenn die Gruppe größer als die Summe ihrer Childs ist.
Vorteil:

  • Die Menge an Leerraum ist gleichverteilt und flexibel. Sie ist abhängig vom Größenverhältnis der Childs zur Gruppe.

Nachteil:

  • Es gibt kein Minimum für die Abstände. Wenn die Gruppe schrumpft, schrumpfen auch die Abstände. Sollte die Gruppe ihre Childs beispielsweise exakt einfassen oder gar zu klein sein, gehen die Abstände gegen Null,
  • Die Option "Control Child Size" kann nicht verwendet werden, da die Childs so den gesamten Raum einnehmen.

Auf diese Art und Weise lässt sich unkompliziert dynamisches Spacing erzeugen - allerdings nur bis zu einer gewissen Mindestgröße der Gruppe. Ausschlaggebend für die Richtung des Spacings ist die Option Child Alignment:

[Beispiele]

Anzuwenden ist diese Technik, wenn auf der Achse des Spacings keine dynamische Größe existiert - zum Beispiel eine Gruppe von Bildern mit fixer Höhe, welche dynamischen Abstand auf der horizontalen hat. Die Nachteile könnte man beispielsweise ausbessern, indem die Gruppe selbst eine ausreichende Minimum Size hat, durch die dann ein Mindestmaß an Spacing gewährleistet ist.

Spacer Objekte mit Layout Element

Man kann ebenfalls ganze, quasi leere (sprich ohne Grafik) Objekte für Spacing benutzen. Diese enthalten dann nur ein Layoutelement, was der Gruppe ihre Size mitteilt.
Vorteil:

  • Die Menge an Leerraum ist flexibel - sowohl mit Maximum als auch Minimum,
  • sie kann zwischen jedem Objekt der Gruppe individuell angepasst werden,
  • Spacer können Prefabs sein und so Abstände über mehrere Panels synchronisieren,
  • man kann Elemente an den Spacern verankern.

Nachteil:

  • Neue Elemente können nicht mehr dynamisch in die Gruppe eingefügt werden, es sei denn, man fügt auch weitere Spacer hinzu,
  • erhöht die Anzahl an GameObjects, was Hierarchien komplizierter gestaltet und mehr Performance kostet,
  • kann Iterationsgeschwindigkeit verringern, wenn man nicht mit Prefabs arbeitet,
  • erhöht Komplexität von Hierarchie und ggf. Projekt.

[Beispiele]

Diese Variante gibt einem die meiste Flexibilität und Kontrolle, bringt aber auch mehr Komplexität mit sich. Diese Komplexität kann sich auf das gesamte Projekt ausweiten, wenn man Spacer als Prefabs verwendet. In der Theorie könnte man ähnlich wie in UX-Tools das Spacing in mehreren Elementen der UI mit nur einer Änderung auf dem Prefab anpassen. Das klingt erstmal sehr praktisch, kann aber auch gleichermaßen tückisch sein - es wird viel Achtsamkeit im Umgang mit solchen Strukturen gebraucht. Genau deswegen ist es in den meisten Fällen leichter auf die zuvor genannten einfacheren Optionen zurückzugreifen.

Eine wirklich gute Anwendung ist das synchronisieren der Abstände über mehrere Panels. Nehmen wir an, dass unser Spiel ein HUD besitzt, was stehts am oberen Bildschirmrand ist. Andere Elemente auf der gleichen Ebene sollten einen Abstand zum HUD wahren, um dieses nicht zu überlappen. Natürlich kann jedes weitere Element nun schlicht einen festen Abstand nach oben aufweisen, welcher dann die Höhe des HUDs und eventuelles Padding ist - was passiert aber, wenn das HUD nun durch ein neues Design seine Höhe ändert? Man muss loslaufen und diesen Wert auf jedem anderen Element aktualisieren. Um diese Arbeit zu sparen, kann schlicht ein Spacer Prefab erstellt werden, welches die selben Maße wie das HUD aufweist. Jetzt muss bei einer Änderung des Designs nur noch das Spacer Prefab angepasst werden und nicht jedes einzelne Objekt. Diese Technik hilft ebenfalls, wenn das HUD eine flexible Höhe hat, z.B. für den Porträt-Modus.

[Beispiele]

Flexibles Padding

Ähnlich wie beim Spacing kann manchmal auch beim Padding ein fixer Wert nicht ausreichend sein. Hierfür gibt es folgende Lösungen:

  • Anker Positionen entsprechend wählen
  • Size der Layoutgruppe mit Layoutelement überschreiben
  • Size der Childs manipulieren
  • Spacer Objekte um die Layoutgruppe herum

Flexibles Padding über die Anker

Vorteil:

  • Funktioniert ohne Auto Layout

Nachteil:

  • Kann nicht auf Childs einer Layout Gruppe gesetzt werden,
  • nur inneres Padding möglich,
  • keine Obergrenze.

Indem man die Ankerpositionen korrekt wählt, kann man ebenfalls ein Padding relativ zur Größe des Parents erreichen.

Eine beispielhafte Konfiguration wäre Min (0.25,0) und Max (0.75, 1). Auf diese Art und Weise erhält man ein Padding von 25% auf der X-Achse, jeweils links und rechts.

[Beispiel]

Da das Padding immer relativ zum Parent ist, kann man leider keinen maximalen Wert für die Menge an Padding festlegen. Es bedeutet ebenfalls, dass das Padding nach Innen ist.

Size mit Layoutelement überschreiben

Zur Erinnerung: Bei Layoutcontrollern gibt es Priorisierung. Das Layoutelement hat die höchste Priorität und kann somit die Size der Layoutgruppe überschreiben. Wenn man dann die Layoutgruppe größer werden lässt, als deren Children das benötigen, entsteht Leerraum um die Gruppe herum - vorausgesetzt das die Option Child Force Expand auf der entsprechenden Achse nicht genutzt wird. Wo der Leerraum entsteht ist vom Alignment der Childs abhängig

[Beispiele]

...

  • Das Padding wird immer noch auf dem gleichen GameObject kontrolliert, auf dem sich die Layoutgruppe befindet.

Nachteil:

  • Wenn sich durch neues Design die Werte der Children ändern, muss man per Hand nachrechnen und eintragen - normalerweise wäre das automatisch passiert,
  • kein Force Expand mehr möglich, wenn Padding auf der Achse vorhanden sein soll.

Der eine Vorteil dieser Methode mag unscheinbar klingen, es ist jedoch nicht zu verachten, dass in dieser Variante die Padding-Einstellung noch gut nachvollziehbar ist und nicht so versteckt (wie bei der folgenden Variante).

Size der Childs manipulieren

Diese Methode funktioniert nur mit Images oder wenn Spacer Objekte innerhalb der Gruppe genutzt werden. Die Idee ist, dass wir Objekte größer werden lassen, ohne das optisch mehr Raum mit Grafik gefüllt wird. Wenn wir z.B. Spacern in einer Horizontalen Gruppe eine andere Höhe als die restlichen Elemente geben entsteht Padding auf der vertikalen Achse. Umgekehrtes funktioniert für die Vertikale Layoutgruppe - andere Breite für Spacer führt zu Padding auf der Horizontalen. Wenn wir Padding auf der kontrollierten Achse erzeugen wollen, fügen wir einfach am Anfang und Ende der Gruppe ein Spacer Objekt mit der Size des Paddings ein.

[Beispiele]

Ohne Spacer Objekte kann man das Ganze auch mit Images und der Option "Preserve Aspect Ratio" erreichen, da diese nicht mit Auto Layout kommuniziert. Allerdings ist man so auf eine Achse beschränkt, da die Images ansonsten wieder im Sinne der Aspect Ratio wachsen würden. Das ist aber eher ein Hack, als das ich es wirklich für gut empfinden würde.

[Beispiel]

...

  • Die Layoutgruppe berechnet ihre Maße weiterhin automatisch,
  • Spacer Prefabs können Iterationszeit sparen.

Nachteil:

  • Padding wird in gewisser Hinsicht versteckt, da es implizit entsteht,
  • kein Force Expand mehr möglich, wenn Padding auf der Achse vorhanden sein soll,
  • erfordert Spacer Objekte,
  • Hacky.

Ich glaube eigentlich nicht, dass diese Methode empfehlenswert ist. Was man sich hier potenziell an Iterationszeit sparen kann wird durch die gestiegene Komplexität zunichte gemacht.

Spacer Objekte um die Layoutgruppe herum

Bedenke: Wir können Layoutgruppen schachteln. Eine Layoutgruppe mit flexiblem Padding wäre dann also drei Objekte unterhalb einer weiteren Layoutgruppe - enstprechend ein Spacer, Layoutgruppe und ein weiterer Spacer.

[Beispiel]

Vorteil:

  • Die Layoutgruppe berechnet ihre Maße weiterhin automatisch,
  • Spacer Prefabs können Iterationszeit sparen,
  • Padding ist unabhängig vom Alignment der Childs,
  • erlaubt Force Expand.

Nachteil:

  • Komplexere Hierachie,
  • Padding ist nur auf der von der Obergruppe kontrollierten Achse möglich.

...

Projektbeschreibung

Dieses Projekt dient zur Recherche von Unity UI, genauer gesagt Unity UGUI, insbesondere zur Umsetzung von UI für die Plattform Mobile. Ziel ist es fundiertes Wissen über das System aufzubauen, was anderen Studenten und schlussendlich auch mir selbst, die Arbeit oder gar den Einstieg erleichtert bzw. als Nachschlagewerk für zukünftige Arbeit dient.

Mein Plan ist es von Anfang September bis Ende des Jahres mit ca. 20 Stunden pro Woche an dem Projekt zu arbeiten. In den ersten zwei Monaten möchte ich ausschließlich recherchieren, dann im November mein Material zusammenfassen, um dann im fließenden Übergang bis Ende Dezember eine Dokumentation mit aussagekräftigen Beispielen in Form eines Wikis im übergeordneten Wiki des Gamesmaster zu erstellen.

Finale Zeitaufschlüsselung
DatumTätigkeitStunden
05.09.2023 - 08.09.2023Recherche:
  • Layout
    • Grundlagen
16
11.09.2023 - 15.09.2023
    • Basic Layout
20
18.09.2023 - 29.09.2023
    • Auto Layout
40
02.10.2023 - 06.10.2023
      • Flexibles Layout
16
09.10.2023 - 13.10.2023
  • Canvas
20
16.10.2023 - 20.10.2023
  • Layering
    • Grundlagen
    • Sorting Group
20
23.10.2023 - 27.10.2023
    • Partikel in der UI
20
30.10.2023 - 03.11.2023
  • UI Design Tools
16
06.10.2023 - 10.10.2023
  • Prefab Workflow
20

13.11.2023 - 14.11.2023

  • Safe Zone
8

15.11.2023 - 24.11.2023

  • Performance Best Practices
32

27.11.2023 - 01.12.2023

Zusammenfassung:

  • Layout
20

04.12.2023 - 05.12.2023

  • Canvas
8

06.12.2023 - 08.12.2023

  • Layering
12

11.12.2023

  • Figma (UI Design Tool)
4

12.12.2023 - 13.12.2023

  • Prefab Workflow
8

14.12.2023 - 18.12.2023

  • Performance Tipps
12

19.12.2023 - 20.12.2023

  • Safe Zone
8

21.12.2023 - 22.12.2023

Dokumentation:

  • Wiki aufsetzen
8

27.12.2023 - 29.12.2023

  • Beispiele für Wiki generieren
6

02.01.2024 - 05.01.2024

  • Wiki überarbeiten
12





Gesamt:326

Kapitelbeschreibung

Im Folgenden sollen die entstanden Kapitel meiner Recherche beschrieben werden, welche als untergeordneten Seiten zu diesem Wiki existieren.

Layout

Als Start meiner Recherche beginnt dieses Kapitel mit den absoluten Basics:

  1. RectTransform
  2. Pivot
  3. Relatives Layout mit Ankern

Genauer gesagt wird zunächst erklärt, wie man Position, Größe und Rotation von UI setzt, um danach erstes Layouting mit dem gängigen Konzept von Ankern zu betreiben.

Nach den Grundlagen wird Unitys Auto Layout erklärt, ein System zur automatischen Berechnung und Veränderung von Layouts, basierend auf Layoutelementen und -controllern. Mit Beispielen wird dargelegt, wie sich Größen im Auto Layout errechnen bzw. erklären lassen.

Schlussendlich gibt es noch einige Lösungsansätze, wie man flexible Layouts erstellt, die dynamisch Leerraum entstehen lassen - was für die vielen unterschiedlichen Auflösungen auf dem mobilen Markt unabdingbar ist.

Canvas

Das zweite Grundlagenkapitel dreht sich um das Canvas, den Container der UI. Es wird neben seiner grundlegenden Funktionalität auch die Renderreihenfolge - innerhalb des Canvas und gegen die Welt - beschrieben.

Genau wie am Ende des vorherigen Kapitels, wird beschrieben, wie das Canvas mit unterschiedlichen Displayauflösungen umgehen kann.

Layering

Im Kapitel über Layering geht es nicht nur um die UI, sondern auch um den Rest der Szene. Das Sortieren von Transparenten Objekten wird grundlegend erläutert, um dann verschiedene Ansätze vorzustellen, wie man seine UI gegen die Welt und umgekehrt sortieren kann.

Es wird geklärt, wie man dafür sorgt, dass die UI immer sichtbar ist, weil sie vor dem Spiel liegt oder umgekehrt, unsichtbar hinter dem Spiel verschwinden kann, um ggf. später wieder hervorzukommen.

Insbesondere Partikeleffekte sind in der UI ein Sonderthema, was hier erläutert wird. Neben verschiedenen Ansätzen gibt es zuletzt auch ein Package, das Nutzern die Sache vereinfacht.

Safe Zone

Die Safe Zone ist ein Konzept aus mobiler Entwicklung, welches essentiell für aktuelle UI ist. Heutzutage haben die wenigsten Geräte noch einen nennenswerten Displayrand und die Kamera ist in den Bildschirm eingefasst. Wie man um die sog. Notches herum arbeitet wird in diesem Kapitel erläutert.

UI Design Tools

Ein kurzer Abstecher außerhalb von Unity. UI Design Tools helfen massiv bei Design und Bau, nicht nur Designern, sondern auch Entwicklern. Ich möchte in diesem Kapitel ihren Mehrwert erklären und eine unbedingte Empfehlung für ihre Nutzung aussprechen.

Prefab Workflow

Prefabs sind ein grundlegendes Unity Konzept, dessen Verständnis für dieses Kapitel bereits vorausgesetzt ist. Angelehnt an den Workflow in den zuvor beschriebenen Design-Tools, beschreibe ich hier meine Art und Weise Prefabs für die UI zu verwenden. Das Ganze hat als Ziel Workflow und Struktur zu vereinheitlichen, sowohl innerhalb von Unity, als auch mit Tooling bzw. Designern außerhalb davon.
Da es in diese Kategorie passt, befindet sich hier auch ein Abschnitt über die Benennung von Objekten, eine Aufgabe die vor allem Programmierer ständig haben. Dafür stelle ich ein einfaches Schema vor, welches man als Startpunkt benutzen kann.

Performance Tipps

Als Letztes möchte ich noch ein paar Tipps dazu geben, wie man die Performance des eigenen Spiels verbessert bzw. eher, wie man verhindert, dass die UI die Performance schluckt. Dazu gehe ich näher auf ein paar in diversen Blogs/Talks von Unity aufgezeigten Problemen ein.