Game Settings para Unity
Casos de uso get y set tipados para ajustes bool, int, float y string, con persistencia y señales de actualización ya integradas.
Para qué sirve este sistema
Los ajustes del juego parecen engañosamente sencillos. Un slider de volumen, un preset de calidad, una elección de idioma y un toggle de gráficos no parecen gran cosa. Luego el proyecto crece. Los ajustes empiezan a depender unos de otros, el código de juego reacciona a sus cambios, la persistencia tiene que ser fiable entre plataformas y el menú de ajustes se convierte en una de las piezas de UI más tocadas. La mayoría de equipos construye su propio sistema ad hoc, choca con los mismos problemas e intenta parchearlos.
El sistema Game Settings de Serenity es la forma de la foundation de decir que los ajustes merecen un servicio real. Los valores son tipados, las lecturas y escrituras pasan por casos de uso, la persistencia es una preocupación separada y los cambios son observables a través de señales.
El problema en Unity
Sin una capa de ajustes real, los proyectos tienden a derivar a uno de dos patrones. O bien cada ajuste es una clave de PlayerPrefs referenciada por string, repartida por toda la base de código, o existe una clase Settings estática propia que crece hasta que nadie quiere tocarla. Las dos hacen difícil añadir un ajuste con seguridad, testear la lógica de ajustes y reaccionar a cambios desde el código de juego.
La persistencia es la otra mitad del problema. Los ajustes tienen que sobrevivir entre sesiones. Necesitan un momento definido para escribirse, otro para restaurarse y una forma definida de resetear a valores por defecto. Cuando esos momentos están dispersos, los ajustes pierden datos o se niegan a aplicar cambios hasta el próximo arranque.
Cómo lo aborda Serenity
Serenity expone los ajustes a través de IGameSettingsService con los casos de uso SetGameSettingsValue y GetGameSettingsValue. Existen variantes tipadas para valores bool, int, float y string, tanto en DTOs de entrada como de salida. Las actualizaciones son observables a través de OnGameSettingsOnValueUpdatedSignal. La persistencia se describe mediante IGameSettingsPersistenceSettings e IGameSettingsRepository, y las intenciones de resetear y persistir son señales de primer nivel: OnPersistGameSettingsSignal y OnResetGameSettingsToDefaultSignal.
Los valores por defecto, la persistencia y cualquier precarga de assets dependientes viven detrás de sus propias interfaces. El menú de ajustes lee y escribe a través del servicio. Otros sistemas se suscriben a la señal de actualización cuando necesitan reaccionar a un cambio.
Cómo encaja en Serenity
Game Settings vive en el namespace Serenity.GameSettings. Entidades de Dominio como GameSettingsEntity y StoredSettingsPayload describen los datos. La capa de Aplicación expone el servicio, los DTOs tipados y las señales de actualización. Los helpers de precarga de assets IGameSettingsAssetPreloader e IGameSettingsAssetPreloadingIntegrator coordinan cualquier asset addressable que dependa de los ajustes.
Game Settings conecta con el Sound Mixer para volúmenes persistentes por categoría, con Localización para el idioma de juego y de voz activos, con Game Mode para cambios de ajustes dirigidos por estado, con el Event Dispatcher para las señales de actualización y reset y con el Sistema de Menús y el de Modales para la pantalla de ajustes y su confirmación de reset. El resultado es una capa de ajustes que el resto de la foundation ya entiende.
Flujo de trabajo práctico
- Configura los ajustes persistentes que tu juego expone mediante una definición de ajustes.
- Elige un backend de persistencia, por ejemplo PlayerPrefs o almacenamiento en fichero, detrás de IGameSettingsRepository.
- Lee valores con GetGameSettingsValue y escríbelos con SetGameSettingsValue.
- Suscríbete a OnGameSettingsOnValueUpdatedSignal donde necesites reaccionar a un cambio.
- Lanza OnPersistGameSettingsSignal en los momentos en que quieras grabar los ajustes a almacenamiento.
- Usa OnResetGameSettingsToDefaultSignal para resetear los ajustes desde un menú o un flujo modal.
Qué incluye
- Casos de uso tipados SetGameSettingsValue y GetGameSettingsValue con variantes bool, int, float y string
- Señal de actualización OnGameSettingsOnValueUpdatedSignal para sistemas reactivos
- Interfaz de persistencia IGameSettingsRepository y ajustes IGameSettingsPersistenceSettings
- Señales de persistir y resetear OnPersistGameSettingsSignal y OnResetGameSettingsToDefaultSignal
- Helpers de precarga de assets addressables que dependen de los ajustes
- Integración con Sound Mixer, Localización, Game Mode y el Event Dispatcher
- Instalador que registra el servicio para todo el proyecto
- Separación limpia entre las capas de Dominio, Aplicación e Infraestructura
Cuándo usarlo
- Proyectos que exponen un menú de ajustes real con varias categorías.
- Juegos que necesitan que los ajustes persistan entre sesiones y se reseteen a valores por defecto de forma fiable.
- Equipos que quieren una capa de ajustes tipada y observable en vez de claves de PlayerPrefs sueltas.
- Bases de código que necesitan que otros sistemas reaccionen a cambios de ajustes sin hacer polling.
Sistemas relacionados
Usa Serenity cuando quieras una capa de ajustes que ya coopera con mixers, localización y menús, pero que te sigue dejando elegir el backend de persistencia y el contrato de valores para tu juego.
English
Español
Català