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. The primary game loop replaces traditional player health with a 5-minute timer: taking damage subtracts time, while collecting pickups adds time. 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 implemented "coyote time" via raycast ground detection to ensure forgiving, fluid platforming, and programmed directional air dashes triggered by double-tapping movement keys.

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.


The Glove Combat System

I built the entire combat system from scratch: a pair of floating boxing gloves that orbit the player and attack autonomously. The core is BP_GloveBase, a parent class inherited by BP_GloveElectric, BP_GloveSpeed, and BP_GloveVamp, each with their own special attack and unique behavior.

Gloves floating and player grabbing a new one

Hover & Collection: The player grabs an additional glove, adding it to the array. Idle gloves orbit and smoothly reorient toward the camera.

Glove Combat and Hitstop

Combat & Hitstop: Alternating light punches, a heavy charged attack, and the subtle global time dilation effects that emphasize each impact.

Hover and Follow Behavior

The player can pick up additional gloves scattered throughout the level, which are automatically added to the array of gloves orbiting around them.

Each glove has a SphereComponent called AssignedHome that acts as its orbit point. A DistanceCheck custom event fires every 3 seconds via Set Timer by Event; if the glove drifts more than 370 units from its home while not attacking, InstantReturnGloves instantly teleports it back by zeroing its physics velocity. When idle with no target, the glove smoothly rotates toward the camera using Slerp (Quat) interpolation with Alpha = 30.0 * DeltaSeconds, giving it an organic, living feel.

Punching and Targeting

Light attacks alternate between left and right gloves via an IsLeftPunchNext boolean on BP_ThirdPersonCharacter. When attacking, the glove disables its physics, switches its collision type to ECC_Destructible, and a Timeline lerps it from its current position to the target's location. A Do Once node on OnComponentBeginOverlap guarantees damage fires exactly once per swing before the glove returns. On return, physics re-enables and collision resets.

For targeting, the character maintains a DetectedEnemies array, a ClosestEnemy reference, and a CurrentTarget, with two distinct modes: TargetLocked (hard lock) and TargetSoftLocked (soft lock). When locked on, the glove recalculates Find Look at Rotation with a -90 degree pitch correction every tick to always aim directly at the enemy.

LightAttack: Disables physics, switches collision, fires the strike Timeline, and applies damage through a Do Once.

Charged Heavy Attack

Holding the heavy attack input sets ChargingHeavyAttack? on the character and reduces MaxWalkSpeed by a HeavyChargeSlowFactor multiplier to simulate the effort of winding up. On release, the glove launches toward a LungeSpot and the character gets a forward HeavyAttackLungeForce impulse. To prevent a single enemy from being hit multiple times during the swing arc, there's a ChargeAlreadyHitEnemies array that clears at the start of each heavy attack and fills up with Add Unique on each collision, with a pre-check so no enemy takes damage twice.

Special Attacks and Visual Cooldown

Specials fire when ModifierOn is active on the character and the glove's SpecialCooldown ticks down to zero, decrementing each frame with DeltaSeconds. On trigger, one of three sub-graphs runs depending on glove type: ElectricPunch (area electric damage, receives the LevelGeometry array to filter environmental collisions), SpeedPunch (speed burst), or VampGlove (lifesteal via VampTarget). The remaining cooldown is visualized in real-time on a CooldownIndicator StaticMeshComponent, with a "Percent" scalar material parameter set to 1.0 - (SpecialCooldown / DefaultCooldown) and the component billboard-rotating each tick to always face the camera.

Electric Punch special attack and visual cooldown

Special Attack & Cooldown: The electric glove strikes with AoE damage, and the circular visual cooldown indicator updates in real-time.

Hitstop

Every successful hit calls StartHitstop on the glove. For light hits, the glove detaches from the player via Detach From Actor (KeepWorld) to sell the impact visually. For heavy hits, it also calls StartHitstop(Duration: 0.1) on BP_ThirdPersonCharacter itself, which applies a brief global time dilation to make heavy strikes feel properly weighty.


Level Design, Lighting & Environment Art

Each team member was initially assigned to create at least one map, but as the project evolved, responsibilities shifted based on what the game needed. I built Level 1 entirely from scratch, handling geometry, enemy placements, and pacing while focusing on maintaining the game's momentum-based core loop. The initial inspiration came from Ghostrunner, but over time the layout evolved quite a bit to fit our own mechanics.

Here's the progression of Level 1, from early blockout to the final result:

Early blockout of Level 1

Blockout: Basic geometry and platforming flow.

