Sonstiges: Entwicklertagebuch - Der Weg zum eigenen Switch-Spiel
Michael Grönert, am 26.12.2016, Seite 22 von 25

BadToxic Discord-Server | GameMaster Discord-Server | BadToxic auf Twitter
BadToxic auf Instagram | BadToxics Entwickler-Instagram | BadToxic auf YouTube
Teil 22: Overworld-Landschaftsgestaltung
Direkt anschließend an unseren vorherigen Tagebucheintrag, geht es mit Grafikeffekten weiter. Wir wollen unsere bisher triste Landschaft außerhalb der Minispiele etwas aufwerten. Diesbezüglich beschäftigen wir uns heute mit zwei Themen. Zum einen mit einem etwas speziellen Baum und zum anderen mit Gras, welches sich im Wind bewegt aber auch auf die Spieler reagiert.
Pythagoras-Baum
Das besondere an einem Pythagoras-Baum ist, dass es sich hierbei gar nicht um eine Pflanze handelt, sondern um ein Fraktal. Das heißt, geometrische Figuren, welche sich nach mathematischen Vorgaben rekursiv wiederholen. In diesem Fall handelt es sich um den Satz des Pythagoras, welchen vermutlich jeder aus der Schulmathematik kennen dürfte. Er besagt, dass in allen ebenen rechtwinkligen Dreiecken die Summe der Flächeninhalte der Kathetenquadrate gleich dem Flächeninhalt des Hypotenusenquadrates ist. Oder ausgedrückt in einer Formel, die vermutlich leichter hängen geblieben sein dürfte: a²+b²=c².

Veranschaulichung des Satz des Pythagoras auf Wikipedia
Besagter Baum nutzt nun diese Formen rekursiv und setzt auf Quadrate weitere Dreiecke und Quadrate mit identischen Seitenverhältnissen auf. Das ganze wird schnell verständlich, wenn man sich folgendes Video anschaut, in dem ich meine ältere (2013) Implementierung eines solchen Baumes mit der Spieleentwicklungssoftware Game Maker: Studio umgesetzt habe.
Eine HTML5-Version davon könnt ihr direkt in eurem Browser ausprobieren oder auf meiner Homepage herunterladen. Die Kanten des Grund-Quadrats sowie die obere Ecke des aufliegenden Dreiecks lassen sich frei festlegen. Dadurch können bereits viele verschiedene Fraktale erzeugt werden. Mit ein paar Farben und Texturen lässt sich das ganze interessanter gestalten und der optionale Wind bringt Leben in die Sache.
Nun war mir danach, das Ganze in Unity in 3D nachzubauen. Da bei den Berechnungen die dritte Dimension eigentlich keine Rolle spielt, sollte dies nicht schwieriger sein. Allerdings weichen die verwendeten Sprachen und Techniken stark voneinander ab, so war es dennoch eine erneute Herausforderung. Ich erspare euch die mathematischen Details, für interessierte biete allerdings den Quellcode auf GitLab an.
Solche Rekursionen können selbst einen aktuellen PC schnell an seine Grenzen bringen. Es bleibt also zunächst fragwürdig, in welcher Form ich diesen Baum schließlich im Spiel verwenden werde. Es dürfte aber sicher sein, dass es keinen Pythagoras-Wald geben wird, sondern solche Ressourcen-hungrigen Bäume eine Seltenheit sein werden.
Interaktives Gras
Jetzt zu etwas das die fast trostlose Landschaft flächendeckend verbessern soll: eine Wiese. Um Gräser, Sträucher, Blumen und ähnliches in Unity umzusetzen gibt es viele unterschiedliche Ansätze. Ich entscheide mich allerdings für gewisse Anforderungen, die diese Auswahl stark einschränken. Ich möchte, dass unsere Spieler (und eventuell auch andere Dinge) mit dem Gras interagieren können sowie dass das Gras sich im Wind bewegt. Die Grashalme sollten sich also beispielsweise zur Seite biegen, wenn ein Spieler auf die tritt, und sich danach wieder aufrichten.
Ich suche gezielt und umfangreich nach Anleitungen und Beispiel-Code zu diesem Thema und werde fündig. Im Endeffekt versuche ich aus verschiedenen Beispielen eine Kombination zu schaffen. Ich möchte euch die vermutlich wichtigsten Funde nicht vorenthalten: Linden Reids „Waving Grass Shader in Unity“ und Minions Arts „Quick Game Art Tips - Interactive Grass Shader“. Die effiziente Variante dies mit Shadern umzusetzen, bringt den Nachteil mit sich, dass ich mir auf diesem Gebiet noch schwer tue alles auf anhieb nachvollziehen zu können, aber das ist etwas womit man zurechtkommen muss. Theoretisch ist in den genannten Tutorials alles ausführlich erläutert und kann zum größten Teil übernommen werden. In der Praxis funktioniert leider nicht immer alles so einfach und zudem kann es widersprüchliche Voraussetzungen geben, wenn man zwei verschiedene Shader miteinander kombinieren möchte.

