PR – Alice Back to Madland
Pública PR – Alice Back to Madland
Juego disponible para ejecutarse vía Web
https://play.unity.com/en/games/1479596d-d7cd-44bb-b516-65ad27344dc2/projectaliceweb
Video de demostración
https://www.youtube.com/watch?v=hU33M0VmJQE
Cómo se juega
El juego presenta un menú principal interactivo desde el cual se puede configurar la experiencia de juego:
-
Configuración: En el menú principal, puedes ajustar el idioma del juego (Español/Inglés) y la dificultad (Fácil, Normal, Difícil).
-
Dificultad Invencible: Se ha añadido un modo de dificultad especial donde Alice, al perder por completo toda su vida, la recupera automáticamente al máximo, haciéndola invencible de forma efectiva y permitiendo una exploración relajada del mundo.
-
Niveles: Durante la partida, puedes abrir el Menú de Pausa en cualquier momento pulsando la tecla
ESC. Desde ahí podrás:- Reanudar: Volver a la acción inmediatamente.
- Menú Principal: Regresar a la pantalla inicial.
- Salir: Cerrar la aplicación.
-
Sistema de Salto: El salto es dinámico; puedes controlar la altura del mismo manteniendo pulsado el botón de salto para un alcance máximo, o soltarlo rápidamente para realizar un salto más corto.
-
Recuperación de Vida: A lo largo de los niveles, puedes encontrar corazones que restauran tu salud. La cantidad de vida recuperada depende de la dificultad seleccionada.
-
Interacción con Enemigos: Alice no colisiona físicamente con los enemigos (puede atravesarlos), pero recibirás daño si entras en contacto con ellos. Es fundamental evitar tocarlos para mantener tu salud intacta.
-
Superación de Arenas: En ciertas zonas del nivel, se activará un sistema de «Arena». Quedarás atrapado en un área delimitada e inmóvil mientras se despliega el aviso visual inicial; una vez comience el combate, recuperarás el control y deberás derrotar a todas las oleadas de enemigos. Las barreras se desactivarán automáticamente al limpiar la zona, permitiéndote continuar tu avance.
-
La Muerte de Alice: Si la salud de Alice llega a cero, el juego entra en una secuencia de derrota fulminante. El movimiento y disparo del personaje se bloquean e higienizan al instante, se desactivan sus físicas corporales, la música del nivel realiza un desvanecimiento (fade-out) y se inicia una melodía fúnebre personalizada. Finalmente, tras un fundido a negro de la interfaz de 3 segundos en tiempo real, el motor se congela por completo (
Time.timeScale = 0f) y se permite reiniciar la escena pulsando cualquier botón de acción. -
Sistema de Combate y Tipos de Munición:
- Arma Base: Alice comienza con un arma de munición infinita, ideal para situaciones estándar.
- Sistema de Munición Especial (Finita): A lo largo de los niveles, se pueden recoger cofres potenciadores que transforman temporalmente el arma base. El sistema está diseñado para albergar múltiples variantes en el futuro, requiriendo gestión de consumibles debido a su naturaleza finita.
- SpecialAmmo1: Primera variante del sistema de munición especial. Al equiparla, los propios disparos de Alice se vuelven completamente inmunes a las balas enemigas (no se anulan ni se destruyen al colisionar con ellas, atravesándolas) e infligen el doble de daño básico.
- Gestión de Transición y Pausa Explicativa: Al recolectar un ítem de munición especial, el juego congela por completo el tiempo de simulación (
Time.timeScale = 0f) para desplegar un panel informativo obligatorio en el Canvas. Tras una ventana de seguridad de 1.5 segundos reales, se exige una pulsación activa del jugador para reanudar el combate. Cuando la munición se agota, el sistema invoca un método automático de retorno que devuelve a Alice a su arma base sin interrumpir la fluidez del gameplay.
Cómo se ha desarrollado
El proyecto se ha estructurado buscando la máxima modularidad, teniendo en cuenta que se continuará más adelante y reutilizará gran parte de los scripts y prefabs, destacando los siguientes hitos técnicos:
1. 📂 Arquitectura de Escenas
El flujo del juego se ha organizado en una secuencia lógica de escenas para garantizar una experiencia narrativa coherentemente estructurada:
- Intro: Escena inicial dedicada exclusivamente a mostrar el logo del desarrollador.
- MainMenuScene: Menú principal para la gestión de opciones y navegación.
- IntroLevel1-1: Escena que reproduce el vídeo de introducción que contextualiza el nivel.
- Level1-1: Escena del primer nivel jugable.
2. 🎬 Pantalla de bienvenida (Logo del desarrollador)
Se ha implementado una cinemática inicial mediante un script de control de Alpha. Al iniciar la aplicación en la escena Intro, el logo del desarrollador aparece en pantalla y, tras un breve periodo, utiliza una corrutina para realizar un efecto de desvanecimiento (fade-out) gradual antes de cargar el menú principal, proporcionando una transición profesional.