Alpha layout with complete pathing

Alpha: Refined layout with complete pathing.

Beta version with bifurcating path and basic lighting

Beta: Bifurcating paths and basic visual style.

Final polished level

Final: Polished kitbashing and lighting.

Final level alternative angle
Final level alternative angle

Lumen Lighting & Emissive Materials

We used Lumen for global illumination. Originally the plan was to support both Lumen and traditional baked lighting, but due to time constraints we ended up dropping baked lighting support. Even so, we made sure to optimize Lumen as much as possible so it would run smoothly.

In Level 1, lights were used sparingly. Beyond just lighting up areas, they also served as guides to direct the player toward points of interest. Since Lumen responds to emissive materials, we leaned into that heavily: the toxic pit at the bottom of the level provides most of the green lighting that gives it that toxic cave vibe, and the same goes for glowing mushrooms and other decorative elements throughout.

To populate the world efficiently, I used kitbashing techniques, combining free assets from Sketchfab, FAB, and other libraries. The real challenge was making all these different assets feel cohesive, which I achieved through careful material tweaks, unified lighting setups, and strategic placement.

Hub Level: Foliage & Optimization

I also helped out a lot with the Hub Level, especially when it came to foliage implementation and optimization. The level has over 50,000 individual grass strands with animation, and it still runs smoothly. This was done by setting an aggressive cull distance for the grass, disabling shadow casting, and configuring a low World Position Offset Disable Distance to cut the grass animation early. These optimizations are barely noticeable to the player since the level is predominantly dark. Density Scaling and Cull Distance Scaling were also enabled to help with performance.

Hub Level capture showing optimized foliage

Hub Level Optimization: Dense foliage with aggressive cull distances to maintain performance.

Beyond these levels, I handled general layout adjustments and flow optimization across most of the other maps, tweaking geometry and coin paths to make sure the player's momentum never got accidentally broken.

Secret Level: Experimental 2D Mechanics

As an experimental challenge, I also built a secret bonus level. Drawing inspiration from the 2D sections in Epic Mickey, I adapted all of our 3D locomotion and combat mechanics to work in a strict 2D side-scrolling perspective. This required custom camera constraints and input adaptations to make it feel natural.

Secret level gameplay showing 2D side-scrolling mechanics

Secret Level: Demonstration of 3D mechanics adapted to a strict 2D side-scrolling perspective.


Polish: UI/UX, Dynamic Audio & Profiling

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

  • UI Framework & Upgrades: Built most of the widget hierarchy (WBP_Menu, WBP_BossHP, WBP_Tutorial), including responsive upscaling settings and adaptive floating damage numbers that scale dynamically on strike. The WBP_UpgradeScreen features data-driven cards with smooth in/out animations, fully navigable via keyboard and gamepad.
  • Persistent Level Streaming: Implemented a performant persistent level architecture holding the 5 main levels, utilizing dynamic loading via an elevator system and the AsyncLoadingScreen plugin for hitchless transitions.
  • 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.
  • Live Leaderboards: Integrated EpicLeaderboard for live score uploads.
  • Profiling & Optimization: Conducted light profiling and general performance optimization across the entire project to ensure a smooth frame rate, identifying bottlenecks in blueprints.
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. Additionally, I gained valuable experience producing formal game design documentation, independently creating the Game Design Document (GDD), ten-pager, and one-sheet needed to define and pitch the project's scope.

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. El bucle de juego principal reemplaza la salud tradicional del jugador con un temporizador de 5 minutos: recibir daño resta tiempo, mientras que recoger objetos añade tiempo. 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 implementé "coyote time" mediante detección de suelo con raycast para asegurar un plataformeo fluido, y programé dashes aéreos direccionales activados al pulsar dos veces las teclas de movimiento.

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.


Sistema de Combate con Guantes

Construí el sistema de combate completo desde cero: un par de guantes de boxeo flotantes que orbitan al jugador y atacan de forma autónoma. El núcleo es BP_GloveBase, una clase padre de la que heredan BP_GloveElectric, BP_GloveSpeed y BP_GloveVamp, cada una con su propio ataque especial y comportamiento único.

Guantes flotando y jugador recogiendo uno nuevo

Flotación y Recolección: El jugador recoge un guante adicional, que se une al array. Los guantes inactivos orbitan y se reorientan hacia la cámara de forma orgánica.

Combate y Hitstop

Hitstop y Combate: Demostración de golpes ligeros alternados, ataques pesados y los sutiles efectos de dilatación temporal.

