© graphicwithart/Shutterstock.com
Erschließung neuer Use Cases und Mehrwerte mit Unity - Teil 2

Ein 3D-Computermuseum in Unity


Nicht nur Spiele, sondern auch Business Use Cases lassen sich mit einer 2D-/3D-Engine wie Unity entwickeln und können dem Anwender echte Mehrwerte bieten. Anfänglich gibt es für den Entwickler viel zu lernen: Kamera, Render Pipelines, Shader, Meshes, GameObjects, Scripting und vieles mehr. Sitzen die Grundlagen, sind der Kreativität keine Grenzen gesetzt. Zeit, etwas Licht ins Dunkel zu bringen und einen Business Use Case zu entwickeln.

Im ersten Teil dieser Serie haben wir uns grundlegend mit Unity beschäftigt. Unter anderem damit, wie der Editor aufgebaut ist, was GameObjects und Prefabs sind und wie wir mit ersten Skripten einen steuerbaren Spieler erstellen können. Dieses Wissen wollen wir nutzen, um unseren eigentlichen Use Case zu entwickeln: ein 3D-Heimcomputermuseum, durch das ein Spieler in Ich-Perspektive laufen kann. Dabei soll der Spieler mit Gegenständen wie Türen oder dem eigentlichen Museumsgegenstand interagieren können.

Als Basis für den Start nutzen wir das Projekt aus dem ersten Artikel. Dort löschen wir aus der Szene alle GameObjects bis auf den Boden, die Kamera, das Licht und den Player. Alternativ kann übrigens auch ein neues Unity-Universal-Render-Pipeline-Projekt erstellt werden. Abbildung 1 zeigt, wie die Szene zum Start aufgebaut ist.

rauber_unity3d_teil2_1.tif_fmt1.jpgAbb. 1: Aktueller Stand der Museumsszene

Importieren von Modellen

Da wir uns in diesem Artikel mit der Entwicklung und nicht der Modellierung von 3D-Objekten beschäftigen wollen, werden wir fertige 3D-Modelle importieren und verwenden. Unity ist in der Lage, eine Vielzahl verschiedener Formate zu importieren, bspw. verschiedene Bildformate (u. a. .jpg, .png und .psd), Modellformate (u. a. .fbx und .obj), Audioformate (u. a. .mp3 und .wav) und Videoformate (u. a. .mp4). Beim Import verarbeitet Unity die Daten, sodass sie in der Engine genutzt werden können. Je nach Format können beim Import diverse Einstellungen getroffen werden, also wie die jeweilige Datei importiert werden soll. Dazu später mehr.

Da wir für unseren Use Case einige Modelle benötigen, lassen sich komplette Unity Packages importieren. Man kann sie sich als eine Art Zip-Datei vorstellen, in der verschiedene Dateien mit voreingestellten Importeinstellungen zu finden sind, die Unity importiert. Solch ein Package findet sich im zum Artikel zugehörigen GitHub Repository [1]. Die Datei starter-package.unitypackage muss heruntergeladen und dann per Drag and Drop in die Projektansicht von Unity verschoben werden. Daraufhin öffnet sich ein kleines Dialogfenster (Abb. 2). Das Fenster zeigt an, welche Dateien im Paket vorhanden sind. Über eine Checkbox an jeder Datei können auch gewisse Dateien explizit abgewählt werden, sodass sie nicht importiert werden. Das ist oft nützlich, wenn ein Paket auch Beispielszenen enthält, die nicht benötigt werden.

rauber_unity3d_teil2_2.tif_fmt1.jpgAbb. 2: Importdialog eines Unity Packages

In unserem Fall wollen wir alle Dateien importieren, daher wählen wir zur Sicherheit zuerst den Button All und danach Import. Je nach Computer und Größe eines Packages kann ein Import wenige Sekunden bis mehrere Minuten dauern. Nach dem Import finden wir in der Projektansicht den Ordner Models, in dem zwei Unterordner zu finden sind: Boundfox Studios und Kenney.nl. Sie bezeichnen den Ursprung der Modelle. Die Modelle im Ordner Boundfox Studios haben wir für diesen Artikel modelliert. Bei den Modellen von Kenney.nl handelt es sich um CC-1.0-Universal-lizenzierte Assets, die kostenfrei genutzt werden können. Kenney.nl [2] ist generell eine gute Anlaufstelle für 2D- und 3D-Assets, die kostenfrei genutzt werden können – ideal für Prototyping einer eigenen Idee, ohne zuvor selbst modellieren zu müssen. Schauen wir uns den Ordner Boundfox Studios genauer an. Dort sind weitere Unterordner sowie einige 3D-Modelle zu finden. Das Paket bringt eine Animation, ein Prefab und alle benötigten Materialien und Shader (Kasten: „Shader“) mit.

Shader