Wellenförmiger Wind aus Linden Reids Tutorial
Die verlinkten Tutorials beschreiben das meiste bereits (wenn auch nur auf Englisch), weshalb ich nicht alles im Detail wiederkauen möchte, aber ich gebe euch Zusammenfassungen. Der Wind, welcher sich wellenförmig ausbreiten zu scheint, wird so zu sagen durch ein scrollenden Gradienten verwirklicht.

Gradienten Textur von Linden Reids Tutorial
Grashalme werden etwa entsprechend der Helligkeit im Gradienten an ihrer Position gebogen. Beispielsweise kann man hell für rechts und dunkel für links festlegen. Zudem wird die verstreichende Zeit auf diese Koordinaten addiert, wodurch sich die Wellen in stetiger Form bewegen (als würde der Gradient endlos wiederholend scrollen).

Grashalme biegen sich interaktiv in Minions Arts Tutorial
Die Interaktion mit dem Gras ist simpler nachzuvollziehen und man kommt leicht auf die Idee, wie es umgesetzt werden kann. Doch ohne Erfahrung mit Shadern kann jede Kleinigkeit zur Herausforderung werden. Beispielsweise: Wie bekomme ich die Position eines Objektes im Spiel in den Shader hinein? Da wir hier keine stark technischen Tagebucheinträge verfassen, bleibt euch zum Glück erspart durchzukauen, was alles noch schief gehen kann, selbst wenn man bereits Anleitungen mit Beispiel-Code vorliegen hat. Zusammengefasst: Grashalme biegen sich in die entgegengesetzte Richtung zu einem Objekt, mit dem sie interagieren sollen, sobald dieses eine gewisse Entfernung unterschritten hat. Das klingt doch einfach, oder? Da die obige Grafik und das verlinkte Tutorial die Thematik bereits gut veranschaulicht und erklärt, werde ich es auch schon hierbei belassen.
Und so sieht das ganze dann in der Praxis in GameMaster aus. Im Video sehen wir ebenfalls blaue Pilze, welche im Dunkeln leuchten, sowie Blumen. Die verwendeten 3D-Modelle haben verschiedene LOD (Level of Detail) -Varianten. Das bedeutet je nachdem wie weit die Kamera von ihnen entfernt ist, haben die Modelle entweder mehr oder weniger Details. Dies soll dafür sorgen, dass einzelne Objekte weniger rechenintensiv sind, wenn sie in größerer Zahl gleichzeitig im Bild sind. Dadurch entsteht allerdings der Nachteil, dass sich die verschiedenen Modell-Varianten, in Bezug auf unsere Gras-Shader, auch unterschiedlich Verhalten, da sie verschieden viele Punkte (bzw. Vertices) nutzen. Man müsste die Werte der Shader somit pro Modell und Detaillevel konfigurieren, um möglichst gute Ergebnisse zu erzielen. Ein großer Teil meiner Zeit für dieses Thema, wurde durch die Optimierung dieser Werte in Anspruch genommen.
Damit beende ich den heutigen Eintrag. Das nächste Mal heben wir unseren Spiele-Charakter in eine neue Dimension und damit auch den Gesamteindruck unseres Spiels - Wir nutzen dreidimensionale Manga-Stil Figuren aus VRoid Studio. Bis bald!
Ihr möchtet die Auszüge aus dem Leben eines Entwicklers lieber in englischer Sprache lesen? Unter diesem Link findet ihr die englische Version dieses Tagebucheintrags!
ANZEIGE:
Um Kommentare zu schreiben, bitte oben einloggen oder jetzt Registrieren!