Registre de canvis

Últimes actualitzacions i millores de Serenity.

Tornar a l'inici

1.1.0 — Àudio posicional i per prioritat, cues de loop musical, bucles d’efectes de mixer, menús lazy i comporta d’input per GameMode

Breaking Changes

  • SpawnPose ja no exposa els set camps float plans (PositionX/Y/Z, RotationX/Y/Z/W). Ara està recolzat per Position (System.Numerics.Vector3) i Rotation (System.Numerics.Quaternion). La construcció no es veu afectada — el constructor de set float i FromPosition(x, y, z) es mantenen — però el codi que llegia els camps float individuals ara ha de llegir pose.Position.* / pose.Rotation.*.

Afegit

  • Comporta d’input principal com a GameMode — un valor PrimaryInputGate a l’enum GameMode permet que el prompt d’input principal reutilitzi la maquinària existent de senyals de transició d’entrada/sortida per mode. L’emmagatzematge serialitzat, la recuperació i les llistes reordenables d’entrada/sortida a l’inspector es generen automàticament per al nou mode.
  • Loops musicals conservant la cuaStartTime, EndTime, TailPreservingLoop, TailFadeOutDuration i TailFadeOutCurve a IMusicTrackDefinition / MusicTrack / UnityMusicTrackDefinition. Una segona veu transporta la cua de reverb/ambient de la passada anterior a través de la unió del loop, programada amb precisió de mostra mitjançant AudioSettings.dspTime / PlayScheduled, de manera que el loop no produeixi mai clicks. Els punts de loop es defineixen com a codis de temps HH:MM:SS:MMM o en termes de DAW — tempo, compàs, barra d’inici/final — mitjançant MusicBarTimeCalculator; el fade de la cua segueix una corba Lineal/Exponencial/Logarítmica/S-Curve/Custom.
  • Reproducció d’àudio posicional — objecte de valor AudioWorldPosition i PlaybackPosition opcional a AudioPlayerPlayClipInput; un clip reproduït amb posició es reprodueix en 3D en aquell punt, i sense posició es manté en 2D. Funciona tant des d’una crida directa al cas d’ús com des d’un senyal PlayAudioClip, sense canvis a la signatura del gateway/servei.
  • Assignació per prioritat de sons — quan el pool d’AudioSource és ple, un clip pot prendre el control d’un so en reproducció de menor prioritat en lloc de ser descartat. Això es governa mitjançant Priority / PriorityPolicy / CanBeReplaced per clip i un AudioPriorityCandidateSelector (AudioPriorityPolicy: IgnoreIfNoSourceAvailable / ReplaceLowerPriority / ReplaceLowerOrEqualPriority / AlwaysReplace). La semàntica de prioritat de Serenity — com més alt, més important — es mapeja a la prioritat invertida d’AudioSource.priority de Unity només al límit amb Unity.
  • Eina d’autoria d’AudioMixer Effect Loop (Tools ▸ Serenity ▸ Audio ▸ Create Audio Mixer Effect Loop) — crea un grup de mixer amb una cadena Receive → effects → Attenuation i un asset reutilitzable UnitySoundMixerEffectLoopDefinition que el descriu.
  • Finestra de sincronització d’Effect Loops (Tools ▸ Serenity ▸ Audio ▸ Sync Effect Loops) — reconcilia l’AudioMixer i SoundMixerSettings amb les definicions d’effect-loop del projecte: crea un Send per cada source cap al Receive del loop, l’exposa com {Source}_{Loop}_Send i registra la definició. És idempotent i additiva.
  • Selecció de grups source a l’eina de creació — permet triar quins grups germans alimenten el loop, amb Select All / None.
  • Scripts d’accions enable/disable autogenerats — per a cada grup source seleccionat, genera una parella d’acció/senyal Enable + Disable d’EventDispatcher — reutilitzant el generador compartit de scripts d’accions — ja preconfigurada per aplicar/netejar el loop en aquell grup, escrita en una carpeta Events configurable.
  • Aplicar/netejar effect-loops en runtime: ISoundMixerService.ApplyEffectLoop / ClearEffectLoop, SoundMixerApplyEffectLoopSignal / SoundMixerClearEffectLoopSignal, els seus casos d’ús, DTOs només d’intenció i un SoundMixerEffectLoopRouteResolver pur i independent del motor.
  • UnitySoundMixerEffectLoopDefinition / UnitySoundMixerEffectLoopSource com a ScriptableObjects amb inspector personalitzat, a més d’un registre EffectLoops a SoundMixerSettings.
  • AudioMixerYamlReader només per a editor — llegeix l’estructura de .mixer — i AudioMixerEffectLoopReflectionAdapter — aïlla l’API interna UnityEditor.Audio darrere d’una única classe.
  • Mode d’instanciació per menúMenuInstantiationMode (PreloadOnStartup / LazyOnFirstOpen) a IMenuSettingsDefinition i UnityMenuSettingsDefinition, editable sota una secció Advanced a l’inspector de configuració del menú.
  • Pipeline d’instanciació lazy de menús: IMenuInstanceGate, MenuLifecycleResolver, EnsuringMenuTransitionateToView, UnityMenuLazyBuildContext, UnityMenuLazyRegistration i IUnityMenuViewInstanceFactory / UnityMenuViewInstanceFactory.
  • Senyals de transició de sortida per modeIGameModeSettingsDefinition.GetExitSignalsForGameMode; l’inspector de configuració de GameMode ara mostra llistes reordenables separades de senyals d’entrada/sortida per mode.
  • Pausa durant la càrrega d’escena — ajust PauseDuringSceneLoad de GameMode — activat per defecte — amb un toggle a l’editor de settings, que congela el rellotge del joc mentre es carrega l’escena additiva de gameplay i el restaura — mitjançant try/finally — quan finalitza la càrrega, evitant que els objectes acabats d’instanciar simulin darrere de l’overlay de càrrega.
  • Generació de configuració en la primera execució — en una instal·lació nova, l’idioma detectat del sistema operatiu/navegador ara es persisteix a gameSettings.cfg en el moment de la detecció — standalone mitjançant UnitySystemConfigurationSnapshotStore; WebGL/ResourcesOnly mitjançant SerenityFallbackLocalizationService — protegit per una comprovació d’existència del fitxer per preservar la preferència guardada dels jugadors que tornen.

