Einführung
„Super Mira 64“ ist eine Tech-Demo im Retro-Stil, die das Konzept eines Collect-a-thons in einer träumerischen Unterwasserwelt erforscht. Im Zentrum steht die Meerjungfrau Mira, die in einer farbenfrohen, versunkenen Welt mit ihrer Fischschule interagiert. Mira kann die Fische um sich herum kontrollieren und nutzt sie, um mit ihrer Umgebung zu kommunizieren – etwa mit großen Muscheln, Schatztruhen oder Korallen. In der aktuellen Fassung demonstriert das Spiel diese Idee anhand einer leuchtenden Riesenmuschel, die auf die Anwesenheit der Fische reagiert.
Die Demo läuft auf PC und lässt sich mit einem Xbox-Controller oder mit Maus und Tastatur steuern. Die Steuerung funktioniert vollständig in der Executable, lediglich im Unreal Editor muss das Spielfenster aktiv angeklickt werden, damit die Steuerung initial erkannt wird.
Das Modell der Meerjungfrau wurde bereits im letzten Semester in Blender modelliert und animiert und für diese Demo erneut eingesetzt. Abgesehen von einer kostenlosen Sandtextur von Fab stammt sämtliche Gestaltung, Logik und Technik in diesem Projekt aus eigener Hand – alles habe ich im Laufe der Entwicklung erlernt und umgesetzt.
Visuelle Gestaltung
Zwei visuelle Referenzquellen dienten der Konzeption des Looks:
Zum einen eine realistische Unterwasseraufnahme einer Meerjungfrau – warmes Licht in der Nähe, mystisch bläuliche Tiefe in der Ferne.

Zum anderen ein Screenshot aus einem älteren „Animal Crossing“-Spiel. Gesättigte Farben, weiche Kanten und eine charmante CRT-Verpixelung wecken Nostalgie.

Kameraführung und Depth of Field
Die Kamera ist top-down positioniert und bietet eine feste Perspektive. Durch geschickte Einstellungen in den Kameraeigenschaften wird jedoch ein stark atmosphärischer Effekt erzeugt: Nur Mira und ihre unmittelbare Umgebung sind scharf zu sehen. Alles, was zu nah oder zu weit entfernt ist, verschwimmt leicht – vergleichbar mit der Art, wie sich Licht unter Wasser verhält. Dieser Effekt wird über Depth of Field erzielt, insbesondere über die Parameter Sensor Width, Focal Distance und Aperture.




Post Processing und visuelle Effekte
Ein Post Process Volume manipuliert globale Farben und Lichtverhalten. Die Szene ist übersättigt, die Schatten bläulich, die Highlights dagegen violett-rot – das ergibt ein magisch-fremdartiges Farbbild. Zusätzlich ist dem Post Process ein spezielles Post Process Material zugewiesen, das zwei Hauptkomponenten enthält:




1. Farbverläufe & Lichtbrechung
Warme Farbtöne überlagern rhythmisch den unteren Bildbereich, kalte Töne den oberen. Zwei asynchrone Sinuskurven steuern dabei die Bewegung, wodurch der Eindruck entsteht, dass sich das Licht über der Wasseroberfläche ständig verändert. Das Ergebnis ist eine lebendige, sich leicht chaotisch verändernde Szenerie – ganz so, als würde man durch flimmerndes Wasser blicken.

2. Pixelshader & CRT-Effekt
Die visuelle Nostalgie entsteht nicht nur durch Farbauswahl, sondern auch durch gezielte Verfremdung des Bildes. Der eigens erstellte Pixelshader reduziert die Auflösung visuell, während ein nachgebauter CRT-Fragment-Shader den Bildschirm „verformt“, subtile Scanlines erzeugt und RGB-Verschiebungen simuliert.


Der Shader-Code arbeitet mit folgenden Mechanismen:
Horizontale Wellenbewegung erzeugt ein leichtes Flimmern.
Eine Barrel Distortion simuliert die gewölbte Krümmung alter Röhrenmonitore.
Pixel-Jitter lässt die Auflösung unstet erscheinen.
RGB-Verschiebung und Scanlines sorgen für Tiefe und Retrogefühl.
Eine Glitzertextur in hellen Bildbereichen fügt dem Look visuelle Magie hinzu.
Alle Effekte werden auf Luminanzwerte abgestimmt, sodass sie in dunklen Bereichen subtiler bleiben.
Das finale Bild wird durch gezielte Farbkorrektur veredelt: Ein Hauch von Pink, erhöhte Helligkeit und eine traumartige Sättigung schließen den Effekt ab.
Falls Sie sich über scheinbar funktionslose Nodes wie „SceneTexture:PostProcessInput0“ wundern – sie erfüllen einen Zweck: Durch diesen kleinen Trick lassen sich Variablen in den Custom Node „einschleusen“, die dort sonst nicht erreichbar wären.