3. 🌐 Sistema de Localización
Se ha integrado el paquete Unity Localization para gestionar los textos del juego. Como lógica de negocio, se ha implementado un detector de Locale que selecciona automáticamente el idioma Inglés por defecto en caso de que el sistema operativo o dispositivo donde se ejecute no esté configurado en español, garantizando accesibilidad global.
4. 🎛️ Menú Principal (Main Menu)
El menú principal actúa como núcleo de navegación del juego, estructurado en tres bloques funcionales:
- Nuevo Juego: Carga la escena del primer nivel para iniciar la partida.
- Opciones: Acceso al panel de configuración donde el usuario puede modificar el idioma y la dificultad. Al hacer clic en este botón, se activa la visibilidad del panel correspondiente, ocultándolo de nuevo al pulsar el botón de «Volver». Se han implementado imágenes personalizadas para los botones de la interfaz y componentes Dropdowns optimizados para la selección de parámetros. La dificultad seleccionada persiste entre sesiones mediante
PlayerPrefsy se sincroniza globalmente mediante unGameManager(patrón Singleton). - Salir: Cierra la aplicación de forma controlada.


5. 🗺️ Niveles
La experiencia dentro de los niveles cuenta con dos implementaciones clave para mejorar la jugabilidad:
- Sistema de Pausa: Se ha desarrollado un
LevelManagergenérico presente en cada nivel. Al pulsarESC, se congela el tiempo del juego (Time.timeScale = 0f) y se activa unPausePanel(un elemento de UI con fondo negro y transparencia ajustada). Este sistema está diseñado para superponerse a toda la interfaz y detener la lógica de movimiento y rotación del personaje, garantizando una pausa limpia.

- Límites de Nivel: Para mejorar el diseño de niveles, se ha implementado un sistema de Límite Izquierdo mediante un
BoxCollider2Destático. Esto evita que el jugador caiga al vacío una vez superado el margen de la pantalla, delimitando físicamente el área jugable. - Sistema de Ocultación (Mask): Se ha implementado un sistema de máscaras (
Mask) para permitir que Alice pueda ocultarse al pasar por detrás de las tuberías en el piso superior, mejorando la inmersión y las posibilidades de sigilo.
6. 🏃♂️ Sistema de Movimiento y Control (Alice)
El núcleo jugable ha sido desarrollado con un enfoque en la precisión y la robustez del motor de físicas 2D, añadiendo capas críticas de seguridad para el tratamiento de inputs:
- Controles Adaptativos (Android): El juego detecta automáticamente si se ejecuta en Android. Solo en ese caso se despliega la interfaz táctil (joystick y botones). Para facilitar el gameplay en pantallas táctiles, se ha configurado la acción de salto para que sea ejecutable tanto mediante el botón dedicado como moviendo el joystick hacia arriba (o pulsando la flecha arriba), permitiendo realizar maniobras de salto y disparo simultáneas con mayor comodidad.
- Movimiento Horizontal: Implementación de un sistema de frenado de precisión que ancla la posición del personaje cuando está quieto, evitando deslizamientos involuntarios en pendientes.
- Salto Variable: Se ha implementado un sistema de salto sensible a la duración de la pulsación. Si el usuario mantiene presionado el botón, Alice alcanza la altura máxima; si lo suelta rápidamente, el salto se corta para permitir un control más preciso.
- Sistema de Animación: Se ha implementado una máquina de estados en el Animator que utiliza un nodo «Any State» para disparar la animación
AliceJumpCrouch. Esta configuración permite que tanto el estado de salto como el de agachado compartan la misma lógica visual de forma eficiente, asegurando que Alice transicione correctamente independientemente de su estado anterior. - Control Dinámico del Arma: Se ha añadido una lógica de positioning local para el arma. Al agacharse, el objeto
WeaponPivotajusta sus coordenadas de forma dinámica para que el arma baje de posición, manteniendo una correcta alineación visual con la postura de Alice. - Higienización de Estados (
ResetInputStates): Se ha desarrollado un sistema de limpieza para evitar que Alice retenga comandos del Input System al bloquearse su movimiento (canMove = false). Al dispararse una pausa, cinemática, diálogo o evento de interfaz, este método fuerza la puesta a cero de las variables de dirección (horizontalInput/verticalInput), apaga ráfagas de fuego activas (isFiring = false) y resetea las animaciones a Idle, evitando desplazamientos o disparos fantasma automáticos tras recuperar el control.

