En las entregas anteriores de esta serie construimos el mundo, las mecánicas básicas, la música de fondo, un temporizador en el HUD y un generador de laberintos aleatorios. En esta última parte añadiremos corredores NPC para subir la dificultad. Crearemos dos tipos de NPCs: uno que navega el laberinto al azar y otro que se dirige de forma directa a la meta. Para mantener el equilibrio, el corredor directo se moverá más lento que el aleatorio.
Comencemos con el corredor aleatorio. Abre el proyecto Maze Runner en el editor de escritorio. Inserta el gizmo de NPC desde el panel de gizmos, colócalo en el lobby mirando hacia el centro y asígnale un nombre visible y de objeto, por ejemplo Rex. Personaliza su aspecto con el botón Edit Avatar en propiedades, guarda cambios en el navegador y refresca el editor para ver el resultado.
Crea un punto de reaparición en la misma posición y orientación del NPC. Ese spawn se usará para devolver al NPC al lobby tras cada ronda. Renómbralo como RexSpawnPoint o equivalente.
En el panel de scripts crea un nuevo script llamado RandomNPCRunner y adjúntalo al NPC. En el código importa GameState y Events desde GameUtils. Además, necesitarás AvatarAIAgent para controlar el NPC por código. Si el compilador indica que no existe el módulo avatar_ai_agent, abre ajustes de scripts, entra en el panel API y habilita avatar ai agent. Guarda para recompilar.
Define propiedades en propsDefinition para controlar el comportamiento del NPC: minSpeed y maxSpeed, referencias a gameSpawnPoint y lobbySpawnPoint y un offset para que varios NPC no corran exactamente centrados. En el editor asigna los spawn points y coloca el offset en 0.5.
Necesitamos compartir el camino del laberinto con el NPC para que no choque contra muros. Agrega a GameUtils.ts un nuevo evento en Events llamado mazeCarved que emita una versión condensada de la malla con solo x, y, z y type, excluyendo paredes. En Maze.ts, al terminar de tallar el laberinto durante el estado Starting, llama a una función privada que recorra la grilla, reemplace paredes por celdas indefinidas y marque S en la celda de inicio y E en la celda de fin. Después, emite Events.mazeCarved con ese arreglo 2D condensado.
De vuelta en RandomNPCRunner, crea propiedades privadas: npc de tipo AvatarAIAgent, maze para la grilla y finished para saber si la ronda terminó. En start castea this.entity a AvatarAIAgent y conéctate al evento mazeCarved para almacenar la grilla. En preStart escucha gameStateChanged y maneja: Starting establece finished en falso; Playing teletransporta el NPC al punto de inicio del laberinto y lanza la lógica de movimiento; Ending pone finished en verdadero; Finished devuelve el NPC al lobby y limpia la grilla.
La función que entra en juego al iniciar la ronda teletransporta al jugador del agente al gameSpawnPoint usando SpawnPointGizmo.teleportPlayer y, tras un breve retardo asíncrono, inicia el recorrido del NPC. El retardo evita que el NPC empiece a moverse antes de completar el teleport.
Para moverse de forma aleatoria, el NPC construye una ruta paso a paso sobre la grilla recibida por evento. La idea es explorar desde la celda S barajando direcciones posibles en cada paso, registrando visitadas para no repetir celdas y aplicando backtracking cuando encuentra un callejón sin salida. El resultado es un listado de posiciones con la dirección de entrada a cada celda. Luego se simplifica la ruta eliminando puntos redundantes en tramos rectos para conseguir desplazamientos más suaves.
El movimiento se ejecuta secuencialmente encadenando rotaciones hacia la nueva dirección y desplazamientos a la siguiente posición del camino. Antes de cada acción se comprueba la bandera finished para cortar la cadena si la ronda ya terminó. La velocidad se elige en cada tramo de forma aleatoria entre minSpeed y maxSpeed. Se aplica el offset en X y Z para que el NPC no corra por el centro perfecto del pasillo y así haya variedad entre múltiples NPCs.
Para volver al lobby al cerrar la ronda, teletransporta el agente al lobbySpawnPoint y, tras un pequeño retardo, reubícalo con moveToPosition y ajústalo mirando hacia el forward del spawn, evitando que siga ejecutando una orden de movimiento anterior.
Ahora dupliquemos el script para crear el corredor directo. Duplica RandomNPCRunner, renómbralo a DirectNPCRunner y cambia minSpeed y maxSpeed a valores más bajos, por ejemplo 2 y 4. Crea un segundo NPC, por ejemplo Eliza, con su spawn y enlaza el nuevo script.
En el corredor directo solo cambiaremos la construcción de la ruta. En lugar de exploración aleatoria, usa una búsqueda sistemática hasta la meta E. Una forma efectiva es realizar una búsqueda con estructura de nodos enlazados que registra para cada celda su predecesora y el sentido por el que se llegó. Itera por niveles sobre las celdas caminables evitando paredes y repetidos, y cuando encuentres E, reconstruye el camino retrocediendo por los punteros prev hasta S. Con esa reconstrucción tendremos un trayecto directo desde S hasta E. El resto del flujo es igual: simplificar ruta, rotar y avanzar tramo a tramo a velocidad más lenta para mantener el equilibrio del juego.
Prueba en modo juego. Deberías ver al NPC aleatorio teleportarse al laberinto y explorar a distintas velocidades, y al NPC directo dirigirse de manera eficiente a la meta con paso más pausado. Cuando alcancen el final, esperarán al cierre de ronda y volverán al lobby.
Consejos de ajuste fino: si reduces el conteo atrás de la ronda, mantén el retardo posterior al teletransporte para evitar que un NPC conserve una orden de movimiento activa. Ajusta offset y velocidades para dar personalidad a cada corredor. Si cambias las coordenadas de inicio o fin del laberinto, recuerda actualizar la asignación de S y E en el evento.
Q2BSTUDIO puede ayudarte a llevar este tipo de experiencias al siguiente nivel con software a medida, agentes IA y automatizaciones que integren lógica de juego, analítica e infraestructura. Somos expertos en aplicaciones a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio y power bi. Si buscas incorporar ia para empresas o diseñar agentes IA que aporten valor real, visita nuestro servicio de inteligencia artificial. Y si necesitas una plataforma sólida para tu producto digital, descubre nuestro enfoque de software a medida centrado en resultados.
Con ambos corredores implementados, tu Maze Runner ofrece variedad y desafío. A partir de aquí puedes ampliar con nuevas estrategias de IA, puntuaciones, analítica con power bi, tableros, integración con servicios cloud aws y azure y reglas dinámicas. En Q2BSTUDIO te acompañamos desde el diseño hasta la puesta en producción con seguridad y rendimiento, incluyendo ciberseguridad, pentesting, servicios inteligencia de negocio y todo lo necesario para que tu experiencia crezca de forma sostenible.