Soren Gerlach

Project Mercury

Team Mercury

— PROJECT NAME

Project Mercury


— ROLE

Producer & Gameplay/UI Programmer


— TEAM SIZE

14


— TIME FRAME

5 Months


Play the Game Here

Project Mercury is a movement based FPS game focused on making the player feel like an action star as they fight their way through the futuristic skylines of 2093.


Our overarching goal is to deliver a fast-paced, adrenaline-fueled experience reminiscent of titles like Mirror’s Edge, Titanfall 2, or Ghostrunner. We aim for players to embody the essence of action movie protagonists like John Wick, capable super soldiers, or simply, total badasses. Utilizing a cyberpunk aesthetic and future Detroit setting (Blade Runner feel), we'll emphasize advanced movement mechanics, shooting, and engaging enemy encounters.

Project Mercury Trailer (all gameplay was captured from our release build)

Major Contributions

For this project, I led a team of 14 students to successfully develop Project Mercury, an advanced movement-based shooter, within a tight five-month timeline. In addition to serving as the project director, I was a primary contributor to UI and gameplay programming. My key contributions included designing and implementing all HUD, world-space, and menu UI elements, as well as developing the checkpoint system, enemy spawners, and a variety of interactive environmental objects.

Programming Responsibilities

Input Mapping

Our goal for this project was to achieve a AAA-quality experience, which required the UI functionality to meet industry standards. One critical feature in this pursuit was customizable control settings—a staple of major studios but notoriously challenging to implement due to limited documentation. To address this, I developed keybinding widgets, assigned their key values, and implemented robust logic to handle dynamic key remapping via key selectors.

Create Keybinding Widgets

Get the keys in the current input map and create the keybinding widgets from those keys.

Set the key selectors key and its text

Take the current key’s mapping data and use it to get its display name and key value and assign them to the key selector.

Get all active keys

Get all of the active keys so you can check if this key is already in use.

Change the input key

Take the input key and if its not already in use change the key for the mapping data’s action in the input settings.

Checkpoints

Since we were designing a single-player experience, implementing a robust checkpoint system was essential to provide players with a sense of tangible progress throughout the level. This system tracked the checkpoints the player reached, allowing them to reload or return to a checkpoint upon death. Additionally, players could select any unlocked checkpoint to start the level from.

A significant advantage of this system was its flexibility in handling object spawning, such as enemies, weapons, and environmental elements. These objects would dynamically appear or respawn as players reached or returned to specific checkpoints. This not only enhanced gameplay but also optimized performance by preventing the need to run 30+ AI processes concurrently.

Checkpoint logic

The system efficiently respawns the player at the checkpoint location with the correct rotation. It also cleans up any leftover weapons and health items, ensuring a seamless reset of the environment by respawning enemies, weapons, and drones.

Enemy Spawner Logic

The system utilizes a publicly assigned enemy class to spawn an actor dynamically. Based on the enemy's class, appropriate values are assigned to ensure functionality—for example, assigning a patrol route to assault-type enemies.

Environmental Drones/Cars

To bring the city to life and enhance its atmosphere, the team decided to incorporate flying drones and cars into the environment. Although this feature was added late in development, I implemented a simple yet effective spline-based movement system. This solution provided designers with the flexibility to create custom paths for the drones and cars, as well as adjust their speed, lighting, and looping behavior, making it both versatile and efficient.

Spline following

This system is utilized for both drones and flying cars, operating in a similar manner. The objects travel along a spline by calculating their position based on time, multiplied by their assigned speed value, and adding their current distance along the spline. Their transform is then updated to match this position. Upon reaching the end of the spline, the objects are either destroyed or set to loop seamlessly.

Car spawning

This function handles the spawning of cars by selecting randomly from an array of potential car blueprints. The selected car is assigned the spawner's transform values and spline path for movement. At the start of the game, groups of three cars are spawned with a slight delay, achieved using a custom for-loop delay macro. Each car autonomously destroys itself and spawns a new car upon reaching the end of its path, ensuring a continuous and dynamic flow.

HUD

An FPS game demands a robust suite of HUD UI elements, including a health bar, damage indicators, ammo count, weapon and grenade visuals, and ability meters. I was responsible for designing and implementing all these features. Among the HUD elements I developed, the most advanced and intricate work is showcased below.

Ammo/Weapon Display

While not overly complex, this system serves as a strong example of the approach I used for most HUD elements. I retrieved a reference to an object and utilized it to populate the widget’s display values. Specifically, in this instance, I referenced the weapon the player was currently holding and dynamically updated the displayed ammo count and weapon information to reflect the player’s current loadout.

UI color shift

To effectively communicate the player’s health status, we designed the helmet HUD to transition from its initial teal color to red as the player took damage. This created an unavoidable visual cue, ensuring the player was always aware of their health. To achieve this, I bound each HUD element’s color and opacity to a linear color variable (healthColor) within the player blueprint. The healthColor dynamically shifted toward red as the player lost health and returned toward teal as health was regained, with the transition scale directly linked to the amount of damage taken or health restored.

