Cookie Crumble - Screenshot / Key art

Komplexes Projektil System

Genre: Roguelike / Vampire Survivors-like
Engine: Unreal Engine
Jahr: 2025
Solo-Projekt

Kurzbeschreibung

Dieses Projektil-System ist stark von dem Spiel "Noita" inspiriert. Primär war die Implementierung dieses Systems eine Herausforderung für mich selbst, um zu sehen ob ich in der Lage bin etwas derart komplexes vernünftig und sauber zu programmieren. Ziel war es außerdem dass dieses System sehr modular ist und sich möglichst einfach in neue Projekte, z.B. für zukünftige GameJams, einbauen lässt. Dieses Ziel konnte ich erfolgreich erreichen.

Hintergrund

Ich hatte zu diesem Zeitpunkt schon viel Erfahrung in Unreal Engine gesammelt und wollte mein Können auf die Probe stellen. Außerdem bin ich ein großer Fan von dem Spiel "Noita", Ich wollte ein solches Projektil-System schon lange mal nachbauen. Zu der Zeit als ich dieses System bzw. dieses Projekt erstellt habe, war auch "Megabonk" gerade weltweit ein Hit, daher habe ich auch nach der Implementierung des Projektil-Systems angefangen Elemente von "Vampire-Survivors" einzubauen (Gegner in Wellen-Spawnen, EXP -> Level Up -> Projektile upgrade, usw.). Kurz darauf habe ich aber Lust bekommen zu lernen wie Multiplayer in Unreal Engine 5 funktioniert. Daraufhin habe ich dann das Multiplayer Projekt gestartet.

System-Ablauf

  • Der Spieler hat 2 Zeilen mit Zaubern(Projektile, Modifier, Multiplier): Eine Zeile stellt sein Inventar dar, und die andere Zeile stellt die ausgerüsteten Zauber dar. Durch Klicken auf einen Zauber im Inventar, wird dieser ausgerüstet.
  • Zauber_Projektil: Können von Zauber_Modifiern modifiziert werden(z.B. mehr Projektilgeschwindigkeit, größeres Projektil, usw.). Ein Projektil welches geschossen wird mit eigenen Projektil-Geschwindigkeiten und Projektil-Schaden. (Beispiel: Rote kugel fliegt schnell, verursacht wenig Schaden; Blauer Würfel fliegt langsam, verursacht viel Schaden)
  • Zauber_Modifier: Modifiziert den nächsten Zauber_Projektil oder Zauber_Multiplier in der ausgerüsteten Zauber-Zeile nach dem Modifier. Wirkt z.B. schnellere Projektilgeschwindigkeit, größere Projektile, usw.
  • Zauber_Multiplier: Dieser Zauber feuert mehrere Projektile gleichzeitig ab, z.B. feuert ein Zauber_Multiplier_2 die nächsten 2 Projektile auf einmal ab, statt beide nacheinander. Außerdem können Zauber_Multiplier von Zauber_Modifiern modifiziert werden, und den Modifier an alle nachfolgenden Projektile übertragen!
  • Sobald der Spieler schießt, wird das nächste Projektil zum schießen aktuallisiert, indem die ausgerüstete Zauber-Zeile ausgelesen wird. Nach jedem Schuss wird das nächste Zauber_Projektil, bzw. Zauber_Multiplier geschossen, bis die Zeile durch ist und es wieder von vorne beginnt.
Screenshot: Gameplay Übersicht
Screenshot: Level-Layout (übersicht)

Features

Projektile

Pickup: Mouse

Zauber_Projektil: Kugel

Hohe Projektilgeschwindigkeit, geringer Schaden.

Pickup: Cheese

Zauber_Projektil: Würfel

Geringe Projektilgeschwindigkeit, hoher Schaden.

Pickup: Mouse

Zauber_Projektil&Multiplier: Kugel(M)

Dieses Projektil hat einen eingebauten Multiplier und schießt das nächste Projektil von seiner eigenen Position aus ab, wenn es mit etwas(Gegner/Wand) kollidiert.

Modifier

Pickup: Mouse

