Neben verschiedensten kleineren Anpassungen am Gameplay konnten wir erste Animationen, sowie die Finale Beleuchtung implementieren. Zudem gab es diese Woche Performanceverbesserungen dank grosser Polygon Reduktion.
Licht
(von Marcel)
Bisher war die Beleuchtung in unserem Projekt ein grosses Fragezeichen. Aus diesem Grund habe ich mich in dieser Woche intensiv damit befasst. Hierbei stellte sich die Frage ob wir statische oder dynamische Beleuchtung brauchen sollen. Während wir für das Licht/Dunkelheit Puzzle sowieso dynamische Lichter benötigen, hätte die statische Beleuchtung einen eindeutigen Performance Vorteil, sowie den Vorteil, dass wir Area Lights verwenden könnten. Vor allem die Area Lights wären ein gutes Argument gewesen, da diese einen Bereich einheitlich ausleuchten. Dies ist vorallem wichtig, da wir wegen dem Licht/Dunkelheit Puzzle komplett dunkle Teile des Levels haben und desswegen kein Directional Light einsetzten können.
Das Aufsetzten der statischen Beleuchtung stellte sich aus den folgenden Gründen jedoch als schwierig heraus:
- Die Szene sah statisch beleuchtet weniger gut aus.
- Lange Baking Zeiten würden den Workflow verlangsamen.
- Beim Versuch zu statischer Beleuchtung zu wechseln hatte ich bereits mit vielen Problemen zu kämpfen – ich vermutete, dass dies sich so weiterziehen würde.
Da alle diese Punkte vorallem viel Zeit kosten, und wir effektiv nur noch zwei Wochen Entwicklungszeit haben, entschieden wir uns die Beleuchtung dynamisch zu machen. Jedoch ist uns bewusst, dass diese Lösung – vorallem aus Performancegründen – nicht so beibehalten werden könnte, würde das Spiel produziert werden.
Animationen
(von Fee)
Diese Woche befasste ich mich mit der Animation des Players. Damit das Model nicht nur A-Posend durch die Höhle hovert, sollen Bewegungen helfen diesem etwas Leben einzuhauchen. Dazu verwendete ich Mixamo. Dort lud ich das Model erneut hoch und suchte mir eine passende Animation aus. Anschliessend verfeinerte ich das Weight Painting des Exports und machte gewisse Änderungen an den Keyframes der Animation. Das automatisch erzeugte Rigging neigte den Kopf etwas komisch und hatte eine enorm schiefe Haltung, das verbesserte ich.
Anschliessend suchte ich noch eine zweite Animation für einen Roll heraus, um zu sehen, wie man in Unity mehrere Animationen auf einem Model haben kann, da das in Blender nicht so ganz wollte.
Implementieren der Animationen
Diese Animationen mussten anschliessend auch implementiert werden. Dies war zwar bisher noch nicht besonders aufwendig, führte jedoch zu interessanten Zwischenergebnissen, welche wir natürlich nicht vorenthalten wollen.
Natürlich gibt es hier nicht nur Misserfolge, schlussendlich konnten wir die Animation relativ rasch implementieren. Hier ein Video vom aktuellen Stand:
Aktuell haben wir noch ein Problem mit den Animationen. Der Charakter kann im Spiel nicht nur vorwärts, sondern auch Rückwerts gehen. Dies haben wir zurzeit in den Animationen noch nicht so berücksichtigt. Dem werden wir uns in der nächsten Woche widmen.
Monster Design
(von Fee)
Ich begann mit einem ersten Design der Buddy/Enemy Monster. Im Prozess des Modellierens kam ich auf die Idee, dass sie eine Art Hörner haben könnten, zwischen denen eine Leucht-Kugel schwebt. Mit der Hilfe meiner Teamkollegen kam dann die Idee, dass diese Hörner aus kristallen gemacht sein könnten. Momentan sieht das Model noch sehr menschenähnlich aus, ich plane aber dies etwas anzupassen, dass das Model sich vom Player mehr differenzieren lässt.
Kleine Änderungen & Bugfixes
(von Jonas)
Für das Puzzle benötigten wir noch eine Lösung dafür, dass ein signifikanter Teil der Tester den Zusammenhang zwischen verschiebbaren Kristallen & Platform-Kristallen nicht realisierten. Den Ansatz, den wir ausprobiert haben, repositioniert die Kamera an einer statischen Position, die das gesamte Puzzle überblickt. Diese musste natürlich eingebaut werden, was zunächst als relativ unkompliziert schien, sich aber zur schwereren Challenge entpuppte. Nämlich hatte die Kamera Mühe, den Protagonisten im Fokus zu behalten, was zu einem unangenehmen Stottern nach Verlassen der Zone führte. Die Lösung war eine Threshold-Variable die bei einer genug kleinen Distanz automatisch zum Spieler snappt, und einer etwas komplexen Formel zur Berechnung der Positionen innerhalb der Kamera-Bewegung. Zusätzlich wurde noch eine Zone erstellt, durch die Gegner dem Spieler nicht folgen können und keine Angriffe mehr starten. Somit können wir den Puzzle-Bereich klar von der Kampf-Arena abgrenzen.
Da damit die grundlegenden mechanischen Features alle in einer nutzbaren Form sind, war diese Woche geprägt durch kleinere Änderungen. Der Buddy stoppt nun eine kleine Distanz vor dem Protagonisten, ohne direkt darin stehen zu bleiben. Ausserdem gibt es nun keine Unverwundbarkeit mehr, wenn man von einem Angriff getroffen wird, welcher keinen Schaden macht. Das ist für statusverändernde Attacken & Fähigkeiten relevant. Ästhetische Veränderungen wie simple Icons fürs UI und angepasste Farben für ein paar Partikel-Effekte waren auch rasch umgesetzt.
Schlussendlich wollten wir noch einen Fehler beheben, der verursacht hat, dass der Protagonist sich nach dem Sturz in einen Abgrund an Wänden festkleben kann, anstatt einfach runterzufallen. Dieser stellte sich als komplexer als erwartet raus, da das Problem an dem standardmässigen Unity CharacterController liegt. Die Kraft, die für die Schwerkraft zuständig ist, drückt nur direkt nach unten, was leider bei angewinkelten Flächen einfach keinen Effekt hat, auch wenn der Neigungsgrad nur winzig ist. Der Workaround gibt jetzt je nach Winkel relativ zum Mittelpunkt der Spielfigur einen winzigen Schubser in die entgegengesetzte Richtung, was den Character nun wie gewünscht in den finsteren Schlund der Kristallhöhle fallen lässt.
Texturen & Polygon Reduktion
(von Nadja)
Die Texturen sind da! Zumindest für ein Asset. Die letzte Woche bin ich nun komplett auf Blender umgestiegen und habe mich in ZBrush und Substance Painter eingearbeitet. Ich habe massenhaft Steine modelliert, nicht weil wir eine Menge davon brauchen, sondern um meinen Workflow zu finden. Das hat eine Menge Zeit gekostet, doch ich habe einen gefunden.
Mit Blender erstelle ich eine ungefähre Low-Poly Form. Dieses importiere ich in ZBrush, das geht dank passendem Plugin ziemlich einfach. Im ZBrush kommen dann alle Details drauf, dabei ist es total egal, wie viele Polygone da drauf sind. Wenn ich fertig bin, importiere ich es wieder zurück in Blender. Je nachdem wie stark sich die Form verändert hat, erstelle ich ein neues Low-Poly Modell. Das Low-Poly Modell bekommt dann eine UV-map.
Ist dieser Schritt fertig werden beide Modelle als Object exportiert. Das Low-Poly Modell importiere ich dann in Substance Painter. Dort Bake ich dann die High-Poly Version drauf und erhalte sie als Textur auf dem Low-Poly Modell. Mit dieser Methode kann ich nun auch Curvator benutzen. Das ist eine Funktion, die ich in Tutorials häufig gesehen habe. Sie wird gerne als Stilisierungsmittel verwendet, da man damit die Kanten aufhellen oder abdunkeln kann. Als ich angefangen habe mit Substance Painter zu arbeiten, hatte ich damals mein High-Poly Modell unbearbeitet dort hochgeladen, doch so hat Curvator nicht funktioniert. Problem war höchstwahrscheinlich die fehlende UV-map. Da ich irgendwann keine Steine mehr sehen konnte, bin ich auf Holz umgestiegen. Somit haben die Holzpfeiler und die Holzplanken am Boden ihren ersten Anstrich erhalten, die Steine aber noch nicht.
Mit diesem Workflow schlage ich nun 2 Fliegen mit einer Klappe. Ersten bekommen alle Modelle jetzt nach und nach ihre Texturen und haben gleichzeitig nur noch einen Bruchteil an Polygonen als zuvor. Jedoch sind die Texturen noch nicht ganz so optimal, damit muss ich noch herumspielen. Wichtig ist aber, dass jetzt erstmals alle Modelle ihre Texturen und ihr Remesh erhalten.