Damage Effect

To ensure players are clearly notified when they take damage, I implemented a dedicated damage effect widget. While the HUD color shift provides a general indicator of health, this widget adds a more immediate and impactful visual cue. Designed to resemble a blood splatter, the widget spawns and plays an animation each time the player takes damage, similar to the feedback systems seen in AAA titles like Call of Duty.

Weapon Pickup

To facilitate weapon pickups, I created a UI element that appears when the player is near a weapon lying on the ground. While displaying the UI itself was straightforward, the challenge lay in dynamically showing the keybind for picking up the weapon. To achieve this, I accessed the input settings mapping data, iterated through it to find the action associated with picking up items, retrieved the corresponding keybind, and integrated it into the display text alongside the weapon’s name. This ensured a seamless and intuitive experience for players.

Production Responsibilities

Production

As the Producer and Design Lead for this project, I was responsible for coordinating cross-disciplinary communication, delegating high-level tasks, ensuring the team met sprint deadlines, delivering project-wide announcements, and effectively managing scope to keep the development on track.

Task Management

I was responsible for managing tasks for both the design and programming teams. Initially, we utilized Jira, an excellent tool for agile task management; however, due to its cost, we transitioned to a custom spreadsheet solution better suited for a semester-long project. This spreadsheet allowed team members to log their tasks, assign ownership, set priorities, establish due dates, and track completion status. This approach proved highly effective in maintaining an overview of the team’s progress and setting realistic deadlines.

Communication

As mentioned earlier, I was responsible for ensuring clear communication and keeping the team aligned. Each week, I sent updates like the example above to discuss the project’s status, highlight any changes, and outline the next steps. Additionally, I facilitated cross-team communication by connecting team members to resolve issues, keeping everyone focused, and ensuring all contributions were seamlessly integrated into the project.

Git Repo Management

As a producer and programmer, I frequently managed the Git repository, which involved resolving merge conflicts in VS Code, repairing corrupted files, and checking out specific commits to identify and address errors.

Decision Making/Scope Management

Creating and managing a project’s scope is a significant challenge, and this semester taught me just how demanding it can be. Our original goal was to develop a single high-quality, AAA-style level, and we successfully achieved that. While the overarching scope remained consistent, we had to make difficult decisions along the way, such as cutting features like a boss encounter and adjusting gameplay design. These choices were necessary to keep the project within scope and ensure the team’s well-being, requiring careful prioritization and thoughtful leadership on my part.

Conclusion

Production

+ Programming

Taking on the dual roles of producer and programmer presented significant challenges, chief among them being time management. Balancing both responsibilities on top of class work and my job required me to dedicate an extraordinary amount of time and effort (18+ hours) each week. This necessitated meticulous planning, efficient use of my time, and a structured approach to ensure I could contribute meaningfully to both roles. While demanding, it provided me with invaluable experience in Unreal Engine 5 programming and the opportunity to lead our team to success.

A related challenge was maintaining the high-quality standards I set for our team across both roles. To address this, I adopted a prioritization strategy: focusing on critical production tasks that impacted the entire team before turning my attention to high-priority programming tasks I assigned myself. My adept programming team helped me greatly as they were able to effectively and consistently get their work in on time. This approach ensured that my contributions in both areas remained effective without compromising the project’s overall quality.

Perhaps the most significant challenge, however, stemmed from a lack of comprehensive knowledge about other disciplines within game development. As a producer, understanding the pipelines and workflows of every team member is crucial to setting realistic sprint goals, facilitating workflows, and communicating effectively. My technical design and programming background initially left me less familiar with the art pipeline, which led to inefficiencies early in the project. However, with the support of my team leads, I quickly gained the necessary knowledge (around 3 weeks) to set more informed goals, streamline workflows, and enhance communication with our art team. These challenges ultimately enhanced my time management, prioritization, and interdisciplinary collaboration skills, preparing me to excel in future projects requiring multifaceted roles. I’m incredibly proud of our team—five months ago, we began with minimal Unreal Engine experience, and together, we created a fully playable level that makes full use of the engine’s capabilities.


Key Learning/Takeaways

Time Management and Prioritization

Balancing dual roles as producer and programmer taught me how to strategically allocate time and prioritize tasks to ensure both team goals and personal deliverables were met without compromising quality.

Collaboration and Leadership

  • Leading a diverse team emphasized the importance of clear communication, delegation, and fostering a collaborative environment, helping me grow as a leader while achieving shared success.

Technical Growth in Unreal Engine

  • This project allowed me to significantly expand my Unreal Engine 5 programming skills, from creating UI and gameplay mechanics to implementing complex systems like key customization.

Adaptability and Interdisciplinary Understanding

Working with artists, programmers, and designers taught me the importance of understanding different pipelines and workflows, enabling me to adapt quickly and effectively contribute to team planning and execution.