Sistema de Game Mode per a Unity
Transicions d'estat de joc tipades amb senyals, estratègies de pausa i una porta de llest a la qual altres sistemes poden subscriure's.
Per a què serveix aquest sistema
L'estat del joc a Unity és un d'aquells temes que sembla que cap en una petita classe estàtica, fins que el projecte té menús, gameplay, pauses, pantalles de final i fluxos modals que depenen del mode actiu. En aquest punt un enum i un parell de booleans deixen de bastar. Música, input, UI i sistemes de gameplay necessiten reaccionar a les mateixes transicions, i tots s'han de posar d'acord sobre què signifiquen.
El sistema Game Mode de Serenity proporciona aquest contracte. Defineix un conjunt petit de modes de joc, exposa les transicions tipades com a senyals i fa servir una estratègia de pausa i una porta de llest per mantenir les transicions netes.
El problema a Unity
La majoria de projectes Unity acaben amb un GameStateManager a mida. Sol començar com un enum i un esdeveniment públic. Després acumula excepcions: el gameplay no ha d'arrencar fins que l'input estigui llest, la música només ha de canviar quan l'escena està carregada, la pausa només congela el temps en certs modes. El manager s'omple de casos especials, la resta del projecte s'acobla a ell i els canvis fan por.
El comportament de pausa és un subproblema propi. Hi ha jocs que congelen el temps, d'altres mantenen certs sistemes funcionant i alguns fan totes dues coses segons la pantalla. Sense una interfície d'estratègia de pausa, aquesta lògica acaba dins del manager i és difícil de substituir.
Com ho aborda Serenity
Serenity exposa el contracte de mode de joc a través d'IGameModeService, amb l'enum GameMode a la capa de Domini i senyals explícites per a les transicions: StartGameSignal, EnterMenuSignal, ResumeGameSignal, PauseToggledSignal, EndGameSessionSignal i GameModeChangedSignal. Algunes tenen tipus d'acció associats com StartGame, EnterMenu, ResumeGame i EndGameSessionAction.
El comportament de pausa el descriu IPauseStrategy, amb una TimeScalePauseStrategy de sèrie. Les transicions que depenen que altres sistemes estiguin llestos poden passar per IGameplayReadinessGate, implementada per GameplayReadinessGate. La implementació específica de Unity és UnityGameModeService, configurada mitjançant UnityGameModeSettingsDefinition i UnityGameModeSignalConfiguration.
Com encaixa a Serenity
Game Mode viu al namespace Serenity.GameMode. Els tipus de Domini inclouen l'enum GameMode i la interfície d'estratègia de pausa. La capa d'Aplicació aporta la interfície del servei, la porta de llest i les senyals i accions de transició. La capa d'Infraestructura aporta UnityGameModeService i TimeScalePauseStrategy. Un UnityGameModeInstaller registra el sistema a la pipeline d'inicialització.
Game Mode és un hub. El Sistema de Menús reacciona a EnterMenuSignal. El Reproductor de música pot canviar pistes amb StartGameSignal o PauseToggledSignal. Game Settings pot persistir valors en acabar una sessió. El Sistema de Modals pot demanar confirmacions de reinici o fi de sessió mitjançant les senyals modals corresponents. El comportament de l'input canvia segons el mode actiu a través de l'encaminament del Sistema d'Input.
Flux de treball pràctic
- Configura un UnityGameModeSettingsDefinition amb els modes i transicions que el teu joc necessita.
- Mapeja senyals a accions a través de UnityGameModeSignalConfiguration.
- Tria una estratègia de pausa, per exemple TimeScalePauseStrategy, o aporta la teva pròpia IPauseStrategy.
- Deixa que l'instal·lador de game mode registri el servei a la pipeline d'inicialització.
- Llança StartGameSignal, EnterMenuSignal, PauseToggledSignal i senyals similars des del codi de joc.
- Subscriu-te a GameModeChangedSignal en sistemes que hagin de reaccionar al nou mode.
Què inclou
- Enum GameMode i contracte IGameModeService
- Senyals tipades StartGameSignal, EnterMenuSignal, ResumeGameSignal, PauseToggledSignal, EndGameSessionSignal i GameModeChangedSignal
- Interfície d'estratègia de pausa IPauseStrategy amb TimeScalePauseStrategy de sèrie
- Porta de llest IGameplayReadinessGate per retardar transicions fins que els sistemes estiguin llestos
- UnityGameModeService i UnityGameModeSettingsDefinition per a la configuració específica de Unity
- Configuració de senyals a través de UnityGameModeSignalConfiguration
- Instal·lador que registra el servei per a tot el projecte
- Integració amb menús, música, input i ajustos mitjançant senyals
Quan fer-lo servir
- Projectes amb més d'un estat de pantalla al qual els sistemes de gameplay han de reaccionar.
- Jocs que necessiten que el comportament de pausa sigui intercanviable per projecte o per build.
- Equips que volen transicions d'estat tipades com a senyals en lloc d'esdeveniments per string.
- Bases de codi que necessiten un lloc net per bloquejar l'arrencada del gameplay fins que input, ajustos i altres sistemes estiguin llestos.
Sistemes relacionats
Utilitza Serenity quan vulguis una capa de game mode que ja coopera amb menús, música, input i modals, però que et segueix deixant decidir els modes i transicions que encaixen amb el teu joc.
English
Español
Català