7. 📊 Interfaz de Juego (UI HUD)
Se ha implementado una interfaz persistente para monitorizar el estado de Alice:
- Sistema de Salud Dinámico:
- Prefab de Corazón: Se ha creado un
Prefabreutilizable para el corazón, permitiendo gestionar su estado de manera centralizada. - Canvas de Salud: Se ha desarrollado un nuevo
Canvasque gestiona los corazones de vida. - Dependencia de Dificultad: La cantidad de corazones cargados al iniciar el nivel se ajusta automáticamente según la dificultad (Fácil: 6, Normal: 4, Difícil: 2).
- Feedback Visual: El sprite del corazón cambia dinámicamente de «lleno» a «vacío» de forma fluida cada vez que Alice pierde una vida.
- Coleccionables de Salud: Implementación de un sistema modular de objetos recuperables (corazones) que desaparecen tras el contacto (
Destroy(gameObject)), incorporando banderas de seguridad (isCollected) para prevenir activaciones duplicadas durante la colisión, lógica sincronizada con elGameManagerpara ajustar la curación según la dificultad, e integración con elAudioManagerpara disparar efectos sonoros de curación dedicados.
- Prefab de Corazón: Se ha creado un
- Gestión de Munición: Se ha integrado un panel que muestra el icono del arma y el estado de la munición.
- Lógica de Estado: Por defecto, Alice utiliza un arma con balas infinitas, lo cual se indica en la interfaz mediante un símbolo especial.
- Transición Dinámica: Al recoger cualquier tipo de munición especial, el sistema utiliza el script
AmmoUIpara ocultar automáticamente el símbolo de infinito, activar el contador numérico de balas y actualizar el sprite correspondiente al tipo de proyectil equipado en tiempo real. En el caso específico de SpecialAmmo1, el HUD refleja visualmente que contamos con balas pesadas con propiedades destructivas duplicadas e inmunidad a colisiones con disparos externos. Al agotarse la munición, el sistema invoca un método deResetToDefault()que restaura la interfaz a su estado base automáticamente.

