Game Settings per a Unity

Casos d'ús get i set tipats per a ajustos bool, int, float i string, amb persistència i senyals d'actualització ja integrades.

Per a què serveix aquest sistema

Els ajustos del joc semblen enganyosament senzills. Un slider de volum, un preset de qualitat, una tria d'idioma i un toggle de gràfics no semblen gran cosa. Després el projecte creix. Els ajustos comencen a dependre uns dels altres, el codi de joc reacciona als seus canvis, la persistència ha de ser fiable entre plataformes i el menú d'ajustos esdevé una de les peces d'UI més tocades. La majoria d'equips construeix el seu sistema ad hoc, ensopega amb els mateixos problemes i intenta apedaçar-lo.

El sistema Game Settings de Serenity és la manera de la foundation de dir que els ajustos mereixen un servei real. Els valors són tipats, les lectures i escriptures passen per casos d'ús, la persistència és una preocupació separada i els canvis són observables a través de senyals.

El problema a Unity

Sense una capa d'ajustos real, els projectes tendeixen a derivar a un de dos patrons. O bé cada ajust és una clau de PlayerPrefs referenciada per string, repartida per tota la base de codi, o existeix una classe Settings estàtica pròpia que creix fins que ningú vol tocar-la. Tots dos fan difícil afegir un ajust amb seguretat, testejar la lògica d'ajustos i reaccionar a canvis des del codi de joc.

La persistència és l'altra meitat del problema. Els ajustos han de sobreviure entre sessions. Necessiten un moment definit per escriure's, un altre per restaurar-se i una manera definida de resetejar a valors per defecte. Quan aquests moments estan dispersos, els ajustos perden dades o es neguen a aplicar canvis fins a la propera arrencada.

Com ho aborda Serenity

Serenity exposa els ajustos a través d'IGameSettingsService amb els casos d'ús SetGameSettingsValue i GetGameSettingsValue. Existeixen variants tipades per a valors bool, int, float i string, tant en DTOs d'entrada com de sortida. Les actualitzacions són observables a través d'OnGameSettingsOnValueUpdatedSignal. La persistència es descriu mitjançant IGameSettingsPersistenceSettings i IGameSettingsRepository, i les intencions de resetejar i persistir són senyals de primer nivell: OnPersistGameSettingsSignal i OnResetGameSettingsToDefaultSignal.

Els valors per defecte, la persistència i qualsevol precàrrega d'assets dependents viuen darrere de les seves pròpies interfícies. El menú d'ajustos llegeix i escriu a través del servei. Altres sistemes se subscriuen a la senyal d'actualització quan necessiten reaccionar a un canvi.

Com encaixa a Serenity

Game Settings viu al namespace Serenity.GameSettings. Entitats de Domini com GameSettingsEntity i StoredSettingsPayload descriuen les dades. La capa d'Aplicació exposa el servei, els DTOs tipats i les senyals d'actualització. Els helpers de precàrrega d'assets IGameSettingsAssetPreloader i IGameSettingsAssetPreloadingIntegrator coordinen qualsevol asset addressable que depengui dels ajustos.

Game Settings connecta amb el Sound Mixer per a volums persistents per categoria, amb Localització per a l'idioma de joc i de veu actius, amb Game Mode per a canvis d'ajustos dirigits per estat, amb l'Event Dispatcher per a les senyals d'actualització i reset i amb el Sistema de Menús i el de Modals per a la pantalla d'ajustos i la seva confirmació de reset. El resultat és una capa d'ajustos que la resta de la foundation ja entén.

Flux de treball pràctic

  1. Configura els ajustos persistents que el teu joc exposa mitjançant una definició d'ajustos.
  2. Tria un backend de persistència, per exemple PlayerPrefs o emmagatzematge en fitxer, darrere d'IGameSettingsRepository.
  3. Llegeix valors amb GetGameSettingsValue i escriu-los amb SetGameSettingsValue.
  4. Subscriu-te a OnGameSettingsOnValueUpdatedSignal on necessitis reaccionar a un canvi.
  5. Llança OnPersistGameSettingsSignal als moments en què vulguis gravar els ajustos a emmagatzematge.
  6. Fes servir OnResetGameSettingsToDefaultSignal per resetejar els ajustos des d'un menú o un flux modal.

Què inclou

  • Casos d'ús tipats SetGameSettingsValue i GetGameSettingsValue amb variants bool, int, float i string
  • Senyal d'actualització OnGameSettingsOnValueUpdatedSignal per a sistemes reactius
  • Interfície de persistència IGameSettingsRepository i ajustos IGameSettingsPersistenceSettings
  • Senyals de persistir i resetejar OnPersistGameSettingsSignal i OnResetGameSettingsToDefaultSignal
  • Helpers de precàrrega d'assets addressables que depenen dels ajustos
  • Integració amb Sound Mixer, Localització, Game Mode i l'Event Dispatcher
  • Instal·lador que registra el servei per a tot el projecte
  • Separació neta entre les capes de Domini, Aplicació i Infraestructura

Quan fer-lo servir

  • Projectes que exposen un menú d'ajustos real amb diverses categories.
  • Jocs que necessiten que els ajustos persisteixin entre sessions i es reseteixin a valors per defecte de manera fiable.
  • Equips que volen una capa d'ajustos tipada i observable en lloc de claus de PlayerPrefs soltes.
  • Bases de codi que necessiten que altres sistemes reaccionin a canvis d'ajustos sense fer polling.

Sistemes relacionats

Utilitza Serenity quan vulguis una capa d'ajustos que ja coopera amb mixers, localització i menús, però que et segueix deixant triar el backend de persistència i el contracte de valors per al teu joc.

Tornar a la pàgina principal