Gestió de sessions de joc
Un servei de sessió centralitzat que és propietari del cicle de vida de cada partida — estat, temps transcorregut i identitat — perquè cap subsistema no l'hagi de duplicar.
Per a què serveix aquest sistema
Tots els jocs tenen una partida. Comença, es pot pausar i reprendre, i acaba en fallada o en èxit. El problema és que cada subsistema que necessita saber alguna cosa sobre aquest cicle de vida — el HUD, el comptador de puntuació, el sistema de checkpoints, el controlador de música — tendeix a fer-ne un seguiment propi amb les seves variables i booleans.
Game Session a Serenity és l'únic lloc on viu el cicle de vida d'una partida. Manté el GameSessionStatus actual, el temps transcorregut i un GameSessionId estable, i exposa un GameSessionSnapshot immutable per a qualsevol sistema que necessiti llegir aquest estat sense modificar-lo.
El problema a Unity
En un projecte Unity sense un agregat de sessió, la pregunta '¿la partida és activa en aquest moment?' es respon de manera diferent a cada sistema. El HUD comprova un flag estàtic. El temporitzador comprova si Update s'està executant. El sistema de checkpoints comprova un booleà d'escena. Poden desincronitzar-se. Una pausa des d'un sistema no atura el temporitzador a un altre. El temps transcorregut s'acumula durant la càrrega perquè ningú és propietari de l'inici i el final.
El problema de fons és que no existeix una identitat canònica de partida. Reiniciar una partida implica localitzar cada sistema que ha emmagatzemat alguna cosa i notificar-lo individualment. Afegir un nou sistema que necessita l'estat de sessió significa decidir de nou d'on llegir-lo.
Com ho aborda Serenity
IGameSessionService centralitza aquesta coordinació. Exposa Status, ElapsedTime i SessionId com a propietats de només lectura i dirigeix les transicions mitjançant mètodes explícits: StartSession, Pause, Resume, GameOver i Complete. L'enum GameSessionStatus captura cada estat vàlid — NotStarted, Playing, Paused, GameOver i Completed — perquè la lògica de transició sigui inequívoca.
GetSnapshot retorna un GameSessionSnapshot: un struct immutable de només lectura que conté la identitat de sessió, l'estat actual, el temps transcorregut i un snapshot de puntuació en aquell moment. El HUD, la interfície i qualsevol altre consumidor de només lectura criden GetSnapshot i obtenen una imatge coherent de la partida sense tocar estat mutable.
Com encaixa a Serenity
Game Session viu al namespace Serenity.GameSession i segueix l'estructura per capes de la foundation. La capa de Domini defineix l'enum GameSessionStatus, el value object GameSessionId, l'entitat GameSessionState i el value object GameSessionSnapshot. La capa d'Aplicació exposa IGameSessionService. La capa d'Instal·lació proporciona GameSessionInstaller, que connecta el servei amb la pipeline d'inicialització juntament amb una dependència ITimerService per al seguiment del temps transcorregut.
Game Session coopera amb l'agregat Timer a través de ConfigureTimer: el servei pren la propietat del cicle de vida del temporitzador — inicialitzar, iniciar, pausar, reprendre, aturar — perquè el temporitzador reflecteixi sempre l'estat de sessió amb exactitud. També coopera amb Score (el snapshot inclou un ScoreSnapshot), amb Checkpoint per a la integració de punts de desament, amb Game Mode per al context i amb l'Event Dispatcher per publicar senyals de cicle de vida als subsistemes interessats.
Flux de treball pràctic
- Estén GameSessionInstaller al teu projecte per crear i registrar la implementació d'IGameSessionService.
- Crida ConfigureTimer abans de StartSession per assignar a la sessió el seu temporitzador de temps transcorregut.
- Crida StartSession amb un GameSessionId — fes servir GameSessionId.NewGuid() per a identitats generades automàticament.
- Dirigeix les transicions mitjançant els mètodes del servei: Pause, Resume, GameOver o Complete segons dictin les regles del joc.
- Crida Tick a cada frame perquè la sessió avanci el temporitzador mentre l'estat sigui Playing.
- Llegeix l'estat de sessió des de qualsevol subsistema mitjançant GetSnapshot — el GameSessionSnapshot retornat és un struct immutable segur per passar a qualsevol lloc.
Què inclou
- Interfície de servei de sessió IGameSessionService amb les propietats Status, ElapsedTime i SessionId
- Mètodes de cicle de vida explícits StartSession, Pause, Resume, GameOver i Complete
- Enum GameSessionStatus que cobreix NotStarted, Playing, Paused, GameOver i Completed
- Model de lectura immutable GameSessionSnapshot amb identitat, estat, temps transcorregut i puntuació
- Value object GameSessionId amb generació automàtica mitjançant NewGuid i semàntica d'igualtat estable
- Propietat del temporitzador mitjançant ConfigureTimer — el servei inicia, pausa i atura el temporitzador automàticament
- Classe base GameSessionInstaller per connectar el servei amb la pipeline d'inicialització
- Cooperació amb Score, Checkpoint, Game Mode i l'Event Dispatcher a través d'interfícies compartides
Quan fer-lo servir
- Projectes on diversos sistemes mantenen la seva pròpia versió de 'la partida és activa' i acaben desincronitzats.
- Jocs que necessiten un temps transcorregut fiable que es pausi i es reprengui amb la sessió en lloc d'executar-se contínuament.
- Bases de codi que volen una identitat de sessió estable perquè reiniciar una partida signifiqui crear una sessió nova, no localitzar estat emmagatzemat a la memòria cau.
- Qualsevol projecte on el HUD o la interfície necessitin un snapshot coherent i immutable de l'estat de sessió sense acoblar-se als interns mutables.
Sistemes relacionats
Utilitza Serenity quan vulguis un únic lloc que sigui propietari de la partida — perquè pausar-la, reprendre-la i acabar-la es propagui automàticament a cada sistema que llegeix de la sessió, en lloc de requerir actualitzacions manuals coordinades.
English
Español
Català