8. ⚔️ Sistema de Combate y Disparo
Se ha implementado un sistema robusto, modular y eficiente para el combate a distancia de Alice, diseñado bajo principios de escalabilidad:
- Arquitectura de Disparo (WeaponManager) Escalable: Se ha desarrollado un gestor centralizado encargado de controlar la cadencia de fuego, el inventario de proyectiles y la gestión del daño. La arquitectura está desacoplada para admitir la inyección de nuevas variantes de munición especial en el futuro sin modificar el núcleo del script. El sistema permite disparo automático mediante una cadencia configurable (
fireRate). - Lógica de Modificadores (SpecialAmmo1): Cuando la variante SpecialAmmo1 se encuentra activa, el
WeaponManageraplica de forma dinámica un multiplicador de daño (x2) en la instanciación de sus proyectiles. Asimismo, se omite la destrucción o anulación física del proyectil de Alice al entrar en contacto con las balas enemigas, confiriéndoles inmunidad total para continuar su trayectoria. - Balística Direccional: El sistema calcula dinámicamente la dirección de disparo (
1para derecha,-1para izquierda) basándose en la orientación (localScale) del personaje, permitiendo que Alice dispare hacia el lado al que mira de forma intuitiva. - Gestión de Proyectiles (Bullet): Las balas funcionan como entidades independientes con lógica propia:
- Colisiones Inteligentes: Utilizan
OnTriggerEnter2Dpara gestionar impactos con enemigos, otras balas o límites de nivel («Boundaries»). Con el arma base, las colisiones entre proyectiles los anulan mutuamente; bajo los efectos de SpecialAmmo1, los proyectiles aliados ignoran este descarte físico. - Optimización de Memoria: Se ha implementado
OnBecameInvisible(), garantizando que cualquier proyectil que abandone el área visible de la cámara se destruya automáticamente, evitando fugas de memoria. - Integración Física: Configuración precisa en la Layer Collision Matrix para evitar que el jugador colisione con sus propios disparos, asegurando que el combate se sienta natural.
- Colisiones Inteligentes: Utilizan
- Integración con Input System: Se ha adaptado el controlador de Alice para soportar disparos mantenidos mediante el uso de estados de acción (
started/canceled), garantizando una experiencia de juego fluida y responsiva.
9. 📂 Arquitectura de Triggers Inteligentes (Triggers Decoupled)
Los disparadores del entorno (ArenaBossTrigger, DialogTrigger) se han desarrollado bajo principios de desacoplamiento e inyección de datos. En lugar de procesar flujos de control internamente, actúan como recolectores de parámetros en el editor (listas de diálogo con estructuras serializables de Unity Localization, referencias de prefabs o vectores de orientación). Al interceptar el paso físico del jugador, inyectan esta configuración directamente en los mánagers orquestadores de la escena (DialogManager, BossArenaManager), delegando por completo la responsabilidad lógica.
10. 🛡️ Prevención de Bugs de Doble Activación (Frame-Safe Destruction)
Para garantizar la solidez de las colisiones concurrentes en el motor de físicas de Unity, todos los componentes interactivos críticos (disparadores de combate, ítems coleccionables y proyectiles) incorporan banderas booleanas protectoras de control local (hasBeenTriggered, isBeingDestroyed). Al registrarse el primer contacto físico del frame, la bandera conmuta su estado lógico y bloquea instantáneamente cualquier subproceso redundante, ordenando un borrado fulminante de la memoria jerárquica activa mediante Destroy(gameObject). Esto anula parpadeos visuales, cálculos dobles de curación o duplicados fantasmas de entidades en memoria.
11. 💬 Sistema Genérico de Diálogos Cinemáticos Localizados
Se ha desarrollado un motor de conversación dinámica integrado a través de una cola FIFO (Queue<DialogLine>) controlada por corrutinas asíncronas inmunes al congelamiento del tiempo del motor gráfico. El sistema gestiona las siguientes características:
- Foco y Estética de Retratos: El gestor altera dinámicamente el color y los balances de contraste de las imágenes del Canvas. El orador activo recupera su brillo nativo (
Color.white), mientras que el rostro secundario se atenúa mediante un tono grisáceo de contraste (0.5f), manteniendo su silueta y opacidad. - Traducción en Tiempo Real: El flujo consulta dinámicamente el diccionario activo mediante estructuras
LocalizedString, garantizando consistencia en proyectos multiidioma. - Aceleración de Textos: Soporta el renderizado carácter por carácter rápido. Si el jugador presiona un botón de acción a mitad del proceso, la corrutina se cancela para volcar la frase traducida por completo de forma instantánea.
12. 👾 Sistema de Enemigos y Salud
Se ha implementado una arquitectura avanzada para la gestión de enemigos, aportando robustez y profundidad al gameplay:
- Salud Dinámica y Visual: Implementación de
HealthBarControllerpara enemigos con vaciado visual fluido, facilitando la lectura del combate. - Ajuste por Dificultad: Integración con el
GameManagerpara escalar la salud de los enemigos y la duración de la invencibilidad de Alice según la selección del jugador. - Cálculo Dinámico de Salud del Jefe: En el caso particular de los encuentros climáticos, la salud máxima se calcula de forma matemática al inicializar el combate según los parámetros del orquestador global (
GameManager.Instance.dificultadActual), escalando su resistencia desde 200 puntos (Fácil) hasta 500 puntos (Difícil). - Comportamiento Patrol (Enemy3Behaviour): Implementación de un comportamiento de patrulla autónoma que gestiona cambios de dirección, sincronización de animaciones (
Speed) y volteo de sprites (flipX) basándose en el vector de velocidad físico (rb.linearVelocity), manteniendo una estructura limpia y desacoplada del controlador base. - Sistema de Traspaso Físico (Ghosting): Optimización mediante
Physics2D.OverlapBoxpara permitir que Alice y los enemigos se atraviesen sin empujones físicos, manteniendo la detección de daño precisa. Al ser las balas de Alice las que poseen la inmunidad y no el personaje, Alice sigue expuesta a recibir daño directo si entra en contacto físico con los proyectiles enemigos o con los cuerpos de los propios contrincantes. - Arquitectura Escalable y Gestión Bidireccional de Balas: Migración a clases base y abstractas (
BaseEnemyController,EnemyShooterBase). El controlador hereda una lista dinámica interna (activeBullets) que registra de forma bidireccional cada proyectil disparado. Esto permite que los proyectiles notifiquen de forma remota su desaparición natural en el mapa y asegura una recolección automática de basura: si el enemigo es aniquilado por Alice, el script barre y destruye instantáneamente todas sus balas huérfanas activas en la pantalla.
Bestiario y Tipos de Enemigos
- Enemy1: Permanece de pie y realiza disparos altos. Alice puede agacharse para esquivar sus proyectiles de forma segura o disparar desde su posición erguida para colisionar con sus balas y anularlas en el aire. Si Alice porta SpecialAmmo1, sus propios proyectiles destruirán o atravesarán limpiamente las balas de este enemigo sin desaparecer, permitiendo castigar su posición erguida con el doble de daño.

