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

  1. Configura los ajustes persistentes que tu juego expone mediante una definición de ajustes.
  2. Elige un backend de persistencia, por ejemplo PlayerPrefs o almacenamiento en fichero, detrás de IGameSettingsRepository.
  3. Lee valores con GetGameSettingsValue y escríbelos con SetGameSettingsValue.
  4. Suscríbete a OnGameSettingsOnValueUpdatedSignal donde necesites reaccionar a un cambio.
  5. Lanza OnPersistGameSettingsSignal en los momentos en que quieras grabar los ajustes a almacenamiento.
  6. 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.

Volver a la página principal