Canviat

  • SpawnPose ara està recolzat per System.Numerics Vector3 Position + Quaternion Rotation — substituint els set float plans —, seguint el patró d’objecte de valor RailNodePosition de GameRail; es manté com a C# pur, sense dependència del motor. UnityWaveService llegeix pose.Position.* / pose.Rotation.*. Vegeu Breaking Changes.
  • UnityAudioPlayerService.ApplyPlaybackPlacement ara és l’única font de veritat per a AudioSource.spatialBlend — amb posició → 1 i l’emitter es mou allà; sense posició → 0 i l’emitter es deixa al seu lloc —; ApplyClipToSource ja no aplica l’spatial blend del clip.
  • UnityGameModeService despatxa els senyals del mode sortit després d’OnExitMode, reflectint el comportament existent dels senyals d’entrada; entrar a PrimaryInputGate dispara els seus senyals d’entrada i sortir-ne dispara els seus senyals de sortida mitjançant el mateix dispatch de SetMode.
  • El pause mixer effect loop ara es controla mitjançant senyals d’entrada/sortida de GameMode — Enable en entrar a Pause, Disable en sortir de Pause — en lloc de classes d’acció dedicades.
  • UnityMenuService construeix els menús LazyOnFirstOpen quan es mostren per primera vegada — cachejats i reutilitzats —; els menús PreloadOnStartup continuen sent eager. Els menús inicials i de pausa configurats com a lazy es tracten com a preload per evitar estrebades en la primera obertura. El comportament per defecte no canvia — PreloadOnStartup continua sent el valor per defecte.
  • UnitySoundMixerSettingsEditor ara llegeix els paràmetres exposats en viu des de l’AudioMixer en memòria — s’actualitza automàticament mentre edites, sense necessitat de desar — i etiqueta la llista de definicions registrades de manera diferenciada respecte a l’encapçalament de la secció.
  • Les definicions d’effect-loop fan servir un únic DefaultWet normalitzat — dry és el seu complement, 1 - wet —, mostrat com un slider "Dry/Wet"; l’eina de creació accepta carpetes de destí separades per a Media i Events.
  • El nivell de sortida del loop es tracta com un trim estàtic del mixer — no com un paràmetre runtime exposat —; el Send del source segueix el nivell actual del grup source.
  • UnityYamlUtils es va mantenir com a helper YAML genèric — tot el coneixement específic d’AudioMixer YAML es va moure al mòdul SoundMixer.

Features

  • El prompt de selecció de dispositiu ara és un GameMode observable (PrimaryInputGate) que dispara efectes secundaris mitjançant senyals d’entrada/sortida sense transicionar els modes de joc per si mateix — en seleccionar dispositiu emet OnPrimarySelected i la composition root despatxa EnterMenuSignal, permetent que l’acció EnterMenu canviï el mode.
  • La música pot fer loop entre punts d’inici/final definits mentre una segona veu transporta la cua de reverb de la passada anterior a través de la unió, amb un fade-out de cua acotat i definit per corba — una durada de 0 talla netament al punt de loop.
  • Els sons poden reproduir-se en una posició del món — 3D — i poden reclamar un slot ocupat del pool a un so de menor prioritat en lloc de ser descartats.
  • Un effect loop pot ser creat, cablejat, registrat i activat/desactivat des de gameplay — per exemple, un low-pass/reverb de pausa sobre Music — d’extrem a extrem des de l’editor, sense escriure a mà routing ni scripts d’accions.
  • Els menús poden optar per creació lazy en la primera obertura, reduint el treball d’arrencada, mentre es conserva l’arrencada eager per als menús que ho necessiten.
  • Els modes de joc poden executar efectes secundaris mitjançant senyals tant en entrar com en sortir d’un mode.

Corregit

  • Els canvis de valor de menú ara s’apliquen a l’opció que realment ha canviat — no a l’actualment seleccionada — i resolen l’opció seleccionada pel seu GetIndex() lògic en lloc de per la seva posició a la jerarquia, corregint valors de sliders entrellaçats on dues opcions compartien un mateix UiOptionValue — per exemple, master/ambient.
  • ISoundMixerService ara està registrat al ServiceLocator runtime, de manera que les accions d’EventDispatcher el poden resoldre.
  • Els GUIDs de nivell de mescla de Send per source es preassignen quan es crea el Send, de manera que exposar el nivell de Send de cada source ara funciona correctament.
  • S’han eliminat referències [SerializeReference] penjants a tipus de senyals d’acció eliminats en assets d’exemple — un tipus managed desconegut estava anul·lant els altres senyals vàlids en entrar a Play.

Eliminat

  • Classes redundants EnablePauseMixerEffectLoopAction / DisablePauseMixerEffectLoopAction i l’asset d’exemple PauseEffectLoop — substituïts per senyals de sortida de GameMode i el generador de scripts d’accions.
  • Un mapping erroni de SoundMixerSettings (Music_SucutruleLoop_SendAudio_MasterVolume) que referenciava un paràmetre exposat del mixer inexistent.

Infraestructura

  • Afegits tests per al route resolver de SoundMixer effect-loop, effect loop, installer, casos d’ús i cobertura.
  • Afegits tests per al resolver de lifecycle de Menu, el cas d’ús ensure-transition i l’enum de mode d’instanciació de menú.
  • Afegits tests per al music bar/time calculator, fade-curve evaluator i getters de music-track; audio world-position i placement; selecció de candidats per prioritat d’àudio i prioritat de clips; construcció de SpawnPose; i les accions/senyals de primary-input-gate de GameMode.

1.0.12 — Suport WebGL, tema Serenity i localització en runtime

Afegit

  • Tema Serenity — un nou tema d'UI complet amb un conjunt complet de components (Background, Title, Label, Input, Dropdown, Selector, Slider, Toggle, Submit, Modal, PrimaryInputPrompt, Highlight), incloent-hi animator controllers per al bucle de color del highlight i les transicions de mostrar/amagar modals.
  • Suport per a builds WebGL — el primer target de compilació WebGL per a Serenity.
  • Eines d'exportació de recursos per a WebGLSerenityWebGLResourcesExporter, SerenityWebGLResourcesCleaner, SerenityWebGLResourcesValidator, SerenityWebGLResourcesPaths i SerenityWebGLExportManifest per exportar assets de Serenity a l'arbre Resources del consumidor per a builds WebGL.
  • Fallback de localització en runtimeSerenityFallbackLocalizationService carrega JSON per cada parell (taula, locale) des de Resources i respon al nou ILocalizationService.TryTranslate(key, out value), permetent la traducció i el canvi d'idioma en viu en mode ResourcesOnly (WebGL).
  • Barra de progrés de càrrega per tema — un slot LoadingProgressTemplate als components del tema d'UI i una variant de prefab LoadingBar per a cada tema (Default, Alternative, Alternative2, Animated, Animated2, Futuristic, Serenity, Writings).
  • Enum SerenityAssetLoadingMode i interfícies/implementacions IAssetLoadingModeProvider / UnitySerenityAssetLoadingModeProvider per seleccionar com es carreguen els assets (Addressables vs. només Resources).
  • Esdeveniment ILocalizationService.GameLanguageChanged, disparat quan realment canvia el valor de l'idioma.
  • Comanda de menú a l'editor (Serenity ▸ UI ▸ Generate LoadingProgress Prefabs) que genera les variants de prefab de barra de càrrega per tema i les connecta amb les definicions de tema.
  • Camp "Loading Progress Prefab" a l'inspector de la definició del tema d'UI.
  • Família tipogràfica Inter (pesos variables i estàtics amb assets SDF) i imatges de suport (WhiteBackground, square-roundborder).

