Dreamscape Runners
Introduction
Summary
Dreamscape Runners is a fast-paced 2D speed-running platformer where players race against the clock—or each other—through challenging, dream-like landscapes. The goal is to beat your best time or compete head-to-head with another player to reach the finish line. Along the way, players can collect and strategically use a variety of power-ups, such as speed boosts, and gravity-defying abilities, to gain the upper hand.
Project Details
- Engine: Unity
- Platform: Windows PC
- Developed over 5 months
- Role: Project Lead, Game Producer, Game Designer, Gameplay Programmer, System Programmer, Sound Designer
Pre-Production
Creating Initial Design Document
In the preproduction phase, I began by meeting with my team to discuss our vision for the game. Following this initial brainstorming session, I took the lead in creating the first iteration of the Game Design Document (GDD). This document outlined key elements such as design goals, design pillars, the game hook, and user stories. Once the document was drafted, I presented it to the team for feedback and revisions. Given that this was my first project where I wasn't managing every task directly, it was essential for me to ensure that the document was clear and detailed. I wanted to make sure the lead developer fully understood the vision and requirements, so we could stay aligned throughout the development process.
Complete Competitive Analysis
To refine our design and gain insight into the existing landscape, I conducted several competitive analyses of different games. Specifically, I analyzed three titles: the original Mario Bros., BattleBlock Theater, and SpeedRunners.
The analysis of SpeedRunners was the most pivotal, as its mechanics closely aligned with the concepts we were exploring. In this 2D platformer, players race against each other, utilizing various power-ups to outpace their opponents. During each analysis, I played through the game, breaking down its core mechanics and features. I documented the dynamics that players might encounter and how these could impact gameplay experiences. I also compared the game to similar titles and highlighted design insights that could inform our own project.
Gameplay
Handful of Power-Ups
I implemented a diverse range of power-ups that players can use to gain an edge over enemies or other players. These include one-time use items, such as grenades that can damage enemies or alter the environment, and reusable abilities like the Freeze power-up, which immobilizes both enemies and players. Balancing these power-ups was essential, with each designed to offer distinct advantages and trade-offs. For example, the Balloon power-up boosts jump height and reduces fall speed, but at the cost of slower movement. Despite challenges integrating power-ups into multiplayer, ensuring their balance was crucial to delivering a fun, fair, and engaging gameplay experience.
Speedrun Timer
To track player performance, I developed a speedrun timer that records each player's best time. The primary challenge was ensuring each player had an individual timer, particularly in multiplayer mode, so we could show personalized times at the end of the race. Once this was resolved, I implemented a system where the player's time is saved and displayed on the post-race screen as soon as they cross the finish line.
Hazards
The levels feature a variety of hazards designed to challenge the player and impede their progress. For the early levels, I introduced simple hazards like spikes, which damage the player upon contact. If the player has a power-up, they can survive the spikes but will lose the power-up in the process. Another hazard introduced in these levels is the pit. Unlike the spikes, falling into a pit results in an instant defeat, regardless of whether the player has a power-up.
Multiplayer
Overview
A key design goal for this project was to incorporate multiplayer gameplay. Since this was a learning project, I focused on implementing local multiplayer to keep the scope manageable.
Using Unity's input system, I enabled the second player to join the game by pressing a button on their controller before selecting a level. Once both players are in the game, Player 1 uses the keyboard, while Player 2 controls their character with a controller, and both players spawn into the game together.
Learning Lessons
When I first started the project, I focused on designing and programming it for single-player, with the plan to add multiplayer later in development. One of the biggest challenges I faced with this approach was hard-coding many elements, such as enemy detection and power-up pickups, to a specific player. This caused significant issues when I added the second player: enemies either failed to detect the second player, and power-ups completely malfunctioned.
To resolve this, I had to refactor much of the code responsible for player detection. Instead of targeting specific game objects, I modified the system so that enemies and power-ups would detect players by their tags. This change ensured that both enemies and power-ups could function properly, regardless of which player interacted with them.
AI Enemies
Overview
For this project, I implemented two types of enemies, each with distinct behaviors. When a player is detected, the enemies will perform their programmed actions until either they are defeated or lose sight of the player.
Player Detection
For this project, I implemented two types of enemies, each with unique behaviors. When a player is detected, the enemies will execute their programmed actions until they are either defeated or lose sight of the player.
If an enemy loses detection of the player, it returns to its idle state. The slime enemy moves back and forth, waiting for another player to enter its detection range. Meanwhile, the cannon enemy stops shooting until a player re-enters its range.
Enemy Interactions
The enemies in the game have various interactions with the player. The slime enemy moves towards the player, damaging them on contact before destroying itself. However, if the player has a power-up, they can use it to interact with the slime in different ways. For example, using the Freeze power-up will freeze the slime, causing it to stop moving for a few seconds, while throwing a grenade at the slime will destroy it.
The cannon enemy behaves similarly. When it detects the player, it continuously shoots at them. If the player uses the Freeze power-up, the cannon will stop shooting until it is unfrozen. Using a grenade will destroy the cannon, just like with the slime.
Closing Thoughts
This project was my first after graduating from Full Sail University, and I aimed to apply everything I had learned throughout my degree. It was an incredibly valuable learning experience from both a design and programming perspective. While I’m not entirely satisfied with the art, as it didn’t align with my initial vision—especially given that I didn’t have an artist on the team and had to rely on internet resources—I’m proud of what we accomplished in terms of gameplay and design. The original concept was much smaller and less engaging, but through iteration, we created a more enjoyable experience.
In conclusion, this project taught me a great deal about design, project management, and programming. I’m excited to apply these lessons to my current project and continue growing as a designer.