KI-System – Fischschwarm-Simulation mit Niagara
Grundidee und Zielsetzung
Der zentrale technische Fokus dieser Demo liegt auf der Fisch-KI. Statt klassische Boids-Logik zu verwenden habe ich auf Niagara gesetzt, da Niagara deutlich Effizienter mit den begrenzten Ressourcen umgeht.

Optimiertes Schwarmverhalten
Die Fische wurden in Blender modelliert und in drei Farbvarianten exportiert, die zufällig mit gleicher Wahrscheinlichkeit gespawnt werden. Eine klare Vorwärtsrichtung wurde definiert und beim Import der Ausrichtung angepasst, damit sich die Fische organisch bewegen und nicht rückwärts oder seitwärts treiben.
Ein Ripple-Effekt im Fischmaterial sorgt dafür, dass sich die Fische nicht starr, sondern „schwimmend“ fortbewegen. Dieser Ripple ist an die Weltposition gebunden und verleiht den Bewegungen eine Lebendigkeit, als würde der Fisch wirklich schwimmen.

Zwei Point Attraction Forces innerhalb von Niagara sorgen dafür, dass sich die Fische zwischen zwei Punkten hin- und herbewegen – ein Trick, um sie auch dann lebendig wirken zu lassen, wenn Mira stillsteht oder wenn Fische frei in der Welt platziert werden.
Damit die Illusion nicht gestört wird, wurde auch die Partikelverwaltung angepasst: Die Lebensdauer der Fische wurde verlängert, die Spawnrate begrenzt. Der Schlüssel liegt im Allocation Mode unter „Hanging Particulates“ – dort auf Fixed Count umgestellt, mit einer maximalen Partikelanzahl von 600. So folgen die Fische stabil Mira und wirken nicht wie ständig neu erzeugte Partikel.
Zwei Varianten dieses Systems existieren: Eine Version folgt Mira (mittels Blueprint-Anbindung an den „Fish Target“), die andere kann frei in der Welt platziert werden.
Im Letzten Abschnitt erkläre ich nun genauer wie ich Mira mit den Fischen verbunden habe.
Steuerungssystem & Blueprint-Logik
Controller und Tastatur
In den Project Settings wurden individuelle Inputs für Gamepad und Keyboard definiert. Diese Inputs werden in Variablen gespeichert, in Vektoren zusammengeführt und normalisiert – damit z. B. diagonale Bewegungen nicht schneller sind als gerade Bewegungen. Beim Controller wird außerdem die Intensität des Stickeinschlags durch die „Vector Length“ Node erhalten und berücksichtigt.




Fischkontrolle durch Mira
Die Fische folgen nicht direkt Mira, sondern einem „Fish Target“, der sich um sie herum bewegt. Dieser Punkt wird abhängig vom rechten Stick verschoben. Die Richtung wird durch einen Kamera-basierten Vektor korrigiert (dieser Teil ist noch nicht perfekt, aber funktioniert weitgehend). So entsteht die Illusion, Mira würde den Schwarm gezielt lenken.




Interaktion: Leuchtende Rießenmuschel
Die große Muschel in der Demo beginnt zu leuchten, wenn die Fische sich ihr nähern, oder genauer gesagt wenn der „Fish Target“ nah genug ist. Dafür wurde ein Blueprint verwendet, der globale Parameter wie den Fish Target Location und die Emissive Strength speichern kann (MPC_Emissive).
Diese Variablen können dann praktisch zwischen den jeweiligen Blueprints übergeben werden, und erlauben eine Interaktion zwischen ihnen.

Die Position des „Fish Target“ wird regelmäßig überprüft. Befindet er sich im Radius der Muschel, wird deren Leuchtkraft erhöht. Die Position kann per „Draw Debug Sphere“ visualisiert werden, um die Logik bei Bedarf sichtbar zu machen.
Dazu müssen Sie einfach in Mira_TopDownCharacter am rechten Ende den „Event Tick“, dessen Verbindung sich bis zu „Set Vector Parameter Value“ erstreckt, weiter in den „Draw Debug Sphere“ Node erweitern, dann wird beim Start des Programms die Position von „Fish Target“ sichtbar.

Für die Durchsicht – Zentrale Blueprints
Die wichtigsten Blueprints für eine tiefere Einsicht in das Projekt sind:
Mira_TopDownCharacter
Steuerung & Inputlogik, Verbindung zu Fish Target
M_Pixelate_Post
Der zentrale Post-Process-Material-Shader mit CRT- & Pixel-Effekten
NS_FishSim
Niagara-System mit Fisch-KI & Partikelverhalten
Material_redblue
Eines der 3 Texturmaterialien, alle haben die gleichen Nodes die zu dem Ripple Effekt führen.
MPC_Emissive
Material Parameter Collection zur Übergabe von Variablen
glowing_seashell
Node Logik welche die Rießenmuschel zum leuchten bringt