Spielprinzip

In SneakyRobot wird ein Roboter in Top-Down-Ansicht durch verschiedene Level gesteuert. Um ein Level erfolgreich abzuschließen, müssen alle Collectibles eingesammelt und anschließend der Ausgang erreicht werden. Werden Spielende von gegnerischen Robotern entdeckt oder durch Projektile von Geschütztürmen zerstört, verlieren sie ein Leben und werden am zuletzt aktivierten Checkpoint wiederbelebt. Sind alle Leben aufgebraucht oder läuft der Leveltimer ab, gilt das Level als fehlgeschlagen. Die Steuerung sowie alle relevanten Spielmechaniken werden auch im Tutoriallevel erklärt.

CoreConcept.png

Spielwelt & Setting

Das Setting ist eine futuristische, industrielle Anlage, die ausschließlich von Robotern bewohnt wird. Diese sind der Spielfigur feindlich gesinnt. Eine komplexe Rahmenhandlung gibt es nicht.

Das Designkonzept ist schlicht. Die Spielwelt besteht aus Meshes mit einfacher Geometrie und überwiegend einfarbigen Materialien. Neonfarbene Akzente werden eingesetzt, um interaktive Elemente und Gefahren hervorzuheben. Das User Interface folgt demselben Ansatz. Rechteckige Grundformen stehen in Kontrast zu einer futuristisch rundlichen Schrift. Das UI ist dadurch funktional und übersichtlich, ohne visuell mit der Spielwelt zu konkurrieren. Eine einheitliche Farbpalette über alle Bereiche hinweg (Spielwelt, UI, Visual Effects etc.) trägt zu einem stimmigen Gesamtkonzept bei.

Setting.png

Zentrale Blueprints Architektur

Game Instance

Die Game Instance verwaltet levelübergreifende Variablen und Funktionen und stellt diese anderen Blueprints zur Verfügung. Dazu zählen das Laden von Leveln sowie das Speichern und Anwenden von Spieleinstellungen wie Lautstärke, Helligkeit und Grafikeinstellungen.

Game Mode

Der Game Mode verwaltet das zentrale Spielgeschehen innerhalb eines Levels mithilfe folgender Game States (Enum): Main Menu, Cutscene, Playing, Paused, Level Finished, Game Over, Player Death. Andere Klassen informieren den Game Mode über wichtige Ereignisse wie „Cutscene beendet“, „Collectible eingesammelt“, „Player zerstört“ oder „Levelende erreicht“. Auf dieser Grundlage wechselt der Game Mode den aktuellen Game State und informiert wiederum andere Klassen darüber.

Zusätzlich ist der Game Mode für das Abspielen von UI-Soundeffekten und der Hintergrundmusik zuständig. Zwar könnten UI-Sounds auch direkt in Widgets abgespielt werden, allerdings lässt sich das Abspielverhalten durch die Verwendung einer Audiokomponente im Game Mode besser kontrollieren.

Player Pawn

Der Player Pawn ist ein kleiner Roboter mit vier Rädern und einem Bildschirm, auf dem seine Augen dargestellt werden. Spielende sehen ihn durch eine Kamera aus der Top-Down-Perspektive. Die zentrale Aufgabe dieser Klasse ist die Verarbeitung von Eingaben. Dazu zählen Movement, Boost, Camera Zoom, Restart, Pause und das Überspringen von Cutscenes.

Werte aus dem Movement-Input werden zwischengespeichert und im nächsten Frame normalisiert angewendet. Dadurch wird die Bewegungsgeschwindigkeit von der Framerate und den Ticks der Input Events entkoppelt. Abhängig von der Geschwindigkeit werden außerdem die Räder animiert und ein Fahrgeräusch abgespielt. Beim Betätigen der Boost-Taste werden Geschwindigkeit und Beschleunigung temporär erhöht. Zusätzlich wird das Fahrgeräusch angepasst und Speed Lines als visueller Effekt eingeblendet. Die Inputs für Pause und Restart beeinflussen den Game State und werden daher an den Game Mode weitergeleitet. Das Zoom-Feature passt die Entfernung zwischen Kamera und Spielfigur an.

Wird der eigene Roboter entdeckt, verändert sich der Gesichtsausdruck auf seinem Display. Wird er hingegen zerstört, wird eine beschädigte Version des Meshes eingeblendet, ein Soundeffekt abgespielt und eine Partikelsimulation gestartet.

Das gesamte Verhalten des Player Pawn ist an den aktuellen Game State gekoppelt, sodass der Roboter beispielsweise bei pausiertem Spiel nicht gesteuert werden kann.

player.png

Checkpoints