Comportamiento de Flotación y Seguimiento

El jugador puede recoger guantes adicionales por el mapa, los cuales se añaden automáticamente al array de guantes que orbitan a su alrededor.

Cada guante tiene un SphereComponent llamado AssignedHome que actúa como su punto de órbita. Un evento personalizado (DistanceCheck) se dispara cada 3 segundos vía Set Timer by Event; si el guante se aleja más de 370 unidades de su home y no está atacando, InstantReturnGloves lo teletransporta de vuelta al instante poniendo su velocidad física a cero. Cuando no hay objetivo, el guante rota suavemente interpolando su cuaternión de rotación hacia la rotación de la cámara usando Slerp (Quat) con Alpha = 30.0 * DeltaSeconds, lo que le da ese movimiento flotante y orgánico.

Puñetazos y Sistema de Objetivo

Los ataques ligeros alternan entre el guante izquierdo y el derecho a través de un booleano IsLeftPunchNext en BP_ThirdPersonCharacter. Al atacar, el guante deshabilita su física, cambia su tipo de colisión a ECC_Destructible y una Timeline lo interpola vía Lerp desde su posición actual hasta la posición del objetivo. Un nodo Do Once en OnComponentBeginOverlap garantiza que el daño se aplique una sola vez por golpe antes de que el guante regrese. Después del retorno, la física se reactiva y la colisión vuelve a su estado original.

Para el objetivo, el personaje mantiene un array DetectedEnemies, una referencia ClosestEnemy y una variable CurrentTarget, con dos modos distintos: TargetLocked (bloqueo duro) y TargetSoftLocked (bloqueo suave). Cuando se activa el bloqueo, el guante calcula Find Look at Rotation con una corrección de -90° en el pitch cada tick para apuntar siempre directamente al enemigo.

LightAttack (Blueprint): Deshabilita físicas, cambia colisión, ejecuta una Timeline para el golpe y aplica daño con un nodo Do Once.

Ataque Cargado y Sistema Heavy

Mantener el botón de ataque pesado activa ChargingHeavyAttack? en el personaje, lo que reduce MaxWalkSpeed por un factor HeavyChargeSlowFactor para simular el esfuerzo de cargar. Al soltar, el guante se lanza hacia un punto LungeSpot y el personaje recibe un impulso de HeavyAttackLungeForce. Para evitar que el daño se aplique múltiples veces en el mismo enemigo durante el arco del golpe, se usa un array ChargeAlreadyHitEnemies que se limpia al iniciar cada heavy y se rellena con Add Unique en cada colisión, con comprobación previa de si el enemigo ya está en la lista.

Ataques Especiales y Enfriamiento Visual

Los especiales se activan cuando ModifierOn está activo en el personaje y el SpecialCooldown del guante llega a 0. Ese cooldown baja cada tick con DeltaSeconds. Al activarse, se ejecuta uno de tres sub-grafos según el tipo de guante: ElectricPunch (daño de área eléctrica, recibe el array LevelGeometry para filtrar colisiones con el entorno), SpeedPunch (ráfaga de velocidad) o VampGlove (lifesteal usando VampTarget). El cooldown restante se visualiza en tiempo real en un CooldownIndicator StaticMeshComponent: su material recibe un escalar "Percent" calculado como 1.0 - (SpecialCooldown / DefaultCooldown), y el componente rota cada tick para mirar siempre hacia la cámara.

Ataque especial Electric Punch y cooldown visual

Ataque Especial y Cooldown: El guante eléctrico impacta con daño de área, y el indicador visual de cooldown circular se actualiza en tiempo real.

Hitstop

En cada golpe exitoso se llama a StartHitstop en el guante. En golpes ligeros, el guante se desancla del jugador con Detach From Actor (KeepWorld) para enfatizar el impacto visualmente. En golpes pesados, además se llama a StartHitstop(Duration: 0.1) en el propio BP_ThirdPersonCharacter, que aplica una dilatación temporal global para dar peso y satisfacción al golpe.


Diseño de Niveles, Iluminación y Entornos

Cada miembro del equipo tenía asignado crear al menos un mapa, pero a medida que el proyecto avanzaba las responsabilidades se fueron adaptando según las necesidades. Yo me encargué de construir el Nivel 1 por completo desde cero, manejando geometría, colocación de enemigos y ritmo, con el enfoque puesto en mantener el bucle de impulso del juego. La inspiración inicial vino de secuencias de Ghostrunner, pero con el tiempo el diseño evolucionó bastante para encajar con nuestras propias mecánicas.