- Enemy2: Ataca desde una postura agachada realizando disparos bajos. Alice debe realizar un salto para esquivar el ataque o agacharse y abrir fuego para interceptar y destruir sus proyectiles. Al igual que con el primer arquetipo, el uso de SpecialAmmo1 inmuniza a las balas de Alice contra el descarte por choque, dándoles prioridad absoluta en el intercambio.

- Enemy3: No posee ataques a distancia, pero se desplaza continuamente de un lado a otro del escenario en su ruta de patrulla, obligando a Alice a calcular el ritmo de sus saltos para evitar el contacto físico y el daño por colisión.

-
Boss 1 (Jefe de Nivel): Un oponente masivo con inteligencia de patrones secuenciales cíclicos gobernados por corrutinas asíncronas. Cuenta con dos cañones locales independientes (superior e inferior) que disparan ráfagas rítmicas de proyectiles a velocidades variables según la fase de la IA. El jefe es capaz de realizar saltos balísticos de precisión hacia plataformas elevadas para hostigar a Alice desde las alturas y desplazarse a altas velocidades por toda la arena de combate.
- Patrón Especial (Tormenta de Disparos Frenética): A mitad de su coreografía, el jefe activa un evento cinemático que notifica un peligro masivo. Congela el tiempo de juego real para desplegar un panel informativo en pantalla (
BossWarningPanel). Al reanudarse el flujo, el Boss entra en un estado furioso donde aumenta drásticamente la velocidad de sus proyectiles (x1.5) y reduce a la mitad el enfriamiento de sus armas, desatando una lluvia masiva y coordinada de disparos cruzados por ambos cañones de forma simultánea. Al concluir su ataque, genera de forma dinámica drops de recompensa de salud y munición pesada en los extremos del mapa para incentivar el movimiento constante del jugador.
- Patrón Especial (Tormenta de Disparos Frenética): A mitad de su coreografía, el jefe activa un evento cinemático que notifica un peligro masivo. Congela el tiempo de juego real para desplegar un panel informativo en pantalla (

13. 🔊 Gestión de Audio (AudioManager)
Se ha implementado un gestor centralizado robusto mediante el patrón Singleton (DontDestroyOnLoad), que organiza de forma independiente la reproducción de pistas ambientales y efectos especiales (SFX).
- Volumen Relativo: El método
PlaySFXsoporta factores de escala numéricos para regular la intensidad local de los audios (como la atenuación de ráfagas de balas frente a sonidos de recompensas). - Fundidos de Seguridad: El control transicional de música (
FadeOutAndStop) utiliza corrutinas gobernadas porTime.unscaledDeltaTimey rigurosos checks de nulidad. Esto blinda las rutinas contra el errorMissingReferenceExceptionsi el componente de audio original es desmantelado al recargar escenas rápidamente tras una derrota. - Persistencia de Sonido: Gracias al uso de
PlayOneShot, los efectos sonoros de recolección de los coleccionables se emiten de forma remota en el hilo del manager inmortal, permitiendo destruir instantáneamente el objeto recolectado de la escena sin interrumpir la reproducción del audio.
14. 🛡️ Sistema de Arenas (Enemigos Bloqueantes)
Para dinamizar el progreso, se ha integrado un gestor de eventos de escenario (ArenaManager):
- Bloqueo Progresivo: Al cruzar el umbral del disparador, la cámara detiene su scroll horizontal y se instancian barreras físicas en los extremos de la pantalla basados en la vista del viewport.
- Tratamiento Seguro del Jugador: Al entrar en la arena, el movimiento de Alice se congela y se invoca instantáneamente
ResetInputStates()junto a una neutralización de la velocidad lineal delRigidbody2D. Esto previene deslices por inercia o animaciones de carrera atascadas durante el parpadeo de la interfaz. - Gestión de Oleadas y Limpieza: El sistema procesa de forma asíncrona la aparición secuencial de enemigos según retardos personalizados de spawn. El flujo retiene la tregua del nivel y abre los muros exclusivamente tras monitorizar que la lista de entidades activas se ha reducido a cero, devolviendo entonces el control de movimiento a Alice.
15. 💀 Secuencia Crítica de Game Over (PlayerHealth)
El colapso de salud de Alice se ha reestructurado por completo como una secuencia ordenada en tiempo real, rompiendo dependencias con las funciones tradicionales de Invoke y el reloj global del juego:
- Clonado e Higienización Física: En el frame de derrota, el estado
isDeadpasa a ser verdadero, se limpian y congelan los inputs de mando/teclado y elRigidbody2Des forzado a detener su velocidad angular y lineal, transformándose en un componenteKinematicinmune a fuerzas externas. Se suspenden los colisionadores y las máquinas de animación. - Despliegue Asíncrono de Audio y UI: Se ordena la atenuación por corrutina de la melodía de fondo. Desvinculado del reloj de simulación, un temporizador real
WaitForSecondsRealtime(0.5f)ejecuta de manera garantizada la pista fúnebre. Posteriormente, la pantalla de Game Over emerge gradualmente manipulando el canal alfa de unCanvasGroupmediante un bucle de interpolación lineal independiente. - Pausa del Motor: Alcanzado el 100% de visibilidad del panel, se autoriza la bandera de reinicio rápido y se congela el tiempo del gameplay aplicando un valor determinante de
Time.timeScale = 0f.
16. 🏁 Secuencia Final de Juego (Continuará…)
Tras derrotar al jefe y cerrar el diálogo conclusivo, se ejecuta una secuencia de cierre:
- Audio: Se detiene la música de combate y se inicia la pista de final de juego personalizada mediante paso de referencia de
AudioClip. - Bloqueo: Se fuerza el estado
canMove = falseen Alice para garantizar que no haya movimiento mientras se despliega el epílogo. - Panel Final: Se activa un panel informativo mediante un desvanecimiento suave (
CanvasGroup.alpha) mientras el texto «CONTINUARÁ…» se escribe gradualmente carácter por carácter durante 3 segundos. - Cierre: Tras un segundo de reposo, el sistema espera cualquier entrada del jugador (tecla o toque táctil) para cargar la escena del menú principal.
Este es un espacio de trabajo personal de un/a estudiante de la Universitat Oberta de Catalunya. Cualquier contenido publicado en este espacio es responsabilidad de su autor/a.