A full gameplay walkthrough of my College Final Major Project (2023), demonstrating the procedural room generation, persistent game loop, and 360° combat system. This demo highlights the randomized power-up mechanics and enemy AI within the custom Unity character controller.
This project, despite being my first time creating a full game experience, was full of ambition. The game took the form of a 2D platformer roguelike, and served as my Final Major Project for the Games Development Course at Gateshead College (2023). This project was chosen to answer the question "How to create an enjoyable platforming game that takes elements from the roguelike genre?".
The game's design was heavily inspired by other roguelike icons, such as: The Binding of Isaac, Spelunky, and Dead Cells. The core gameplay loop involved the player navigating a series of randomly selected rooms, with the goal being to clear as many as possible without dying, to achieve a highscore.
Random Room Generation: An array is used to hold all the pre-designed rooms, randomly selecting one when the player collides with the door.
A Don't Destroy on Load Script was used to ensure the player and their stats persisted between rooms.
Randomised Item & Powerup System: Created a variety of different powerups, such as: Health Up, Speed Up, Jump Up (increases mid-air jump count), ammo pickups, and bat repellent.
Dynamic Spawning: Created an Item Spawner, that when triggered would instantiate a random powerup from the "Resources" folder.
Player & Combat System: A robust character controller for platforming, including standard movement, variable-count jumping, and ranged combat.
360° Ranged Combat: A shooting system where the player can aim in a 360° radius around the player using mouse movement.
Diverse Enemies & Hazards: Created multiple enemy types to populate the various rooms.
Enemies: Created two enemy types, a snake which would patrol the length of a platform, and a bat which when disturbed (trigger collided) would chase the player.
Hazards: Created two types of hazard, spikes which upon collision would cause instant death. As well as dart traps, these used raycasting to detect and fire at the player.
UI: Displayed the current player health, ammo count, and the current score on the UI.
Game Loop: Created the complete game experience with successful game looping on death, through the use of a replay button on the death screen.
Scoring: A room-counter was incremented upon the entry to a new room, acting as a highscore-counter. This was saved in PlayerPrefs, so progress wasn't lost on closure.
Language: C#
Engine: Unity
Core Concepts: Randomisation, Data Persistence (PlayerPrefs), Physics (Raycasting, Triggers), UI Systems (Health, Score)
IDE: Visual Studio
Tools: GitHub
This project was a defining moment in my education, providing valuable insight into what I should be pushing for in my education and fuelling my passion for the research aspect of games development.
This project was initially hindered by my participation in the Turing Scheme (an educational trip to Germany detailed in my "About Me") which caused me to join the project a week late. This led to a fundamental misunderstanding of the project's requirements due to missing its introduction; nonetheless this only hammered home the importance of fully understanding a brief—a lesson that proved vital.
The Research Question & Purpose: When beginning this project, I went in with the interpretation that we were just being asked to create a game in ten weeks, completely neglecting the research aspect. Due to my at-the-time infatuation with the roguelike genre, that's what I focused on, retrofitting a question to work with it later. In hindsight, I believe this was the project's core issue and a missed opportunity to learn something more valuable and new. This lesson served to inform me and reshape my outlook on further education, pushing me to do what I need to learn—rather than just what I want to make.
Scoping: Throughout college, we were always asked to create something specific, following a curriculum to ensure learning. This was the first time we were truly let loose. Because of this, I immediately had grandiose ideas and designs I hoped to implement, failing to recognise the short deadline and scale of the task. Attempting to create a roguelike on par with games like The Binding of Isaac in merely ten weeks was ludicrous; ignoring the hundreds of items and rooms present in such games, the mechanics alone would likely take longer. This taught me to be mindful of quality over quantity, a lesson I've since taken with me into my future projects.
Architectural Pivot: On a technical level, I struggled with how to implement the random room traversal. When first tackling this problem, I thought—due to a lack of research—that spawning in the rooms as prefabs would be best. But this led to complexity: how would I align it with the previous room? When should I load it? How should the camera transition? I eventually landed on having each room present in its own scene—a much simpler and logical solution that would've been found way sooner if I had spent time researching beforehand instead of immediately jumping in.
Ultimately, the single biggest lesson from this project was the vital role of planning and research in technical success. My initial failure to research, combined with the lack of early planning, proved that a strong foundation is the crux to a final project actually succeeding.
For a more in-depth look into the challenges presented by this project, you can check out the Reflective Journal on my development blog.