Ein Shader (ursprünglich aus dem englischen „shade“ für Schatten) ist, sehr einfach ausgedrückt, für die Berechnung der 3D-Grafik zuständig. Shader können bspw. die Farben, die Vertices oder die Geometrie eines Meshes anpassen, um einen bestimmten Effekt zu erzeugen. Möchte man etwa einen Wasser-Shader entwickeln, muss dieser Transparenz, Reflexion, Lichtbrechung und Vertexverschiebung (sogenanntes Displacement für Wellen) beherrschen. Shader sind pure Mathematik zur Berechnung der einzelnen Daten, daher befinden sich auf modernen GPUs Tausende von Recheneinheiten für Shader – die aktuelle NVIDIA RTX 3080 bringt 8704 Recheneinheiten mit. Ein schlecht entwickelter Shader kann daher die Performanz einer Anwendung massiv beeinträchtigen. Moderne Spiele bestehen aus Hunderten solcher Shader, um das Endergebnis zu erzeugen. Das bedeutet auch, dass rein durch Änderungen von Shadern ein optisch komplett anderes Spiel dargestellt werden kann. Ein gutes Beispiel hierfür ist Minecraft, das durch die Modding-Community entweder das typische LEGO-Klötzchen-Feeling hat oder sehr modern, fast wie ein Landschaftsdesigner, aussieht.

Um der Komplexität etwas zu entkommen, kann in Unity der Shader Graph [4] genutzt werden, ein visueller, knotenbasierter Editor für Shader. Ein Beispiel in Form eines sehr einfachen Glas-Shaders bringt das Starterpaket mit (Models/BoundfoxStudios/Materials/Lit Glass, Abb. 3).

rauber_unity3d_teil2_3.tif_fmt1.jpgAbb. 3: Shader-Graph für den Lit Glass Shader

Wenn wir beispielhaft einmal das Modell Building anwählen, dann zeigt uns der Inspector die zuvor genannten Import Settings. Das Fenster teilt sich in vier Tabs:

  • Model: Importeinstellungen für das 3D-Modell selbst

  • Rig: Importeinstellungen für das Skeleton eines Charakters, das für die Animation benötigt wird

  • Animation: Importeinstellungen für Animationen, sofern das Dateiformat sie unterstützt

  • Materials: Importeinstellungen für Materials, also das Aussehen des 3D-Modells

Auf die genauen Einstellungen in den Tabs Rig, Animation und Materials wollen wir hier nicht weiter eingehen, da wir weder ein Rig noch eine Animation importieren und die Materials bereits durch das Starter Package beiliegen. Im Tab Models beschränken wir uns auf ein paar wichtige Einstellungen:

  • Scale Factor: gibt an, wie groß ein Modell importiert werden soll. Das ist nützlich, wenn man viele Drittanbietermodelle nutzt, um sie auf eine einheitliche Größe zu skalieren.

  • Mesh Compression: gibt an, ob ein Mesh komprimiert werden soll. Es wird versucht, mit weniger Vertices das gleiche Mesh abzubilden. Auch wieder nützlich, falls ein Drittanbietermodell zu detailreich abgebildet ist. Aber Vorsicht: Durch diese Einstellungen könnten visuelle Fehler entstehen.

  • Read/Write Enabled: Möchte man per Skript zur Laufzeit das Mesh ändern, muss diese Option eingeschaltet werden.

  • Generate Colliders: Soll ein Objekt an der physikalischen Kollision teilnehmen, kann über diese Option der entsprechende Collider erstellt werden. Auch hier ist Vorsicht geboten: Ist ein Mesh sehr detailreich, ist der Collider auch sehr detailreich. Oftmals lässt man diese Option ausgeschaltet und nutzt eine Kombination weniger einfacher Collider, um die Performanz zu verbessern.

Da die Importeinstellungen durch das Unity Package bereits korrekt gesetzt sind, müssen wir hier keine Änderung vornehmen. Bevor wir das eigentliche Museum modellieren können, müssen wir für unsere Tür noch ein Prefab erstellen. Warum genau, das sehen wir gleich.

Erstellung des Prefabs für eine Tür

Um ein neues Prefab (Kasten: „Prefabs“) zu erzeugen, erstellen wir ein neues leeres GameObject in Hierarchy (wir erinnern uns: Rechtsklick in Hierarchy | Create Empty). Über Drag and Drop ziehen wir das neue leere GameObject in Project in den Ordner Models/BoundfoxStudios/Prefabs und löschen dann aus der Szene das GameObject wieder heraus. In Project können wir den Namen des Prefabs auf Door ändern. Jedes GameObject, das via Drag and Drop aus Hierarchy in Project verschoben wird, wird automatisch zu einem Prefab. Über einen Doppelklick auf das Door Prefab gelangen wir in den Prefab-Editor. Das ist ein von der zuvor dargestellten Szene isolierter Editor, der es ausschließlich erlaubt, das gewählte Prefab zu editieren. Alle nachfolgend angesprochenen Anpassungen werden wir ausschließlich auf Basis des Door Prefabs erledigen.

Prefabs

Ein Prefab ist ein Bauplan eines wiederverwendbaren GameObjects. Prefabs beinhalten ein oder mehrere GameObjects mit beliebig viele...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang