Five More Minutes - UE5.5 - Blueprints - Lead Programmer - Lead Designer thumbnail

Five More Minutes

UE5.5 Blueprints Lead Programmer Lead Designer

Five More Minutes

UE5.5 Blueprints Programador Principal Diseñador Principal

About

Five More Minutes is a time-attack action platformer built in Unreal Engine 5. As the Lead Programmer/Designer on a 4-person team over 9 months, I built the core locomotion, a gravity-defying boss AI, seamless portal rendering, UI menus, and surface-specific footstep audio.

Project Info

  • Role: Lead Systems & Gameplay Programmer/Designer
  • Team Size: 4
  • Engine: Unreal Engine 5.5

Acerca de

Five More Minutes es un juego de plataformas de acción contrarreloj desarrollado en Unreal Engine 5. Como Programador/Diseñador Principal en un equipo de 4 personas durante 9 meses, construí la locomoción central, una IA de jefe que desafía la gravedad, renderizado de portales sin interrupciones, menús de interfaz de usuario y audio de pisadas específico para cada superficie.

Información

  • Rol: Programador/Diseñador Principal de Sistemas y Jugabilidad
  • Equipo: 4
  • Motor: Unreal Engine 5.5

Introduction

The core goal was to build a fast, momentum-driven platformer where every system, including movement, combat, and collectibles, feeds into one tight loop. I was responsible for the 3C's (Character, Camera, Controls) and most of the game's major systems.


State-Driven Locomotion & Pickups

Everything runs through an enum-based state machine (E_States) that prevents conflicting physics between dashing, sliding, and aerial movement. The sliding system uses FindCurrentFloorAngleAndDirection to read the slope angle and accelerate the player downhill accordingly.

I also built magnetic collectibles (BP_Coin, BP_Multiplier) that detect the player via sphere collision and smoothly interpolate toward them with VInterp To, so picking up items never interrupts your momentum.

Locomotion chaining: transitioning into a slide

Locomotion chain: wall-running, air-dashing, and slide physics.

WallRunRotation: Calculates camera tilt relative to the wall normal to emphasize momentum.

AirDash: Applies a directional impulse to correct the player's trajectory mid-air.

SetSlideVariables: Configures friction and slope acceleration based on the surface's physics material.


Momentum-Based Grappling

Most grappling hooks just teleport you, but ours is a momentum tool. Players use it to gain height and speed, then chain the launch into an air-dash or a sloped slide.

The system validates targets with a double-raycast (GetGrappleTargetInfo) for line-of-sight and clearance, then calculates launch impulse from the distance and elevation delta. A BP_Cable spline component renders the rope in real-time.

Momentum-based grappling hook launch

Momentum Grappling: grappling to anchors to launch into air dashes.

CalculateGrappleTargetLocation: Double-raycast validation with launch impulse scaled by elevation delta.


Custom AI: The Spider Boss

A ground-based boss would be trivial to outrun in a game with this much vertical mobility. To prevent this, the Spider Boss uses the same 3D space as the player, crawling on walls and ceilings to turn the arena into a true spatial cat-and-mouse fight.

It's driven by a custom Behavior Tree (BT_Spider) and Blackboard (BB_Spider). The key piece is BTTask_JumpStick: it reads collision surface normals to launch the spider onto walls/ceilings and uses a rotation matrix to align its mesh to the new gravity axis. For ranged attacks, BTTask_RangedAttack fires sweeping multi-line raycasts through BP_Laser.

Spider Boss combat gameplay

Spider-Boss Combat: navigating vertical arenas while avoiding laser sweeps.

BTTask_JumpStick: Reads collision normals to launch the boss onto walls and ceilings, then aligns its mesh to the new surface.


Design Iteration: The Seamless Portal Shop

Early on, the plan was to keep the player fully immersed by making sure that killing certain enemies would spawn a portal into a separate shop dimension for upgrades. I built the full system: oblique clip-plane rendering via SceneCaptureComponent2D, momentum-preserving teleportation using dot products, and a modular shop built on BPI_Interactable_C interfaces.

It worked, but playtesting showed it broke the game's pacing. We pivoted to a faster mid-level elevator upgrade system instead, which served as a good lesson in knowing when to cut a feature.

Seamless visual portal loop

Seamless Portal: spatial transitions between environments.

SetClipPlanes: Defines an oblique near-clip plane on the SceneCaptureComponent using the portal's forward vector.


Polish: UI/UX & Dynamic Audio

Beyond the core systems, I built the game's UI framework and audio pipeline to make it feel like a finished product.

  • UI Framework: Built most of the widget hierarchy (WBP_Menu, WBP_BossHP, WBP_UpgradeScreen, WBP_Tutorial) with full keyboard and gamepad navigation.
  • Footstep Audio (FootstepAnimNotify): A custom AnimNotify that line-traces from the foot bone on each step. Based on the physical material hit (grass, metal, stone), it plays from a bank of 5 pitch/volume-modulated Sound Cue variants to avoid repetition.
  • External Plugins: Integrated AsyncLoadingScreen for hitchless level streaming and EpicLeaderboard for live score uploads.
Main Menu to Settings transition flow

UI Flow: transitioning between Main Menu and Settings submenus.

What I Learned

Building Five More Minutes was a massive learning experience in leadership, scope management, and technical communication. Working with a team newer to game development meant I had to learn how to effectively communicate technical constraints and steer design meetings away from impossible features toward achievable, fun mechanics.

To meet tight alpha and beta milestone deadlines, I had to wear almost every hat possible within Unreal Engine. Beyond engineering the core physics and AI, I took on the responsibility of reviewing, debugging, and integrating my teammates' work to ensure everything met strict delivery standards. It taught me that shipping a game isn't just about writing good code; it's about maintaining a clear vision, managing team capabilities, and taking ownership of the project's overall quality from start to finish.

Introducción

El objetivo principal era construir un juego de plataformas rápido y basado en el impulso, donde cada sistema (movimiento, combate, coleccionables) se integrara en un bucle cohesivo. Fui responsable de las 3C (Personaje, Cámara, Controles) y de la mayoría de los sistemas principales del juego.


Locomoción Basada en Estados y Pickups

Todo funciona a través de una máquina de estados basada en enumeradores (E_States) que evita conflictos de física entre el dash, el deslizamiento y el movimiento aéreo. El sistema de deslizamiento utiliza FindCurrentFloorAngleAndDirection para leer el ángulo de la pendiente y acelerar al jugador cuesta abajo en consecuencia.

También construí coleccionables magnéticos (BP_Coin, BP_Multiplier) que detectan al jugador mediante una colisión esférica y se interpolan suavemente hacia él con VInterp To, de modo que recoger objetos nunca interrumpe tu impulso.

Locomotion chaining: transitioning into a slide

Cadena de locomoción: correr por la pared, dash aéreo y física de deslizamiento.

WallRunRotation: Calcula la inclinación de la cámara en relación con la normal de la pared para enfatizar el impulso.

AirDash: Aplica un impulso direccional para corregir la trayectoria del jugador en el aire.

SetSlideVariables: Configura la fricción y la aceleración en pendiente basándose en el material físico de la superficie.


Gancho de Agarre Basado en Impulso

La mayoría de los ganchos de agarre simplemente te teletransportan. El nuestro es una herramienta de impulso: los jugadores lo usan para ganar altura y velocidad, y luego encadenan el lanzamiento en un dash aéreo o un deslizamiento por pendiente.

El sistema valida los objetivos con un doble raycast (GetGrappleTargetInfo) para la línea de visión y el espacio libre, luego calcula el impulso de lanzamiento a partir de la distancia y el delta de elevación. Un componente spline BP_Cable renderiza la cuerda en tiempo real.

Momentum-based grappling hook launch

Gancho de Agarre de Impulso: agarrarse a anclajes para lanzarse en dashes aéreos.

CalculateGrappleTargetLocation: Validación con doble raycast con impulso de lanzamiento escalado por el delta de elevación.