Canviat

  • L'overlay de càrrega de gameplay ara construeix la seva barra de progrés a partir de LoadingProgressTemplate, recorrent a SlideableTemplate quan no hi ha cap prefab dedicat assignat.
  • UnityUiTMP_TextLocalizationUpdaterComponent ara crida TryTranslate en mode fallback, desa a la memòria cau la clau original de localització entre canvis d'idioma i la torna a capturar quan el text mostrat difereix de l'última traducció.
  • UnityLocalizationService manté GameLanguageChanged com a no-op, delegant el refresc a la pròpia cadena OnSelectedLocaleChanged de Unity Localization.
  • Corregit el comportament de UnityPrimaryInputPromptView per a builds WebGL.
  • InitializationPipelineService, UnityCutscenePlayerService, ReflectionCallTask, AddressablesAssetLocator, UnityAddressableUtils, UnityAssetUtils, AudioMixerDependencyCache i UnityMainThreadDispatcher actualitzats per suportar càrrega només mitjançant Resources i restriccions de WebGL.
  • El grup Addressables de Serenity i la configuració d'Addressables s'han actualitzat per registrar els nous assets.

Funcionalitats

  • El mode ResourcesOnly ara fa traducció real i permet canviar d'idioma en runtime mitjançant el selector d'idioma de la UI d'ajustos.
  • L'exportació de Resources per a WebGL utilitza semàntica de moviment durant l'exportació i recorre a l'idioma del navegador com a locale inicial.
  • El JSON de localització es carrega mitjançant un escaneig recursiu amb Resources.LoadAll<TextAsset>("") i un filtre de forma de string table, sense requerir acoblament amb l'asmdef de Unity.Localization.Editor.

Corregit

  • Corregida la desaparició del selector de la barra de càrrega en sortir el ratolí, fent servir un prefab dedicat de progrés de càrrega en lloc de reutilitzar la plantilla interactiva del slider.
  • Corregits els builds ResourcesOnly que anteriorment mostraven les claus de localització en pantalla sense manera de canviar d'idioma en runtime.
  • Corregit el selector d'idioma —els valors del qual són alhora claus de localització— que traduïa la clau desada a la memòria cau obsoleta en lloc de l'actual.

Infraestructura

  • Afegides eines d'editor per a exportació, neteja, validació i seguiment mitjançant manifest de Resources per a WebGL.
  • L'exportació de localització basada en reflection evita l'acoblament amb l'asmdef de Unity.Localization.Editor.
  • Afegits tests per als casos d'ús de localització i l'instal·lador de localització.

1.0.8 — Selectors d’Editor, Autoetiquetatge d’Addressables i Validació de TMP Essentials

Afegit

  • SerenityTmpEssentialsValidator, un validador només d’editor que detecta recursos essencials de TextMeshPro absents i intenta importar-los automàticament quan és possible.
  • Protecció en Play Mode davant TMP Essentials absents, cancel·lant l’entrada en Play Mode abans que es puguin produir errors de runtime de Unity/TMP.
  • Diàleg manual de recuperació de TMP Essentials amb opcions per obrir l’importador de TMP, ignorar l’avís durant la sessió actual o tornar a comprovar.
  • Postprocessador d’importació de Serenity que programa una comprovació de TMP Essentials cada vegada que s’importen assets de Serenity en una sessió de l’editor de Unity ja oberta.
  • SerenityAddressablesAutoLabeler, un postprocessador només d’editor que registra automàticament els assets ScriptableObject de Serenity acabats d’importar com a Addressables.
  • Assignació automàtica de labels d’Addressables per a assets ScriptableObject de Serenity basada en mapatges exactes de tipus i regles de fallback per prefix de namespace.
  • Constants ModuleLabels centralitzades per a totes les labels de mòdul i labels de tipus de Serenity.
  • Constants ModuleLabels.Types per a labels d’Addressables basades en tipus, com ara assets de font, imatge, àudio i personatge.
  • Labels de mòdul addicionals per als sistemes Character, GameMode, SequencePlayer i Wave.
  • Combinacions comunes de labels addicionals per a GameSettings + Localization i GameSettings + UI.
  • Helper RenderIdObjectField<TAsset>(...) a FoundationEditor per renderitzar ObjectFields de Unity recolzats per ids serialitzats en string.
  • EventDispatcherSignalTypePicker, un selector compartit amb cerca per a subtipus concrets d’EventDispatcherSignal.
  • EventDispatcherSignalTypeAdvancedDropdown, un selector amb cerca basat en AdvancedDropdown per a camps string de tipus de senyal.
  • Label d’Addressables module:game-mode.
  • Registre i etiquetatge d’Addressables per a GameModeSettings.

