Sistema d'Ajustos de Gràfics
Un servei de gràfics que persisteix el nivell de qualitat, la resolució i l'estat de pantalla completa a través de Game Settings i difon cada canvi mitjançant l'Event Dispatcher.
Per a què serveix aquest sistema
Tot joc necessita una pantalla d'opcions de vídeo. Els jugadors esperen poder reduir el nivell de qualitat en maquinari antic, triar una resolució que s'adapti al seu monitor i activar o desactivar la pantalla completa sense reiniciar. A Unity les API per a qualitat, resolució i pantalla completa són independents, i connectar-les a un magatzem d'ajustos, un menú d'UI i uns valors per defecte adaptats al maquinari queda en mans de cada projecte.
El mòdul Game Graphics de Serenity agrupa aquestes tres responsabilitats darrere d'una única IGameGraphicsService. Llegeix les preferències persistides en inicialitzar-se, les aplica al motor i publica els canvis perquè la UI i qualsevol altre subscriptor reaccionin sense necessitat de fer polling.
El problema a Unity
Un projecte Unity bàsic pot cridar directament QualitySettings.SetQualityLevel i Screen.SetResolution. Un projecte real no pot quedar-se aquí. El nivell de qualitat escollit ha de sobreviure entre sessions, de manera que s'ha d'emmagatzemar. El maquinari que no pot executar el preset per defecte necessita un fallback inferior. El menú d'opcions ha de llegir els valors actuals abans que el jugador l'obri i escriure'ls de tornada quan confirmi. Cada peça d'aquesta cadena és feina a mida que cada projecte escriu des de zero.
Sense una capa de servei, la lògica de qualitat i resolució acaba dispersa entre MonoBehaviours, crides a PlayerPrefs i scripts de menú. Els canvis en com s'emmagatzemen els ajustos es propaguen per cada pantalla que toca gràfics, i no hi ha un únic lloc on interceptar o difondre un canvi de qualitat a la resta del joc.
Com ho aborda Serenity
Serenity exposa els gràfics a través d'IGameGraphicsService, que cobreix GetQualityLevelList, GetCurrentQualityLevel, SetCurrentQualityLevel, GetScreenResolution, SetScreenResolution, GetIsFullScreen i SetIsFullScreen. Les ordres tenen tipus definits amb DTOs com SetCurrentQualityLevelInput, SetScreenResolutionInput i GameGraphicsSetIsFullScreenInput. El servei es crea mitjançant IGameGraphicsServiceFactory, de manera que la implementació de Unity es pot substituir en proves o en altres plataformes.
Les claus i els valors per defecte dels ajustos viuen a IGameGraphicsSettings, implementat com un ScriptableObject. En inicialitzar-se, el servei llegeix els valors emmagatzemats a IGameSettingsService i recorre als valors per defecte configurats —1920 × 1080 en pantalla completa amb el nivell de qualitat configurat— quan encara no hi ha cap preferència desada. Cada mutació es difon a través d'IEventDispatcherService perquè els menús, els elements del HUD i qualsevol altre subscriptor es mantinguin sincronitzats automàticament.
Com encaixa a Serenity
Game Graphics viu al namespace Serenity.GameGraphics i segueix l'estructura per capes de la foundation. La capa de Domini defineix IGameGraphicsSettings. La capa d'Aplicació defineix IGameGraphicsService, IGameGraphicsServiceFactory i tots els DTOs d'ordres. Els casos d'ús com GameGraphicsGetCurrentQualityLevel i GameGraphicsSetScreenResolution implementen ISyncQueryUseCase i ISyncUseCase respectivament, i s'agrupen a GameGraphicsUseCases. La capa d'Infraestructura proporciona UnityGameGraphicsService i UnityGameGraphicsServiceFactory com a implementacions amb suport de Unity.
La instal·lació la gestiona UnityGameGraphicsInstaller, que estén el GameGraphicsInstaller abstracte i implementa IFoundationInstaller. Connecta el servei a IEventDispatcherService, ILogService i IGameSettingsService a través de UnityGameGraphicsInstallerInstallInput. System Configuration proporciona valors de qualitat per defecte adaptats al maquinari a la capa superior, Game Settings gestiona la persistència, i el menú o la capa d'UI crida directament els mètodes del servei per construir la pantalla d'opcions de vídeo.
Flux de treball pràctic
- Crea un asset ScriptableObject de UnityGameGraphicsSettings i configura les claus de persistència i els valors per defecte.
- Afegeix UnityGameGraphicsInstaller a la teva jerarquia d'inicialització i passa-li un install input amb els serveis d'Event Dispatcher, Log i Game Settings.
- Crida IGameGraphicsService.Initialize durant l'arrencada; el servei llegeix les preferències emmagatzemades a Game Settings i les aplica de manera immediata.
- Al teu menú d'opcions de vídeo, crida GetQualityLevelList per omplir el desplegable de qualitat i GetScreenResolution i GetIsFullScreen per reflectir l'estat actual.
- Quan el jugador confirmi, crida SetCurrentQualityLevel, SetScreenResolution o SetIsFullScreen amb el DTO corresponent; el servei persisteix el nou valor i despatxa el canvi.
- Qualsevol altre sistema que necessiti reaccionar a canvis de gràfics —un gestor d'streaming de textures, un escalat de resolució dinàmic, un renderer d'overlay— es subscriu a l'Event Dispatcher en lloc de fer polling al servei.
Què inclou
- Interfície de servei de gràfics IGameGraphicsService que cobreix qualitat, resolució i pantalla completa en un únic contracte
- Interfície de factoria IGameGraphicsServiceFactory per a implementacions Unity o de prova intercanviables
- Interfície d'ajustos IGameGraphicsSettings recolzada pel ScriptableObject UnityGameGraphicsSettings
- DTOs d'ordres tipats: SetCurrentQualityLevelInput, SetScreenResolutionInput, GameGraphicsSetIsFullScreenInput
- Capa de casos d'ús amb GameGraphicsUseCases que agrupa tots els casos de consulta i d'ordre
- Persistència automàtica a través d'IGameSettingsService en cada operació d'escriptura
- Valors per defecte configurables —clau de nivell de qualitat, amplada i alçada de resolució, indicador de pantalla completa— sense canvis al codi
- Integració amb l'Event Dispatcher perquè qualsevol subscriptor reaccioni als canvis de gràfics sense acoblar-se al servei
Quan fer-lo servir
- Projectes que necessiten una pantalla d'opcions de vídeo on els jugadors puguin canviar qualitat, resolució i pantalla completa en temps d'execució.
- Jocs que han de persistir les preferències de gràfics entre sessions i restaurar-les en el següent arrencada.
- Bases de codi que volen que l'estat de gràfics es difongui a través de l'Event Dispatcher perquè múltiples sistemes puguin reaccionar als canvis.
- Equips que necessiten que el servei de gràfics sigui reemplaçable: per a proves, per a builds sense capçalera o per a plataformes que gestionen els ajustos de pantalla de manera diferent.
Sistemes relacionats
Utilitza Serenity quan vulguis qualitat, resolució i pantalla completa connectats a persistència i esdeveniments des del primer dia, sense escriure el mateix codi d'ajustos a cada projecte.
English
Español
Català