Capstone Project | Unreal Engine 5.5
Third-Person Roguelite Shooter
Role: Gameplay Designer, Technical Designer
Team Size: 6 (Design and Art)
Duration: 4 Months
Platform: PC (itch.io)
Tools: Unreal Engine 5.5, Perforce, Jira, Confluence, Trello
A third-person roguelite shooter built around persistent progression, clear combat feedback, and interactive environments.
Core gameplay
Players are intended to fight through wave-based combat encounters across interconnected island levels. Clearing encounters opens a portal to the next area, increasing difficulty and combat intensity.
The game focuses on:
Run-based progression that persists beyond failure
Readable combat feedback in a third-person camera
Environmental systems that create exciting combat moments.
Design Pillars
Every Run Matters: Failure contributes to long-term player growth
Accessible Depth: Easy to learn, hard to master!
Systemic Environments: Level elements actively influence combat outcomes.
Systems
I created multiple player-facing and systemic features from design through implementation and iteration.
Persistent Progression and Save Systems
I designed and implemented a persistent save/load system for our roguelike gameplay, enabling player character data and progress to carry over across levels.
This is a crucial system because we had to figure out a way to carry over the player's score and the crystal fragments collected. But more importantly, how to carry over all the upgrades the player has chosen. This was done by having the saving and loading code work in the game instance blueprint, having it take the player data from the player blueprint via data structure.
Although this is more back-end work, I believe it is a great example of how technical skills can be important in design work.
Player stats are recorded in this Struct to be manipulated during the game, and the save system captures this data to be loaded.
This is the Blueprint I implemented in the custom Game Instance that stores player progression between sessions. I integrated the system into our upgrade mechanics, ensuring unlocked abilities and progression persisted after closing the game. While I learned the foundational implementation from a YouTube tutorial, I adapted and integrated it into our project's gameplay systems and tested it to work with our progression flow.
Unlockable Classes
Tank: Survivability-focused with lower mobility.
Mobile/Speed: High mobility speedster with lower durability
I decided to create two classes that are opposed in playstyle. Inspired by RPG disciplines, I made sure to implement buffs and nerfs to specific areas to highlight the strengths of a class.
I have used Struct once again for the default stats of each class to easily plug and change the values of the player stats when they select a Class.
I designed a simple interface that quickly highlights each class’s stats and available options, while also preventing players from choosing classes they haven’t unlocked with the required crystals.
This interface appears when the player approaches the Class Totem. It shows the player what they can look forward to and unlock in the future.
These Blueprints showcases how I scripted a tutorial NPC interaction. This NPC will essentially explain what the Class Selector Totem does and how to unlock them.
In this Blueprint, I created a text array that displays dialogue sequentially by iterating through each index whenever the player interacts with the NPC, similar to the dialogue style in Pokémon games.
A video snippet of showcasing the NPC interaction with the Jira task.
UI and player feedback
Designed and implemented a dynamic player HUD, including:
Ability availability indicators
Dynamic dash gauge
Weapon-responsive crosshair
Solved third-person readability issues by:
Using crosshair state changes to communicate reload timing
Clearly differentiating weapon states without relying on character visuals
Modern shooter games’ solutions heavily inspire the player HUD. The change of crosshair shape when swapping weapon types are taken from games like The Finals and Valorant. Valve’s Deadlock heavily inspires the dash counter and ammo count. I believe this is an excellent way for players to keep track of resources while not diverting their focus to the edges of the display.
This is the overview of the Designer tab of how I managed the player HUD, with each of the elements are binded to variables to be updated on the fly.
This is how I designed the reloading animation in the Widget Blueprint.
Basically, by using Timer by Events, I subtracted the time from when the reload started from the actual game time. That is measured as Elapsed Time. It is then converted into a percentage, where it is set into a radial progress bar that replaces the crosshair.
Another Timer by Event will trigger when the radial reaches 100%, which will then replace back the radial progress bar with the current weapon’s crosshair.
Sound and VFX
Custom Sound Cue Collection
I have sourced Royalty-free sound effects from online libraries, then combined them with custom synth sounds using the Sound Cue system in Unreal.
I believe sound effects are key to interactivity as it help make the game feel alive for the player.
These are some examples of Royalty-free VFX I have sourced form the Fab Market. Customised/edited the particle parameters such as size, color, lifetime, spawn rate, and timing to have consistency and clear communication to the player.
Crystal Explosion
Portal VFX
Environment Interaction
Implemented destructible environmental systems using Chaos Geometry Collections:
Rocks that explode on impact
Designed and implemented reactive crystal systems:
Area-of-effect damage crystals.
Area-of-effect healing crystals.
Designed a pickup mechanic where crystal fragments spawn out of destroyed crystals.
Purple crystal fragments spawn from purple crystals; they are a currency to unlock Classes.
Green crystal fragments spawn from green crystals; they are used as potions to restore health.
My main idea here was to add another way for the player to interact with enemies. I always keep true to design pillars. So, creating the crystals as a level mechanic was a simple addition, yet an effective approach to opening more combat strategies.
I created these crystals using the built-in Modeling Mode in Unreal.
Green Crystal Breakdown
This level mechanic heals the player and nearby enemies. It also drops health potions when destroyed. To create this mechanic, I split it into two blueprints to work alongside the Chaos System. The blueprint with the rocky base handles its health points, and once they reach zero, it spawns the crystal fragments(the pickup) and the other Blueprint, which contains the Geometric Collection.
The partnering Blueprint Actor contains logic for outputting healing or dealing damage(in this case, healing). It also spawns the Geometric Collection, which shatters upon impulse impact. In addition, spawns the exploding Niagara effect.
The purple crystal mechanic is essentially a damaging AOE that affects both player and enemies.
Purple Crystal
Blueprint Actor that handles Niagara Effects and the damage logic.
It spawns a Multi Sphere trace and stores overlapping actors in an array. Then ignores them if the same actor is already in the array. This prevents the actors from getting damaged multiple times.
Playtesting and Iteration
With each playtest, we had to reverify every other system implemented in the game was working properly. When a new mechanic was added that required dependencies from other aspects of the game, we had to carefully test and evaluate before adding it to the final builds of the week to avoid as many problems that might come out to prevent us from further developing and evolving our game.
One of our main concerns was to make sure we reached our intended combat experience as close to what we envisioned in a small amount of time given.
Ensure that each interaction between player and enemy has clear feedback that the player can easily interpret, then have numerous choices to act.
Conducted playtests after:
New mechanics were made
UI updates
Bug fixes
Collaboration
Challenge
Multiple independently developed systems, including combat, buffs, progression, and UI, required reliable referencing in order to have cohesive functionality.
Approach
Held design and technical implementation at the end of sprints
Strictly defined and explained important variables inside blueprints to aid one another when scripting
Used Perforce and Jira to manage merges and reduce conflicts
Debugged Blueprint interactions during system integrations