Canviat

  • SerenityPackageDependencyInstaller ara considera TextMeshPro satisfet quan els tipus runtime de TMP estan disponibles, encara que com.unity.textmeshpro no consti com a paquet independent.
  • La detecció de dependències de TextMeshPro ara suporta configuracions de Unity 6 / UGUI 2.0+ on TMP ve inclòs amb com.unity.ugui.
  • Les cadenes de labels d’Addressables ara passen per Serenity.Shared.Constants.ModuleLabels en lloc de literals string hardcodejats.
  • InstallationConstants.ModuleLabels ara actua com a shim de compatibilitat que reexporta els valors canònics de ModuleLabels.
  • InstallationConstants.TypeLabels ara actua com a shim de compatibilitat que reexporta ModuleLabels.Types.
  • UnityAddressablesLabeler ara usa constants centralitzades de ModuleLabels per a labels gestionades, regles de ruta i regles de tipus.
  • UnityAddressablesLabeler ara gestiona labels addicionals de Serenity per als mòduls Character, GameMode, SequencePlayer i Wave.
  • UnityAudioPlayerInstaller, UnityMusicPlayerInstaller, UnityGameSettingsInstaller, UnityLocalizationInstaller, UnityMenuInstaller, UnityModalInstaller, UnityPlayerInputInstaller, UnitySoundMixerInstaller, UnitySystemConfigurationInstaller, UnityCharacterInstaller i els serveis relacionats amb Cutscene/Sequence ara usen constants centralitzades de labels de mòdul.
  • AudioMixerDependencyCache ara usa per defecte ModuleLabels.AUDIO_MIXER en lloc d’una label d’Addressables hardcodejada.
  • UnityUiSettingsEditor ara renderitza ScaleKey i FontSizeKey com a ObjectFields de Unity recolzats per assets UnityUIGameSettingsDefinition.
  • UnityGameGraphicsSettingsEditor ara renderitza QualityLevelKey, ScreenResolutionKey i IsFullScreenKey com a ObjectFields de Unity recolzats per assets UnityGraphicGameSettingsDefinition.
  • UnityLocalizationSettingsEditor ara renderitza GameLanguageKey i VoiceLanguageKey com a ObjectFields de Unity recolzats per assets UnityLocalizationGameSettingsDefinition.
  • UnityMenuServiceSettingsDefinitionEditor ara renderitza InitMenuId com un ObjectField de Unity recolzat per assets UnityMenuSettingsDefinition.
  • UnityGameModeSettingsDefinitionEditor ara renderitza PauseMenuId com un ObjectField de Unity recolzat per assets UnityMenuSettingsDefinition.
  • UnityActionDefinitionEditor ara renderitza Signal mitjançant un selector de tipus de senyal amb cerca en lloc d’un dropdown simple.
  • UnityModalSettingsEditor ara renderitza SignalType mitjançant un selector de tipus de senyal amb cerca en lloc d’un dropdown simple.
  • UnityModalSettingsEditor ara comparteix el descobriment de tipus de senyal mitjançant EventDispatcherSignalTypePicker, evitant lògica de reflexió duplicada.
  • UnityMenuSettingsDefinitionEditor ara usa constants centralitzades de labels de mòdul en resoldre game settings i menús.
  • UnitySoundMixerSettingsEditor ara usa constants centralitzades de labels de mòdul en resoldre game settings d’àudio.
  • Els assets de menú d’exemple de Serenity s’han reserialitzat per incloure valors ViewId explícits en opcions i valors.
  • Els assets de menú d’exemple de Serenity ara inclouen arrays OnShow i OnHide explícitament buits.
  • L’asset d’exemple GameModeSettings ara inclou entrades de senyals de transició per als valors més nous de l’enum GameMode.

Funcionalitats

  • Els assets ScriptableObject de Serenity creats recentment ara es poden afegir automàticament al grup Addressables de Serenity amb les labels de mòdul correctes.
  • L’autoetiquetatge d’Addressables ara suporta mapatges exactes de tipus per a assets coneguts de Serenity i fallback de namespace per a assets futurs dins de mòduls existents.
  • Els selectors d’editor per a referències ScriptableObject recolzades per ids en string ara suporten drag-and-drop des de la finestra Project.
  • Els selectors d’editor per a referències ScriptableObject recolzades per ids en string ara suporten el flux estàndard de cerca de l’Object Picker de Unity.
  • Els camps de tipus de senyal ara ofereixen selecció amb cerca tot preservant els contractes string serialitzats originals.
  • UnityActionDefinition.Signal continua emmagatzemant Type.FullName.
  • UnityModalSettings.SignalType continua emmagatzemant Type.AssemblyQualifiedName.
  • UnityModalSettings.SignalType conserva l’opció <None>, emmagatzemant un string buit quan no hi ha selecció.
  • La validació de TMP Essentials s’executa tant en l’arrencada/importació de l’editor com de manera síncrona en entrar a Play Mode.
  • L’autoimportació de TMP Essentials intenta localitzar el paquet mitjançant utilitats d’editor de TMP, metadades del Package Manager o Library/PackageCache.

Millorat

  • L’UX de l’Inspector ara s’acosta més als fluxos estàndard de Unity per a referències recolzades per assets.
  • S’han reduït les seleccions invàlides accidentals causades per dropdowns llargs sense cerca.
  • S’ha reduït el codi duplicat de dropdown i reflexió entre editors personalitzats.
  • La gestió de labels d’Addressables ara és més segura i més fàcil de mantenir gràcies a una única font de veritat.
  • L’autoetiquetatge d’Addressables és idempotent i no destructiu: no elimina labels existents i només afegeix labels conegudes de Serenity.
  • La detecció del paquet TMP és més robusta entre versions de Unity.
  • La detecció de TMP Essentials ara distingeix entre tenir instal·lat el runtime de TMP i tenir presents els TMP Essential Resources reals dins d’Assets/.
  • Els diagnòstics de TMP Essentials ara registren coincidències d’assets de font TMP sense tractar-les com a prova que Essentials està instal·lat.
  • El codi d’instal·ladors i editors ara evita escampar labels d’Addressables hardcodejades per tot el codi base.
  • Les definicions d’assembly s’han actualitzat quan calia perquè els mòduls puguin referenciar les constants compartides de labels.

Corregit

  • Corregida una detecció falsa de dependència absent per a TextMeshPro en versions de Unity on TMP ve inclòs a través d’UGUI en lloc d’instal·lar-se com com.unity.textmeshpro.
  • Corregit l’etiquetatge absent module:game-mode per a GameModeSettings.
  • Corregits diversos camps d’editor que abans requerien selecció per dropdown tot i representar ids recolzats per assets.
  • Corregit que UnityActionDefinition.Signal i UnityModalSettings.SignalType continuessin com a dropdowns sense cerca després del primer refactor del selector.
  • Corregida la lògica duplicada de descobriment de tipus de senyal entre la selecció de senyal de modal i els menús de senyal dels botons de modal.
  • Corregit l’ús de labels d’Addressables hardcodejades en diversos instal·ladors i utilitats d’editor.
  • Corregida la cobertura de labels gestionades d’Addressables per a mòduls més nous de Serenity com Character, GameMode, SequencePlayer i Wave.

Infraestructura

  • Afegides utilitats d’editor per al registre automàtic d’Addressables i l’assignació de labels.
  • Afegides utilitats d’editor per a la validació i recuperació de TMP Essentials.
  • Afegida infraestructura compartida de selectors d’editor per a la selecció de tipus de senyal.
  • Afegit helper d’editor compartit per fer de pont entre ObjectField i string-id.
  • Afegides referències de definició d’assembly a Serenity.Shared.Constants allà on ara s’usen constants centralitzades de labels.
  • Actualitzada la configuració d’Addressables per eliminar labels obsoletes i incloure la nova label module:game-mode.
  • Actualitzat el grup Addressables de Serenity perquè Media/GameMode/GameModeSettings estigui etiquetat amb module:game-mode.
  • Actualitzats els assets serialitzats d’exemple perquè coincideixin amb el model de dades actual de menú i game mode.

1.0.5 — Transicions de Music Player, Senyals de GameMode i Integració amb Menu

