Sistema de Ajustes de Gráficos

Un servicio de gráficos que persiste el nivel de calidad, la resolución y el estado de pantalla completa a través de Game Settings y difunde cada cambio mediante el Event Dispatcher.

Para qué sirve este sistema

Todo juego necesita una pantalla de opciones de vídeo. Los jugadores esperan poder reducir el nivel de calidad en hardware antiguo, elegir una resolución que encaje con su monitor y activar o desactivar la pantalla completa sin reiniciar. En Unity las APIs para calidad, resolución y pantalla completa son independientes, y conectarlas a un almacén de ajustes, un menú de UI y unos valores por defecto adaptados al hardware queda en manos de cada proyecto.

El módulo Game Graphics de Serenity agrupa esas tres responsabilidades detrás de una única IGameGraphicsService. Lee las preferencias persistidas al inicializarse, las aplica al motor y publica los cambios para que la UI y cualquier otro suscriptor reaccionen sin necesidad de hacer polling.

El problema en Unity

Un proyecto Unity básico puede llamar directamente a QualitySettings.SetQualityLevel y Screen.SetResolution. Un proyecto real no puede quedarse ahí. El nivel de calidad elegido debe sobrevivir entre sesiones, por lo que necesita almacenarse. El hardware que no puede ejecutar el preset por defecto necesita un fallback inferior. El menú de opciones debe leer los valores actuales antes de que el jugador lo abra y escribirlos de vuelta cuando confirme. Cada pieza de esa cadena es trabajo a medida que cada proyecto escribe desde cero.

Sin una capa de servicio, la lógica de calidad y resolución acaba dispersa entre MonoBehaviours, llamadas a PlayerPrefs y scripts de menú. Los cambios en cómo se almacenan los ajustes se propagan por cada pantalla que toca gráficos, y no hay un único lugar donde interceptar o difundir un cambio de calidad al resto del juego.

Cómo lo aborda Serenity

Serenity expone los gráficos a través de IGameGraphicsService, que cubre GetQualityLevelList, GetCurrentQualityLevel, SetCurrentQualityLevel, GetScreenResolution, SetScreenResolution, GetIsFullScreen y SetIsFullScreen. Los comandos tienen tipos definidos con DTOs como SetCurrentQualityLevelInput, SetScreenResolutionInput y GameGraphicsSetIsFullScreenInput. El servicio se crea mediante IGameGraphicsServiceFactory, de modo que la implementación de Unity puede sustituirse en pruebas o en otras plataformas.

Las claves y valores por defecto de los ajustes viven en IGameGraphicsSettings, implementado como un ScriptableObject. Al inicializarse, el servicio lee los valores almacenados en IGameSettingsService y recurre a los valores por defecto configurados —1920 × 1080 en pantalla completa con el nivel de calidad configurado— cuando todavía no hay ninguna preferencia guardada. Cada mutación se difunde a través de IEventDispatcherService para que los menús, los elementos del HUD y cualquier otro suscriptor se mantengan sincronizados automáticamente.

Cómo encaja en Serenity

Game Graphics vive en el namespace Serenity.GameGraphics y sigue la estructura por capas de la foundation. La capa de Dominio define IGameGraphicsSettings. La capa de Aplicación define IGameGraphicsService, IGameGraphicsServiceFactory y todos los DTOs de comandos. Los casos de uso como GameGraphicsGetCurrentQualityLevel y GameGraphicsSetScreenResolution implementan ISyncQueryUseCase e ISyncUseCase respectivamente, y se agrupan en GameGraphicsUseCases. La capa de Infraestructura proporciona UnityGameGraphicsService y UnityGameGraphicsServiceFactory como implementaciones respaldadas por Unity.

La instalación la gestiona UnityGameGraphicsInstaller, que extiende el GameGraphicsInstaller abstracto e implementa IFoundationInstaller. Conecta el servicio a IEventDispatcherService, ILogService e IGameSettingsService a través de UnityGameGraphicsInstallerInstallInput. System Configuration proporciona valores de calidad por defecto adaptados al hardware en la capa superior, Game Settings gestiona la persistencia, y el menú o la capa de UI llama directamente a los métodos del servicio para construir la pantalla de opciones de vídeo.

Flujo de trabajo práctico

  1. Crea un asset ScriptableObject de UnityGameGraphicsSettings y configura las claves de persistencia y los valores por defecto.
  2. Añade UnityGameGraphicsInstaller a tu jerarquía de inicialización y pásale un install input con los servicios de Event Dispatcher, Log y Game Settings.
  3. Llama a IGameGraphicsService.Initialize durante el arranque; el servicio lee las preferencias almacenadas en Game Settings y las aplica de inmediato.
  4. En tu menú de opciones de vídeo, llama a GetQualityLevelList para rellenar el desplegable de calidad y a GetScreenResolution y GetIsFullScreen para reflejar el estado actual.
  5. Al confirmar el jugador, llama a SetCurrentQualityLevel, SetScreenResolution o SetIsFullScreen con el DTO correspondiente; el servicio persiste el nuevo valor y despacha el cambio.
  6. Cualquier otro sistema que necesite reaccionar a cambios de gráficos —un gestor de streaming de texturas, un escalado de resolución dinámico, un renderer de overlay— se suscribe al Event Dispatcher en lugar de hacer polling al servicio.

Qué incluye

  • Interfaz de servicio de gráficos IGameGraphicsService que cubre calidad, resolución y pantalla completa en un único contrato
  • Interfaz de factoría IGameGraphicsServiceFactory para implementaciones Unity o de prueba intercambiables
  • Interfaz de ajustes IGameGraphicsSettings respaldada por el ScriptableObject UnityGameGraphicsSettings
  • DTOs de comandos tipados: SetCurrentQualityLevelInput, SetScreenResolutionInput, GameGraphicsSetIsFullScreenInput
  • Capa de casos de uso con GameGraphicsUseCases que agrupa todos los casos de consulta y de comando
  • Persistencia automática a través de IGameSettingsService en cada operación de escritura
  • Valores por defecto configurables —clave de nivel de calidad, ancho y alto de resolución, indicador de pantalla completa— sin cambios en el código
  • Integración con el Event Dispatcher para que cualquier suscriptor reaccione a los cambios de gráficos sin acoplarse al servicio

Cuándo usarlo

  • Proyectos que necesitan una pantalla de opciones de vídeo donde los jugadores puedan cambiar calidad, resolución y pantalla completa en tiempo de ejecución.
  • Juegos que deben persistir las preferencias de gráficos entre sesiones y restaurarlas en el siguiente arranque.
  • Bases de código que quieren que el estado de gráficos se difunda a través del Event Dispatcher para que múltiples sistemas puedan reaccionar a los cambios.
  • Equipos que necesitan que el servicio de gráficos sea reemplazable: para pruebas, para builds sin cabecera o para plataformas que gestionan los ajustes de pantalla de forma diferente.

Sistemas relacionados

Usa Serenity cuando quieras calidad, resolución y pantalla completa conectados a persistencia y eventos desde el primer día, sin escribir el mismo código de ajustes en cada proyecto.

Volver a la página principal