A continuación se muestra la progresión del Nivel 1, desde el blockout inicial hasta el resultado final:

Blockout temprano del Nivel 1

Blockout: Geometría básica y flujo de plataformas.

Layout Alpha con rutas completas

Alpha: Diseño refinado con el recorrido completo.

Versión Beta con rutas bifurcadas y estilo básico

Beta: Rutas bifurcadas y el primer estilo visual.

Nivel final pulido

Final: Kitbashing e iluminación pulidos.

Nivel final, ángulo alternativo
Nivel final, ángulo alternativo

Iluminación con Lumen y Materiales Emisivos

Usamos Lumen para la iluminación global. En un principio la idea era soportar tanto Lumen como iluminación bakeada tradicional, pero por falta de tiempo el soporte para bakeado se descartó. Aun así, nos aseguramos de optimizar Lumen todo lo posible para que corriera bien.

En el Nivel 1, las luces se usaron con moderación. Además de iluminar las zonas, las luces también servían como guía para dirigir al jugador hacia puntos de interés. Y como Lumen responde a emisivos, los aprovechamos mucho: el pozo tóxico en la parte baja del nivel aporta la mayor parte de la iluminación verde que le da al nivel esa atmósfera de cueva tóxica. Lo mismo con los hongos brillantes y otros elementos decorativos.

Para poblar el mundo de forma eficiente usé técnicas de kitbashing, combinando recursos gratuitos de Sketchfab, FAB y otras bibliotecas. El desafío fue hacer que todos estos assets tan distintos se sintieran cohesivos, y lo conseguí mediante ajustes de materiales, configuraciones de iluminación unificadas y colocación estratégica.

Nivel Hub: Follaje y Optimización

También ayudé bastante con el Nivel Hub, sobre todo con la implementación y optimización del follaje. El nivel tiene más de 50.000 tallos de hierba individuales con animación, y aun así corre sin problemas. Esto se logró configurando una distancia de culling agresiva para la hierba, deshabilitando las sombras, y poniendo una distancia baja para el World Position Offset Disable Distance que corta la animación de los tallos pronto, algo que apenas se nota porque el nivel es bastante oscuro. También se habilitaron Density Scaling y Cull Distance Scaling para ayudar al rendimiento.

Captura del Nivel Hub mostrando el follaje optimizado

Optimización del Nivel Hub: Follaje denso con distancias de renderizado agresivas para mantener el rendimiento.

Aparte de estos niveles, me encargué de ajustes menores y optimización de flujo en la mayoría de los otros mapas, modificando geometría y rutas de monedas para que el impulso del jugador no se rompiera.

Nivel Secreto: Mecánicas Experimentales en 2D

Como reto experimental, también construí un nivel extra secreto. Inspirándome en las secciones 2D de Epic Mickey, logré adaptar todas nuestras mecánicas de locomoción y combate en 3D para que funcionaran en una perspectiva estricta de desplazamiento lateral en 2D. Esto requirió restricciones de cámara personalizadas y adaptaciones de los controles para que se sintiera natural.

Gameplay del nivel secreto en 2D

Nivel Secreto: Demostración de las mecánicas 3D adaptadas a una perspectiva estricta de 2D.


Pulido: UI/UX, Audio Dinámico y Profiling

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 y Mejoras: Construí la mayor parte de la jerarquía de widgets (WBP_Menu, WBP_BossHP, WBP_Tutorial), incluyendo ajustes de reescalado y números de daño flotantes adaptativos que escalan dinámicamente al impactar. La pantalla de mejoras (WBP_UpgradeScreen) cuenta con tarjetas basadas en datos con animaciones fluidas, navegable con teclado y gamepad.
  • Streaming de Niveles Persistente: Implementé una arquitectura de nivel persistente que almacena los 5 niveles principales, utilizando carga dinámica a través de un sistema de ascensores y el plugin AsyncLoadingScreen para transiciones sin interrupciones.
  • 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.
  • Leaderboards en Vivo: Integré EpicLeaderboard para la subida de puntuaciones en vivo.
  • Profiling y Optimización: Realicé profiling ligero y optimización general de rendimiento en todo el proyecto para asegurar una tasa de cuadros fluida, identificando cuellos de botella en los blueprints.
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. Además, adquirí una valiosa experiencia en la producción de documentación formal de diseño de juegos, creando de forma independiente el Documento de Diseño de Juego (GDD), el ten-pager y el one-sheet necesarios para definir y presentar el alcance del proyecto.

Built with 11ty + Decap CMS