Afegit

  • Enum MusicPlayerTransitionType amb tres estratègies de transició: CUT, FADEIN_FADEOUT i CROSS_FADE.
  • Paràmetres de transició configurables a IMusicPlayerService.PlaySong(...) i nou mètode PlaySongById(...).
  • Cas d’ús MusicPlayerPlaySongById i DTO MusicPlayerPlaySongByIdInput per reproduir pistes concretes per identificador amb control explícit de loop i transició.
  • Mètode de gateway PlaySongById a IMusicPlayerGateway.
  • Contracte SetGameModeService(IGameModeService) a IMenuService per a coordinació entre serveis.
  • Contracte GetSignalsForGameMode(GameModeEnum) a IGameModeSettingsDefinition per a configuració de senyals per mode.
  • Valors Initialization i Cutscene a l’enum GameMode, establint Initialization com el mode inicial per defecte.
  • Seqüències de transició EventDispatcherSignal per mode a UnityGameModeSettingsDefinition.
  • Orquestració DispatchModeTransitionSignals(...) a UnityGameModeService, que dispara els senyals configurats després de cada canvi de mode.
  • Inspector complet basat en ReorderableList per als senyals de transició per mode a UnityGameModeSettingsDefinitionEditor.
  • Registre de ServiceLocator per a IMusicPlayerService durant la instal·lació del music player.

Canviat

  • UnityGameModeService ara s’inicialitza en mode Initialization en lloc de Menu, ajornant la primera transició real de mode fins que el sistema de menús estigui preparat.
  • UnitySerenityInstaller.ShowMenu() ara connecta el IGameModeService resolt amb el servei de menú abans d’invocar ShowInitialMenu(), assegurant que el game mode queda sincronitzat en arrencar.
  • UnityMusicPlayerInstaller ara rep ServiceLocatorInstaller per al descobriment de serveis en runtime.
  • Format de referència de Serenity.GameMode.Domain.asmdef estandarditzat a GUID.
  • Nomenclatura d’assets preparada per a producció: Audio_SoundToTestAudio_SoundToTrigger, Audio_TrackToTestMusic_TrackList.
  • Configuració d’AudioTestingMenu actualitzada per referenciar els assets de producció reanomenats.

Funcionalitats

  • La reproducció de música ara imposa una regla d’una sola pista activa mitjançant lerping de volum basat en coroutines.
  • Les peticions de reproducció ràpides i consecutives substitueixen de manera segura les transicions anteriors (“l’última petició guanya”), evitant AudioSources orfes.
  • CROSS_FADE fa fallback automàticament a CUT quan no hi ha prou canals d’àudio configurats.
  • Els senyals de transició de GameMode es despatxen en l’ordre exacte configurat a l’inspector, amb entrades null saltades i registrades de manera segura.
  • GameMode.Menu ara s’assegura automàticament cada vegada que s’executa ShowInitialMenu(), mantenint sincronitzats el sistema de menús i l’estat de mode.

Millorat

  • L’inspector UnityGameModeSettingsDefinitionEditor ara renderitza una llista dedicada i reordenable de senyals per cada valor de GameMode, amb dropdowns de selecció de subtipus i ordenació per drag-and-drop.
  • Els elements de la llista de senyals mostren el nom del subtipus concret d’EventDispatcherSignal per identificar-los d’un cop d’ull.
  • Les definicions d’assembly Serenity.Menu.Application i Serenity.UnityMenu.Infrastructure ara referencien contractes de GameMode per a coordinació entre capes.

Corregit

  • Evitades possibles transicions recursives de mode confiant en el short-circuit de SetMode quan el mode objectiu coincideix amb el mode actual.
  • Actualitzades les signatures del stub de gateway del music player per mantenir la compatibilitat d’interfície amb el nou contracte amb transicions.

Infraestructura

  • Afegides noves referències de definició d’assembly per connectar les capes MusicPlayer, Menu i GameMode sense dependències circulars.
  • Definició d’assembly de tests ampliada per incloure Serenity.UnityMusicPlayer.Installation per a cobertura de validació a nivell d’instal·lador.

1.0.3 — Senyals de Cicle de Vida de Menú i Millores d’Inspector

Afegit

  • Afegides col·leccions de senyals de cicle de vida OnShow i OnHide a UnityMenuSettingsDefinition.
  • Afegit suport de senyals de cicle de vida de menú a IMenuSettingsDefinition.
  • Afegit despatx runtime de senyals de cicle de vida per a transicions de visibilitat de menú.
  • Afegit cablejat de senyals de cicle de vida a UnityMenuViewFactory.
  • Afegit suport SetLifecycleSignals(...) a UnityMenuView.

Funcionalitats

  • Els menús ara poden despatxar seqüències personalitzades d’EventDispatcherSignal quan es mostren o s’amaguen.
  • L’ordre d’execució dels senyals de cicle de vida ara segueix l’ordre exacte configurat a l’inspector.
  • Les col·leccions de senyals de cicle de vida ara suporten reordenació per drag-and-drop mitjançant llistes reordenables estàndard de Unity.

Millorat

  • Millorat UnityMenuSettingsDefinitionEditor amb una secció dedicada Lifecycle Signals.
  • Les llistes de senyals de cicle de vida ara ofereixen:
    • controls d’afegir/eliminar,
    • ordenació per drag-and-drop,
    • menús de selecció de subtipus,
    • estil d’inspector coherent amb la resta d’editors de Serenity.
  • Millorada la coherència d’UX de l’inspector reutilitzant els mateixos patrons de creació de senyals ja presents en altres sistemes de Serenity.

Corregit

  • Corregit el renderitzat de l’inspector de senyals de cicle de vida perquè les implementacions d’EventDispatcherSignal es puguin seleccionar correctament.
  • Corregit el flux de serialització per a senyals de cicle de vida polimòrfics amb referències gestionades de Unity.
  • Assegurat que els assets de menú legacy continuïn funcionant de manera segura amb col·leccions de senyals de cicle de vida buides.

Infraestructura

  • Reutilitzada la infraestructura existent d’EventDispatcherSignal i el flux de despatx sense introduir sistemes paral·lels de cicle de vida.
  • Mantinguts intactes els límits de Clean Architecture exposant els senyals de cicle de vida mitjançant abstraccions de capa business només de lectura.

1.0.2 — Millores d’Editor i Inspector de Localization

Afegit

  • UnityLocalizationLocaleEditorUtils, un helper d’editor basat en reflexió per al descobriment segur de locales de Unity Localization sense sobrecàrrega de dependència d’assembly.