IA Personalizada: El Jefe Araña

Un jefe terrestre sería trivial de superar en un juego con tanta movilidad vertical. El Jefe Araña utiliza el mismo espacio 3D que el jugador: se arrastra por paredes y techos, convirtiendo la arena en una verdadera lucha espacial del gato y el ratón.

Está impulsado por un Árbol de Comportamiento (BT_Spider) y un Pizarra (BB_Spider) personalizados. La pieza clave es BTTask_JumpStick: lee las normales de la superficie de colisión para lanzar a la araña a paredes/techos y utiliza una matriz de rotación para alinear su malla con el nuevo eje de gravedad. Para ataques a distancia, BTTask_RangedAttack dispara raycasts multi-línea a través de BP_Laser.

Spider Boss combat gameplay

Combate contra el Jefe Araña: navegando arenas verticales mientras se evitan los barridos láser.

BTTask_JumpStick: Lee las normales de colisión para lanzar al jefe a paredes y techos, luego alinea su malla con la nueva superficie.


Iteración de Diseño: La Tienda de Portales Sin Fisuras

Al principio, el plan era mantener al jugador completamente inmerso: matar a ciertos enemigos generaría un portal a una dimensión de tienda separada para mejoras. Construí el sistema completo: renderizado de plano de recorte oblicuo a través de SceneCaptureComponent2D, teletransportación que conserva el impulso utilizando productos escalares, y una tienda modular construida sobre interfaces BPI_Interactable_C.

Funcionó, pero las pruebas de juego demostraron que rompía el ritmo del juego. En su lugar, pivotamos a un sistema de mejora de elevador más rápido a mitad de nivel, lo cual fue una buena lección sobre cuándo es necesario eliminar una característica.

Seamless visual portal loop

Portal Sin Fisuras: transiciones espaciales entre entornos.

SetClipPlanes: Define un plano de recorte cercano oblicuo en el SceneCaptureComponent usando el vector frontal del portal.


Pulido: UI/UX y Audio Dinámico

Más allá de los sistemas centrales, construí el framework de interfaz de usuario y la pipeline de audio del juego para que se sintiera como un producto terminado.

  • Framework de UI: Construí la mayor parte de la jerarquía de widgets (WBP_Menu, WBP_BossHP, WBP_UpgradeScreen, WBP_Tutorial) con navegación completa por teclado y gamepad.
  • Audio de Pisadas (FootstepAnimNotify): Un AnimNotify personalizado que realiza un line-trace desde el hueso del pie en cada paso. Basándose en el material físico impactado (hierba, metal, piedra), reproduce una de 5 variantes de Sound Cue moduladas en tono/volumen para evitar la repetición.
  • Plugins Externos: Integré AsyncLoadingScreen para la carga de niveles sin interrupciones y EpicLeaderboard para la subida de puntuaciones en vivo.
Main Menu to Settings transition flow

Flujo de UI: transición entre el Menú Principal y los submenús de Ajustes.

Lo que Aprendí

Desarrollar Five More Minutes fue una gran experiencia de aprendizaje en liderazgo, gestión de alcance y comunicación técnica. Trabajar con un equipo con menos experiencia en el desarrollo de juegos significó que tuve que aprender a comunicar eficazmente las limitaciones técnicas y a orientar las reuniones de diseño lejos de características imposibles hacia mecánicas divertidas y viables.

Para cumplir con los ajustados plazos de las fases alfa y beta, tuve que asumir casi todos los roles posibles dentro de Unreal Engine. Más allá de programar las físicas centrales y la IA, asumí la responsabilidad de revisar, hacer debugging, e integrar el trabajo de mis compañeros para asegurar que todo cumpliera con los estrictos estándares de entrega. Me enseñó que lanzar un juego no se trata solo de escribir buen código; se trata de mantener una visión clara, gestionar las capacidades del equipo y asumir la responsabilidad de la calidad general del proyecto de principio a fin.

Built with 11ty + Decap CMS