Sistema de Game Mode para Unity
Transiciones de estado de juego tipadas con señales, estrategias de pausa y una puerta de listo a la que otros sistemas pueden suscribirse.
Para qué sirve este sistema
El estado del juego en Unity es uno de esos temas que parece caber en una pequeña clase estática, hasta que el proyecto tiene menús, gameplay, pausas, pantallas de fin y flujos modales que dependen del modo activo. En ese punto un enum y un par de booleanos dejan de bastar. Música, input, UI y sistemas de gameplay necesitan reaccionar a las mismas transiciones, y todos tienen que ponerse de acuerdo sobre qué significan.
El sistema Game Mode de Serenity proporciona ese contrato. Define un conjunto pequeño de modos de juego, expone las transiciones tipadas como señales y usa una estrategia de pausa y una puerta de listo para mantener las transiciones limpias.
El problema en Unity
La mayoría de proyectos Unity acaban con un GameStateManager a medida. Suele empezar como un enum y un evento público. Luego acumula excepciones: el gameplay no debe arrancar hasta que el input esté listo, la música solo debe cambiar cuando la escena está cargada, la pausa solo congela el tiempo en ciertos modos. El manager se llena de casos especiales, el resto del proyecto se acopla a él y los cambios dan miedo.
El comportamiento de pausa es un subproblema propio. Hay juegos que congelan el tiempo, otros mantienen ciertos sistemas funcionando y algunos hacen ambas cosas según la pantalla. Sin una interfaz de estrategia de pausa, esa lógica acaba dentro del manager y es difícil de sustituir.
Cómo lo aborda Serenity
Serenity expone el contrato de modo de juego a través de IGameModeService, con el enum GameMode en la capa de Dominio y señales explícitas para las transiciones: StartGameSignal, EnterMenuSignal, ResumeGameSignal, PauseToggledSignal, EndGameSessionSignal y GameModeChangedSignal. Algunas tienen tipos de acción asociados como StartGame, EnterMenu, ResumeGame y EndGameSessionAction.
El comportamiento de pausa lo describe IPauseStrategy, con una TimeScalePauseStrategy de serie. Las transiciones que dependen de que otros sistemas estén listos pueden pasar por IGameplayReadinessGate, implementada por GameplayReadinessGate. La implementación específica de Unity es UnityGameModeService, configurada mediante UnityGameModeSettingsDefinition y UnityGameModeSignalConfiguration.
Cómo encaja en Serenity
Game Mode vive en el namespace Serenity.GameMode. Los tipos de Dominio incluyen el enum GameMode y la interfaz de estrategia de pausa. La capa de Aplicación aporta la interfaz del servicio, la puerta de listo y las señales y acciones de transición. La capa de Infraestructura aporta UnityGameModeService y TimeScalePauseStrategy. Un UnityGameModeInstaller registra el sistema en la pipeline de inicialización.
Game Mode es un hub. El Sistema de Menús reacciona a EnterMenuSignal. El Reproductor de música puede cambiar pistas con StartGameSignal o PauseToggledSignal. Game Settings puede persistir valores al acabar una sesión. El Sistema de Modales puede pedir confirmaciones de reinicio o fin de sesión mediante las señales modales correspondientes. El comportamiento del input cambia según el modo activo a través del enrutado del Sistema de Input.
Flujo de trabajo práctico
- Configura un UnityGameModeSettingsDefinition con los modos y transiciones que tu juego necesita.
- Mapea señales a acciones a través de UnityGameModeSignalConfiguration.
- Elige una estrategia de pausa, por ejemplo TimeScalePauseStrategy, o aporta tu propia IPauseStrategy.
- Deja que el instalador de game mode registre el servicio en la pipeline de inicialización.
- Lanza StartGameSignal, EnterMenuSignal, PauseToggledSignal y señales similares desde el código de juego.
- Suscríbete a GameModeChangedSignal en sistemas que deban reaccionar al nuevo modo.
Qué incluye
- Enum GameMode y contrato IGameModeService
- Señales tipadas StartGameSignal, EnterMenuSignal, ResumeGameSignal, PauseToggledSignal, EndGameSessionSignal y GameModeChangedSignal
- Interfaz de estrategia de pausa IPauseStrategy con TimeScalePauseStrategy de serie
- Puerta de listo IGameplayReadinessGate para retrasar transiciones hasta que los sistemas estén listos
- UnityGameModeService y UnityGameModeSettingsDefinition para la configuración específica de Unity
- Configuración de señales a través de UnityGameModeSignalConfiguration
- Instalador que registra el servicio para todo el proyecto
- Integración con menús, música, input y ajustes mediante señales
Cuándo usarlo
- Proyectos con más de un estado de pantalla al que los sistemas de gameplay deben reaccionar.
- Juegos que necesitan que el comportamiento de pausa sea intercambiable por proyecto o por build.
- Equipos que quieren transiciones de estado tipadas como señales en vez de eventos por string.
- Bases de código que necesitan un sitio limpio para bloquear el arranque del gameplay hasta que input, ajustes y otros sistemas estén listos.
Sistemas relacionados
Usa Serenity cuando quieras una capa de game mode que ya coopera con menús, música, input y modales, pero que te sigue dejando decidir los modos y transiciones que encajan con tu juego.
English
Español
Català