Canviat

  • Millorat LocalizationSettingsDefinitionEditor per optimitzar l’UX dels assets UnityLocalizationGameSettingsDefinition.
  • Endurit el flux d’importació de Serenity i el procés de recuperació de localization.
  • Refactoritzat el flux de senyals de botons de l’editor de configuració de modals per obtenir interaccions d’editor més netes.

Funcionalitats

  • Bloquejat el camp ValueType a SELECTABLE amb normalització automàtica i validació de seguretat per evitar errors de configuració.
  • Substituïda l’entrada de text lliure “Key” a la taula Options per un dropdown dinàmic poblat des dels locales de Unity Localization.

Millorat

  • Afegit suport de fallback per a keys desconegudes i HelpBoxes informatius per guiar els usuaris quan la configuració de Localization falta o no està configurada.
  • Estabilitat d’inicialització del paquet després d’importar Serenity en un projecte Unity nou.

Corregit

  • Resolució del color de fons de l’overlay de càrrega quan s’usen càmeres de renderitzat.

Infraestructura

  • Reutilitzades utilitats UI existents de FoundationEditor i UnityGameSettingsDefinitionEditor per mantenir coherència visual i funcional.

1.0.0 — Llançament Inicial

✨ Funcionalitats

  • Lògica de joc desacoblada amb zero dependències del motor a les capes core. Tot el codi de domini i aplicació compila amb noEngineReferences: true, garantint que les regles de negoci siguin plenament portables, testejables i lliures d’acoblament amb Unity.

  • Sistema de persistència extensible i en capes. Una jerarquia d’emmagatzematge unificada suporta key-value stores (recolzats per PlayerPrefs), blob stores basats en fitxers amb escriptures atòmiques i streams només d’afegit — tot darrere de contractes intercanviables que poden apuntar a fitxers locals, serveis cloud o backends personalitzats.

  • Precarrega avançada d’assets amb pressupostos de memòria. Un motor de prefetch conscient de prioritats amb eviction LRU, pressupostos de memòria configurables, estratègies de finestra lliscant i sota demanda, i resolució de labels basada en Addressables proporciona disponibilitat previsible d’assets amb pressió de recursos controlable.

  • Game settings tipats i persistits per repositori. Un sistema genèric de settings suporta tipus d’opció Boolean, Integer, Float i Selectable amb notificacions de canvi de valor, persistència automàtica i integració reactiva amb mòduls d’àudio, gràfics i localization.

  • Gestió de personatges basada en estat. Els personatges segueixen un cicle de vida ben definit (Spawning → Active → Dying → Dead) amb seguiment de punts de vida, snapshots immutables i punts d’extensió virtuals per a especialització específica del joc.

  • Comptador de combos agnòstic del joc. Un model pur de comptatge amb snapshots immutables que no imposa semàntica de gameplay — timeout, multiplicador i lògica de puntuació continuen sent responsabilitat de la capa consumidora.

  • Persistència de checkpoints opaca. Slots de guardat amb nom i metadades extensibles (timestamp, label, stage) emmagatzemen payloads binaris arbitraris sense interpretar-ne ni validar-ne el contingut, deixant l’estratègia de serialització als consumidors.

  • Pipeline d’inicialització configurable. Un sistema d’arrencada ordenat per fases i tasques amb seguiment de progrés ponderat, criticitat per tasca (Critical vs. NonCritical) i polítiques d’execució pluggables (seqüencial o paral·lela per fase).

  • Sistema complet d’animació procedural. Un motor d’expressions procedurals basat en dades i claus suporta composició de poses per capes (oscil·lació, drift, soroll, impuls), animació de propietats de material, animació d’escala de transform, accions discretes one-shot (flinch, recoil, stumble), activació basada en regles amb condicions d’histèresi i ajust en temps real — tot plenament agnòstic del producte.

  • Sistema d’esdeveniments publish/subscribe type-safe. Un event dispatcher centralitzat amb accions autoregistrades, classes de senyal tipades i descobriment basat en atributs permet comunicació desacoblada entre mòduls.

  • Reproducció d’àudio multicategoria. Un sistema d’àudio enrutat per gateway suporta canals SFX, Music, Voice, Ambient, Environment i UI amb pooling per categoria i configuració de clips guiada per settings.

  • Music player dedicat amb suport de crossfade. La gestió de música de fons ofereix operacions de play, stop, fade-in, fade-out i crossfade de manera independent del sistema d’àudio de curta durada.

  • Abstracció d’audio mixer. Gestió de volum i mute per grups (Master, Music, SFX, Voice, UI) amb persistència automàtica mitjançant integració amb game settings.

  • Gestió del cicle de vida d’stage. Un agregat stage de nivell superior rastreja estats d’inici, finalització i fallada amb notificacions basades en senyals consumides per mòduls descendents com waves, timers i scoring.

  • Progressió seqüencial de waves. Estructura d’stage wave-by-wave amb detecció automàtica de clear i senyals en cascada per a wave start, wave cleared i all-waves-cleared.

  • Puntuació dinàmica multimètrica. Un model de scoring sense límit adreçat per keys amb nom suporta registre runtime de mètriques i operacions aritmètiques completes (add, subtract, multiply, divide, set, reset) amb persistència recolzada per repositori.

  • Gestió de mode d’aplicació. Un servei de game-mode coordina transicions entre estats Menu, Game i Pause amb estratègies de pausa pluggables, canvi d’action-map d’input i coordinació guiada per senyals.

  • Seguiment de cicle de vida de sessió. Gestió d’estat per sessió amb fonts de temps agnòstiques del motor, acumulació de tick frame-by-frame i snapshots de sessió immutables.

  • Sistema de gestió de timers. Timers amb nom amb modes countdown, elapsed i repeating ofereixen progrés normalitzat, control pause/resume i notificacions de cicle de vida basades en senyals.

  • Navegació de menú amb suport de stack. Un sistema de menú basat en navigation-stack suporta show, hide, push, pop i peek amb configuració per menú i senyals de cicle de vida.

  • Sistema de diàlegs modals. Diàlegs modals configurables amb factories de botons, gestió de resultat basada en callbacks i senyals preconstruïts per a confirmacions comunes (sortir de l’aplicació, reiniciar el joc, restablir settings).

  • Foundation UI agnòstica de plataforma. Una jerarquia de vistes, sistema de theme/style i model de components permeten construcció UI composable sense dependències del motor a la capa de domini.

  • Gestió d’estat de Game UI. Models d’estat abstractes de HUD i results-screen amb delegació de renderitzat mitjançant presenter-port permeten testejar la lògica UI aïllada de la infraestructura de renderitzat.

  • Localization amb integració de settings. Gestió de llengua de joc i veu amb canvi automàtic d’idioma impulsat per canvis persistents de game settings.

  • Gestió de settings gràfics. Gestió reactiva de nivell de qualitat, resolució de pantalla i mode fullscreen guiada per esdeveniments de canvi de valor de game settings.

  • Detecció de configuració del sistema. Consultes de capacitat de hardware (memòria, GPU, display) amb generació de perfil de qualitat recomanat per a configuració automàtica.

  • Model genèric de spawning i pooling. Creació i destrucció d’entitats rastrejades per handles amb consultes d’estat de pool, desacoblat de la mecànica d’instanciació mitjançant un factory port.

  • Identitat d’entitats de gameplay. Identitat d’entitat basada en GUID amb classificació semàntica (Player, Character, Hazard) proporciona un vocabulari de referència compartit entre sistemes de gameplay.

  • Model de moviment basat en rails. Rail paths amb nom i seguiment de progrés normalitzat permeten moviment on-rails impulsat externament sense acoblament amb interpolació o easing.

  • Gestió d’estat d’armes. Mecàniques de trigger, canvi de fire-mode i seguiment de magazine/ammo amb snapshots només de lectura — independent de la representació visual o dels sistemes de projectils.

  • Motor d’orquestració de seqüències. Un sistema genèric d’execució ordenada proporciona iteració d’stages basada en completament consumida per agregats verticals com el cutscene player.

  • Reproducció de cutscenes cinemàtiques. Execució temporitzada d’stages amb tipus fade, timeline, wait i dialog construïda damunt la foundation d’orquestració de seqüències.

  • Logging estructurat amb verbositat per categoria. Un sistema de logging configurable amb nivells de severitat, overrides per categoria, perfils d’encaminament de logs i component loggers consumits per cada mòdul.

  • Navegació de view browser. Navegació forward/back de pantalles amb consultes d’estat de navegació per a fluxos de browsing impulsats per UI.

  • Service locator mínim. Un contracte de resolució de serveis recolzat per diccionari per a casos estrets on la injecció per constructor és impracticable, com accions d’esdeveniment instanciades per reflexió.

  • Sistema de tasques composable. Contractes d’unitats de treball async amb nivells de criticitat, invocació de mètodes basada en reflexió, resolució d’arguments conscient de serveis i suport de despatx al main-thread.

  • Persistència basada en fitxers amb escriptures atòmiques. Un blob store de sistema de fitxers amb seguretat write-then-rename, resolució de paths específica de plataforma i suport de streams només d’afegit.