Checkpoints dienen als Respawn-Punkte für den eigenen Roboter. Erreicht der Player Pawn einen Checkpoint, wird dieser aktiviert und über den Game Mode werden alle vorherigen Checkpoints deaktiviert. Das Mesh bewegt sich mithilfe einer Timeline-Animation auf und ab. Beim Aufsammeln werden eine Animation, ein Soundeffekt und ein visueller Effekt abgespielt.

checkpoint.png

Collectibles

Um ein Level erfolgreich zu beenden, müssen alle Collectibles eingesammelt werden. Wie bei den Checkpoints, wird das Mesh über eine Animation abwechselnd auf und ab bewegt. Ein Collectible informiert den Game Mode wenn es eingesammelt wurde. Außerdem werden Animation und Soundeffekt abgespielt, bevor der Actor entfernt wird.

collectible.png

Level Finished Trigger

Der Level Finished Trigger ist ein einfacher Blueprint Actor, der den Game Mode informiert, sobald der Player Pawn das Ende eines Levels erreicht.

Enemies

Gegnerische Roboter ähneln optisch dem Player Pawn. Sie verfügen jedoch zusätzlich über einen leuchtenden Sichtkegel, durch den der eigene Roboter bei Berührung deaktiviert wird.

Gegner können zerstört werden, indem ein boostender Player Pawn sie rammt. In diesem Fall wird ein beschädigtes Mesh eingeblendet, ein Soundeffekt abgespielt sowie Partikel- und Rauch-Effekte gestartet.

Jeder Gegner besitzt eine von drei Verhaltensweisen: stationär, rotierend oder patrouillierend. Für diese einfache Logik wurde bewusst auf NavMesh und Behavior Trees verzichtet. Stattdessen kommen eigens implementierte Systeme zum Einsatz, die Gegner Wegpunkte abfahren lassen oder sie in vordefinierten Intervallen um die eigene Achse drehen. Während der Bewegung werden Fahrgeräusche abgespielt und die Räder animiert.

Auch das Verhalten der Gegner ist an den Game State gekoppelt, sodass sie sich weder vor Spielbeginn noch bei pausiertem Spiel bewegen.

enemy.png

Turrets & Projectiles

Türme feuern in regelmäßigen Abständen Laserprojektile ab. Dabei werden zwei Projektile gespawnt, der Rückstoß an den Läufen animiert und ein Soundeffekt abgespielt.

Die Laserprojektile bewegen sich mithilfe einer Projectile-Movement-Komponente. Bei einer Kollision werden Sound- und Partikeleffekte ausgelöst. Trifft ein Projektil den Player Pawn, wird der Game Mode informiert, bevor der Actor zerstört wird.

Das Verhalten beider Klassen ist an den Game State gekoppelt: Türme feuern und Projektile bewegen sich ausschließlich während des aktiven Spiels.

TurretProjectile.png

Levelstruktur

Das Spiel enthält aktuell vier Level: das Hauptmenü, ein Tutorial sowie zwei weitere Spiellevel.

Im Hauptmenü-Level wurden Assets als Hintergrundkulisse für das Userinterface platziert. Das Tutorial-Level bringt den Spielenden alle wichtigen Mechaniken bei. Die beiden weiteren Maps dienen als Beispiellevel.

Levels.png

Level Blueprint

Zu Beginn eines Levels teilt der Level Blueprint dem Game Mode die Länge des Level-Timers mit und startet anschließend eine animierte Kamerafahrt. Nach Abschluss oder Überspringen der Introsequenz wird über den Game Mode das eigentliche Spiel gestartet.

Tiles

Die Level sind aus Kacheln mit quadratischer Grundfläche aufgebaut, die als Blueprint Actors umgesetzt wurden. Dadurch können Änderungen an einzelnen Levelbausteinen zentral vorgenommen und werden automatisch auf alle Instanzen in verschiedenen Maps übertragen. Die meisten Tiles enthalten keine eigene Logik.

Eine Ausnahme stellt die Tür dar: Sobald alle Collectibles eines Levels eingesammelt wurden, schaltet der Game Mode alle Türen frei. In diesem Zuge wechselt die Farbe der leuchtenden Anzeige von Rot zu Grün. Nähert sich der Player Pawn einer entsperrten Tür, öffnet sie sich mit Animation und Soundeffekt und schließt sich wieder, sobald die Spielfigur den Bereich verlässt.

Tutorial Trigger & Tutorial Manager

Levels können einen Tutorial Manager sowie mehrere Tutorial Trigger enthalten. Wird ein Tutorial Trigger ausgelöst, übermittelt dieser dem Tutorial Manager, welches Widget angezeigt werden soll. Die zentrale Verwaltung über eine separate Klasse verhindert unerwünschtes Verhalten wie das Überlagern mehrerer Tutorial-Widgets.

User Interface

Das User Interface setzt sich im Wesentlichen aus drei Komponenten zusammen: Menüs, Player HUD und Tutorial-Einblendungen.

Menüs