Zauber_Modifier: Größe

Vergrößert das nächste ausgerüstete Projektil(oder Multiplier).

Pickup: Cheese

Zauber_Modifier: Geschwindigkeit

Erhöht die Projektilgeschwindigkeit des nächsten ausgerüstete Projektils(oder Multipliers).

Rarity: Common

Multiplier

Pickup: Mouse

Zauber_Multiplier: 2

Statt einem Projektil, werden die nächsten 2 Projektile gleichzeitig abgeschossen.

Zauber_Modifiers, die auf Zauber_Multipliers wirken, beeinflussen alle Projektile, die der jeweilige Zauber_Multiplier beinhaltet(als nächstes abfeuert)!
Pickup: Cheese

Zauber_Multiplier: 2(Split)

Statt einem Projektil, werden die nächsten 2 Projektile in einer V-Formation gleichzeitig abgeschossen.

Zauber_Modifiers, die auf Zauber_Multipliers wirken, beeinflussen alle Projektile, die der jeweilige Zauber_Multiplier beinhaltet(als nächstes abfeuert)!
Pickup: Mouse

Zauber_Multiplier: 3

Statt einem Projektil, werden die nächsten 3 Projektile gleichzeitig abgeschossen.

Zauber_Modifiers, die auf Zauber_Multipliers wirken, beeinflussen alle Projektile, die der jeweilige Zauber_Multiplier beinhaltet(als nächstes abfeuert)!
Pickup: Cheese

Zauber_Multiplier: 3(Split)

Statt einem Projektil, werden die nächsten 3 Projektile in einer V-Formation(ein Projektil in der Mitte, zwischen den beiden anderen Projektilen) gleichzeitig abgeschossen.

Zauber_Modifiers, die auf Zauber_Multipliers wirken, beeinflussen alle Projektile, die der jeweilige Zauber_Multiplier beinhaltet(als nächstes abfeuert)!

Setup-Beispiele

Pickup: Mouse

Nur Zauber_Projektil: Kugel

Feuert ein schnelles Projektil mit wenig Schaden

Pickup: Cheese

Zauber_Multiplier: 2(S) + 2x Zauber_Projektil: Kugel

Feuert 2 Projektile gleichzeitig in einer V-Formation ab.

Pickup: Mouse

Zauber_Projektil+Multiplier: Kugel(M) + Zauber_Projektil: Kugel

Sobald das erste Projektil (Zauber_Projektil+Multiplier: Kugel(M)) einen Gegner trifft, verschießt es von seiner Position aus das nächste Projektil (Zauber_Projektil: Kugel).

Rarity: Common · Collected: 0/5
Pickup: Cheese

Zauber_Projektil&Multiplier: Kugel(M) + Zauber_Multiplier: 3(Split) + 2xZauber_Projektil: Kugel + 1x Zauber_Projektil: Würfel

Sobald das erste Projektil (Zauber_Projektil&Multiplier: Kugel(M)) einen Gegner trifft, feuert es von seiner Position die nächsten 3 Projektile gesplittet ab.

Technische Details

  • Engine: Unreal Engine
  • Source Control: GitHub.
  • Solo-Projekt

Herausforderung → Lösungsweg

  • Herausforderung: Die größte Herausforderung war dafür zu sorgen, dass sich alle Zauber genau so verhalten wie sie es tun während ich alles möglichst dynamisch und in Komponenten gestalte.
  • ->Lösung: Statt Variablen und Funktionen auf den Spieler zu legen habe ich stattdessen größten Teils Data Assets, Komponenten und Interfaces verwendet. Dies ermöglicht mir das vollständige System sehr einfach in neue Projekte zu übertragen, ohne großartig etwas ändern zu müssen, außer der Schuss-Richtung in die geschossen werden soll, und den Schuss-Input zu erstellen.

Learnings

  • Die "Data Asset"-Klasse kann sehr dynamisch eingesetzt werden.
  • Funktionen in Komponenten zu legen ermöglicht mir die gewünschte Logik einfach auf neue Objekte übertragen zu können.

← Zurück zum Portfolio