🧱 Arquitectura

  • Aplicació estricta de Clean Architecture. Cada agregat segueix una capa estricta Domain ← Application ← Installation amb fletxes de dependència només cap endins. Les capes de domini tenen zero o mínimes dependències externes; les capes d’aplicació depenen només de contractes de domini i serveis foundation transversals; les capes d’instal·lació connecten implementacions específiques de plataforma.

  • Aïllament del motor mitjançant assembly definitions. Els assemblies core business declaren noEngineReferences: true, garantint en temps de compilació que cap API de Unity es filtri a la lògica de domini o aplicació.

  • Principis SOLID a tot arreu. Agregats d’una sola responsabilitat, contractes de servei segregats per interfície, extensió open/closed mitjançant instal·ladors abstractes i factory ports, i inversió de dependències mitjançant interfícies agnòstiques de plataforma.

  • Vocabulari de Domain-Driven Design. Les entitats porten estat mutable amb transicions protegides, els value objects ofereixen identitat i snapshots immutables, i els agregats defineixen bounded contexts amb punts d’integració explícits.

  • Disseny d’API guiat per casos d’ús. Les operacions orientades al consumidor s’encapsulen en classes de cas d’ús tipades amb DTOs d’entrada dedicats, agrupades en contenidors injectables per a grafs de dependència nets.

  • Patró de snapshot immutable. Tots els agregats amb estat exposen snapshots només de lectura per a consultes, assegurant que els consumidors no puguin mutar accidentalment l’estat intern.

  • Patró d’instal·lador abstracte. Cada agregat defineix un instal·lador abstracte que declara el contracte de cablejat; les capes concretes de plataforma (Unity, tests o targets personalitzats) proporcionen implementacions sense modificar el codi business.

  • Comunicació entre mòduls basada en senyals. Senyals d’esdeveniment tipats flueixen a través d’un dispatcher centralitzat, mantenint els agregats desacoblats mentre permeten coordinació reactiva.