Es gibt fünf verschiedene Menüs:

  • Hauptmenü
  • Pausemenü
  • Levelauswahl
  • Einstellungsmenü für Lautstärke, Helligkeit und Grafikeinstellungen
  • Informationsscreen zu Steuerung und verwendeten Fremdassets

Der Großteil der Logik ist in Widget Blueprints umgesetzt. Der Wechsel zwischen den einzelnen Screens im Haupt- und Pausemenü wird über Widget Blueprints mit Widget Switchern realisiert.

Player Heads-Up Display (HUD)

Das Player HUD wird nach Abschluss der Introsequenz über den Game Mode eingeblendet. Es zeigt den Level-Timer, die verbleibenden Leben sowie die Anzahl der eingesammelten Collectibles an. Die benötigten Informationen ruft das Widget direkt aus dem Game Mode ab.

Ingame Notifications und Tutorials

Dabei handelt es sich um temporär eingeblendete Widgets, die durch Events im Spiel ausgelöst werden. So informiert der Game Mode beispielsweise, dass ein Checkpoint erreicht oder die Türen eines Levels entriegelt wurden. Auf ähnliche Weise blendet der Tutorial Manager erklärende Hinweise ein, sobald ein Tutorial Trigger auslöst wird. Es wurden Hinweise zu Steuerung, Collectibles, Gegnern und der Boost-Mechanik eingebaut.

UI Layout.png

Audio

Audio wurde in Form von Soundeffekten und Hintergrundmusik umgesetzt. In den meisten Fällen wurden dafür MetaSound Sources verwendet, die über Audiokomponenten in den Blueprints gesteuert werden.

Ziel war es, alle wichtigen Interaktionen und Ereignisse mit Soundeffekten zu unterstützen. Dazu zählen unter anderem Fahrgeräusche der Roboter, das Einsammeln von Collectibles, das Aktivieren von Checkpoints, das Feuern von Türmen sowie Interaktionen mit dem User Interface. Geräusche, die von Actors in der Spielwelt ausgehen, verwenden Raumklang, um ihre Position akustisch nachvollziehbar zu machen.
Für Hauptmenü und Spiellevel gibt es unterschiedliche Hintergrundmusik, deren Wiedergabe über den Game Mode verwaltet wird.

Input

Die Eingaben wurden über das Input Action Mapping System umgesetzt. Es existieren Actions für Movement, Boost, Pause, Restart, Cutscene überspringen und Camera Zoom. Das Spiel kann sowohl mit Tastatur als auch mit Controller gespielt werden. Die Menüsteuerung erfolgt zum aktuellen Zeitpunkt ausschließlich über die Maus.

Inputs.png

Entwicklungsumgebung & Fremdassets

Für das Projekt wurde Unreal Engine 5.6.1 verwendet. Es kamen ausschließlich bereits integrierte Systeme wie MetaSound und Niagara Fluids zum Einsatz. Zusätzliche Plugins von Drittanbietern wurden nicht verwendet.

Sämtliche Meshes, Materialien, Texturen, UI-Elemente und Blueprints wurden selbst erstellt. Die einzigen Fremdassets sind:

  • Schriftart: Orbitron (fonts.google.com)
  • Soundeffekte: KI-generiert (brev.ai)
  • Hintergrundmusik: KI-generiert (suno.ai)

Fazit & Ausblick

Die Arbeit an SneakyRobot hat viel Spaß gemacht, ich bin ich mit dem Endergebnis sehr zufrieden und konnte im Rahmen des Projekts viele Erfahrungen sammeln.

Besonders stolz bin ich auf die Vielzahl an Animationen, Soundeffekten und visuellen Effekten, die bei unterschiedlichen Spielereignissen und Interaktionen zum Einsatz kommen.

In Zukunft würde ich gerne eine vollständige Menüsteuerung per Tastatur und Controller umsetzen sowie mich intensiver mit Performance-Optimierung beschäftigen.

Playthrough

Ergänzung zum Projekstruktur

Um den Code möglichst übersichtlich zu gestalten wurde umfassend kommentiert und zusammengehörige Abläufe in Funktionen gebündelt. Darüber hinaus wurde auf eine sinnvolle Ordnerstruktur im Content-Browser sowie auf eine konsistente Benennung von Dateien und Blueprints geachtet. Eine Besonderheit stellt der Movies-Ordner dar. In diesem Verzeichnis befinden sich MP4-Dateien, die für animierte Texturen verwendet werden. Diese Dateien müssen sich im Movies-Ordner befinden, damit sie beim ZIP-Export des Projekts korrekt übernommen werden. Da es sich bei MP4-Dateien nicht um klassische Unreal-Assets handelt, werden sie im Unreal Editor nicht im Content Browser angezeigt. Aus diesem Grund erscheint der Movies-Ordner im Editor leer, obwohl er tatsächlich benötigte Ressourcen enthält.