📦 Mòduls

  • Global — Contractes foundation, esdeveniments de cicle de vida (exit/restart), jerarquia d’interfícies de casos d’ús, model de components per a composició UI i base d’instal·lador abstracte consumida per tots els altres agregats.

  • EventDispatcher — Sistema publish/subscribe type-safe amb accions autoregistrades, classes de senyal tipades i descobriment basat en atributs.

  • Logging — Logging configurable amb nivells de severitat, overrides de verbositat per categoria, perfils d’encaminament de logs, component loggers i suport de sortida a fitxer/consola.

  • ServiceLocator — Resolució de serveis tipada mínima amb una implementació per defecte basada en diccionari.

  • Task — Contractes d’unitats de treball async amb criticitat, invocació de mètodes basada en reflexió i resolució d’arguments extensible.

  • InitializationPipeline — Sistema d’arrencada ordenat per fases i tasques amb seguiment de progrés ponderat, gestió de fallades basada en criticitat i polítiques d’execució pluggables.

  • Persistence — Jerarquia d’emmagatzematge en capes: key-value stores, blob stores basats en streams i stores només d’afegit — tot darrere de contractes de plataforma intercanviables.

  • FilePersistence — Blob store de sistema de fitxers amb seguretat d’escriptura atòmica write-then-rename i resolució de paths específica de plataforma.

  • PlayerPrefsPersistence — Key-value store lleuger recolzat per Unity PlayerPrefs amb codificació Base64.

  • GameSettings — Sistema de settings tipats (Boolean, Integer, Float, Selectable) amb persistència de repositori i notificacions de canvi de valor.

  • Checkpoint — Persistència opaca de checkpoints binaris amb slots amb nom (Slot1–3, Auto, Quick) i metadades extensibles.

  • Score — Model de scoring multimètric dinàmic amb mètriques il·limitades basades en keys, operacions aritmètiques completes i persistència de repositori.

  • Combo — Comptador de combos agnòstic del joc amb snapshots immutables i punts d’extensió virtuals per a multiplicador, timeout o comportament de decay.

  • Character — Cicle de vida de personatge basat en estat (Spawning → Active → Dying → Dead) amb gestió de punts de vida, enums d’estat heretables i snapshots immutables.

  • GameplayEntity — Identitat d’entitat basada en GUID amb classificació semàntica i referències lleugeres entre sistemes.

  • GameSpawner — Spawning d’entitats rastrejades per handle i gestió d’estat de pool amb un factory port per a l’estratègia d’instanciació.

  • Stage — Cicle de vida d’stage de nivell superior (NotStarted → InProgress → Completed/Failed) amb resolució de spawn-point i contractes d’autoria de rail-path.

  • Wave — Progressió seqüencial de waves amb detecció automàtica de clear i senyals de cicle de vida en cascada.

  • Timer — Gestió de timers amb nom amb modes countdown, elapsed i repeating, progrés normalitzat i senyals de cicle de vida.

  • GameMode — Màquina d’estats de mode d’aplicació (Menu, Game, Pause) amb estratègies de pausa pluggables i transicions guiades per senyals.

  • GameSession — Seguiment de cicle de vida per sessió amb fonts de temps agnòstiques del motor i acumulació de temps transcorregut basada en ticks.

  • AudioPlayer — Reproducció d’àudio multicategoria amb encaminament per gateway, pooling de canals i operacions guiades per casos d’ús.

  • MusicPlayer — Gestió de música de fons amb operacions play, stop, fade i crossfade.

  • SoundMixer — Gestió de volum i mute basada en grups amb integració reactiva de game settings.

  • GameGraphics — Gestió reactiva de nivell de qualitat, resolució i fullscreen guiada per canvis de game settings.

  • SystemConfiguration — Detecció de capacitats de hardware amb generació de perfil de qualitat recomanat.

  • PlayerInput — Abstracció d’input agnòstica de plataforma amb canvi d’action-map i contractes de binding d’input-action.

  • Ui — Jerarquia de vistes, sistema de theme/style i model de components per a construcció UI composable i independent del motor.

  • Menu — Sistema de menú basat en navigation-stack amb configuració per menú i senyals de cicle de vida.

  • Modal — Diàlegs modals configurables amb factories de botons, resultats basats en callbacks i senyals de confirmació preconstruïts.

  • GameUi — Gestió abstracta d’estat de HUD i results-screen amb delegació presenter-port.

  • ViewBrowser — Navegació de pantalla forward/back amb consultes d’estat.

  • Localization — Gestió de llengua de joc i veu amb canvi automàtic guiat per settings.

  • SequencePlayer — Motor genèric d’orquestració d’execució ordenada per iteració d’stage basada en completament.

  • CutscenePlayer — Reproducció cinemàtica amb stages temporitzats (fade, timeline, wait, dialog) construïda damunt l’orquestració de seqüències.

  • GameRail — Registre de rail-paths amb nom i seguiment de progrés normalitzat per a moviment on-rails.

  • GameWeapon — Mecàniques de trigger, canvi de fire-mode i seguiment de magazine/ammo amb snapshots només de lectura.

  • ProceduralExpression — Sistema d’animació procedural basat en dades amb composició de poses per capes, animació de material/transform, activació basada en regles, accions discretes i suport de tuning en temps real.

  • Shared — Constants transversals (noms de serveis, labels de mòdul, identificadors de context) i classes d’utilitat (parsing, reflexió, generació de GUID).

🛠️ Eines

  • Generador de documentació d’API basat en DocFX. Un builder de documentació integrat accessible des de Tools → Serenity → Docs compila tots els assemblies amb documentació XML de Roslyn i genera un lloc estàtic navegable d’API mitjançant DocFX — amb instal·lació automàtica, generació de configuració i suport de plantilla amb marca.

  • Eina de configuració de Procedural Expression. Un assistent one-click (Tools → Serenity → Procedural Expression → Setup Minimal Idle) autodetecta ossos de l’esquelet, genera tots els assets de configuració necessaris i connecta un perfil d’animació procedural a qualsevol prefab — suportant personatges riggejats, objectes simples, props i elements UI.

  • Inspector de diagnòstics d’Asset Prefetcher. Un inspector personalitzat d’Editor per al servei de prefetch ofereix refresh de cache, clear, exportació al clipboard, visualització de diagnòstics, polling d’auto-refresh i visualització d’asset categories amb codi de colors.

  • Inspector de System Configuration. Un inspector personalitzat per als settings de configuració del sistema ofereix una interfície completa per al timing de recollida de dades, scope i ajust d’heurístiques.

  • Inspectors de Menu i Modal. Inspectors personalitzats d’Editor per a vistes de menú i components modals ofereixen visualització de configuració només de lectura, gestió de bindings de senyal i interfícies de configuració de botons.

  • Configuració basada en ScriptableObject. Perfils de política de prefetch, perfils de procedural expression, state keys, layers, actions, rules, audio settings, definicions de game settings i taules de localization s’autoritzen tots com a assets ScriptableObject — permetent configuració per part de no programadors i presets versionats.

  • Patró d’instal·lador abstracte per al cablejat de plataforma. Cada agregat defineix un instal·lador abstracte amb dependències explícites; els instal·ladors concrets específics de Unity gestionen la creació de MonoBehaviour, la integració d’Addressables i el registre al service locator.

  • Panell de debug de Procedural Expression. Un overlay GUI runtime (alternat amb F12) mostra valors de state-key en viu amb sliders amb codi de colors, pistes de rang i controls de reset per a tuning en temps real en Play Mode.

  • Property drawers personalitzats de Procedural Expression. Drawers de referència de Bone ID amb selecció dropdown conscient del perfil, editors de regles amb configuració inline de condicions i editors de perfil amb validació i visualització de propietats derivades.

🎯 Propòsit

Serenity existeix per eliminar el boilerplate recurrent que acompanya cada projecte Unity: cablejat de persistència, gestió de settings, encaminament d’àudio, seqüenciació d’inicialització, transicions de mode i fontaneria d’esdeveniments. En lloc d’oferir sistemes de gameplay opinats, proporciona l’esquelet arquitectònic — contractes nets, límits en capes i mòduls composables — sobre el qual es construeix el codi específic de cada joc.

En imposar aïllament estricte del motor a les capes core, Serenity garanteix que la lògica business sigui testejable fora de Unity, portable entre plataformes i resilient als canvis de l’API del motor. El patró d’instal·lador abstracte significa que canviar un backend de persistència o un sistema d’input requereix implementar una sola interfície, no refactoritzar un arbre de dependències.

Cada mòdul segueix les mateixes convencions estructurals: entitats de domini amb transicions d’estat protegides, snapshots immutables per a consultes segures, classes de cas d’ús amb entrades tipades i punts d’integració basats en senyals. Aquesta coherència redueix el temps d’onboarding i fa que els patrons entre mòduls siguin immediatament recognoscibles.

Serenity no és una plantilla de joc. No proporciona personatges, ni nivells, ni condicions de victòria. Proporciona la foundation que fa que aquests sistemes siguin més nets, més ràpids de construir i més fàcils de mantenir durant tota la vida del projecte. ºº