Registre de canvis
Últimes actualitzacions i millores de Serenity.
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
SpawnPoseja no exposa els set campsfloatplans (PositionX/Y/Z,RotationX/Y/Z/W). Ara està recolzat perPosition(System.Numerics.Vector3) iRotation(System.Numerics.Quaternion). La construcció no es veu afectada — el constructor de setfloatiFromPosition(x, y, z)es mantenen — però el codi que llegia els campsfloatindividuals ara ha de llegirpose.Position.*/pose.Rotation.*.
Afegit
- Comporta d’input principal com a GameMode — un valor
PrimaryInputGatea l’enumGameModepermet 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 cua —
StartTime,EndTime,TailPreservingLoop,TailFadeOutDurationiTailFadeOutCurveaIMusicTrackDefinition/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çantAudioSettings.dspTime/PlayScheduled, de manera que el loop no produeixi mai clicks. Els punts de loop es defineixen com a codis de tempsHH:MM:SS:MMMo en termes de DAW — tempo, compàs, barra d’inici/final — mitjançantMusicBarTimeCalculator; el fade de la cua segueix una corba Lineal/Exponencial/Logarítmica/S-Curve/Custom. - Reproducció d’àudio posicional — objecte de valor
AudioWorldPositioniPlaybackPositionopcional aAudioPlayerPlayClipInput; 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 senyalPlayAudioClip, 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çantPriority/PriorityPolicy/CanBeReplacedper clip i unAudioPriorityCandidateSelector(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.priorityde 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 cadenaReceive → effects → Attenuationi un asset reutilitzableUnitySoundMixerEffectLoopDefinitionque el descriu. - Finestra de sincronització d’Effect Loops (
Tools ▸ Serenity ▸ Audio ▸ Sync Effect Loops) — reconcilia l’AudioMixeriSoundMixerSettingsamb les definicions d’effect-loop del projecte: crea un Send per cada source cap al Receive del loop, l’exposa com{Source}_{Loop}_Sendi 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 unSoundMixerEffectLoopRouteResolverpur i independent del motor. UnitySoundMixerEffectLoopDefinition/UnitySoundMixerEffectLoopSourcecom a ScriptableObjects amb inspector personalitzat, a més d’un registreEffectLoopsaSoundMixerSettings.AudioMixerYamlReadernomés per a editor — llegeix l’estructura de.mixer— iAudioMixerEffectLoopReflectionAdapter— aïlla l’API internaUnityEditor.Audiodarrere d’una única classe.- Mode d’instanciació per menú —
MenuInstantiationMode(PreloadOnStartup/LazyOnFirstOpen) aIMenuSettingsDefinitioniUnityMenuSettingsDefinition, editable sota una secció Advanced a l’inspector de configuració del menú. - Pipeline d’instanciació lazy de menús:
IMenuInstanceGate,MenuLifecycleResolver,EnsuringMenuTransitionateToView,UnityMenuLazyBuildContext,UnityMenuLazyRegistrationiIUnityMenuViewInstanceFactory/UnityMenuViewInstanceFactory. - Senyals de transició de sortida per mode —
IGameModeSettingsDefinition.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
PauseDuringSceneLoadde 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çanttry/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.cfgen el moment de la detecció — standalone mitjançantUnitySystemConfigurationSnapshotStore; WebGL/ResourcesOnly mitjançantSerenityFallbackLocalizationService— protegit per una comprovació d’existència del fitxer per preservar la preferència guardada dels jugadors que tornen.
Canviat
SpawnPoseara està recolzat perSystem.NumericsVector3 Position+Quaternion Rotation— substituint els setfloatplans —, seguint el patró d’objecte de valorRailNodePositionde GameRail; es manté com a C# pur, sense dependència del motor.UnityWaveServicellegeixpose.Position.*/pose.Rotation.*. Vegeu Breaking Changes.UnityAudioPlayerService.ApplyPlaybackPlacementara és l’única font de veritat per aAudioSource.spatialBlend— amb posició →1i l’emitter es mou allà; sense posició →0i l’emitter es deixa al seu lloc —;ApplyClipToSourceja no aplica l’spatial blend del clip.UnityGameModeServicedespatxa els senyals del mode sortit després d’OnExitMode, reflectint el comportament existent dels senyals d’entrada; entrar aPrimaryInputGatedispara els seus senyals d’entrada i sortir-ne dispara els seus senyals de sortida mitjançant el mateix dispatch deSetMode.- 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.
UnityMenuServiceconstrueix els menúsLazyOnFirstOpenquan es mostren per primera vegada — cachejats i reutilitzats —; els menúsPreloadOnStartupcontinuen 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 —PreloadOnStartupcontinua sent el valor per defecte.UnitySoundMixerSettingsEditorara 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
DefaultWetnormalitzat — 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.
UnityYamlUtilses 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 emetOnPrimarySelectedi la composition root despatxaEnterMenuSignal, permetent que l’accióEnterMenucanviï 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
0talla 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 mateixUiOptionValue— per exemple, master/ambient. ISoundMixerServiceara està registrat alServiceLocatorruntime, de manera que les accions d’EventDispatcherel 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/DisablePauseMixerEffectLoopActioni l’asset d’exemplePauseEffectLoop— substituïts per senyals de sortida de GameMode i el generador de scripts d’accions. - Un mapping erroni de
SoundMixerSettings(Music_SucutruleLoop_Send→Audio_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 WebGL —
SerenityWebGLResourcesExporter,SerenityWebGLResourcesCleaner,SerenityWebGLResourcesValidator,SerenityWebGLResourcesPathsiSerenityWebGLExportManifestper exportar assets de Serenity a l'arbreResourcesdel consumidor per a builds WebGL. - Fallback de localització en runtime —
SerenityFallbackLocalizationServicecarrega JSON per cada parell (taula, locale) des deResourcesi respon al nouILocalizationService.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
LoadingProgressTemplateals components del tema d'UI i una variant de prefabLoadingBarper a cada tema (Default, Alternative, Alternative2, Animated, Animated2, Futuristic, Serenity, Writings). - Enum
SerenityAssetLoadingModei interfícies/implementacionsIAssetLoadingModeProvider/UnitySerenityAssetLoadingModeProviderper 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 aSlideableTemplatequan no hi ha cap prefab dedicat assignat. UnityUiTMP_TextLocalizationUpdaterComponentara cridaTryTranslateen 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ó.UnityLocalizationServicemantéGameLanguageChangedcom a no-op, delegant el refresc a la pròpia cadenaOnSelectedLocaleChangedde Unity Localization.- Corregit el comportament de
UnityPrimaryInputPromptViewper a builds WebGL. InitializationPipelineService,UnityCutscenePlayerService,ReflectionCallTask,AddressablesAssetLocator,UnityAddressableUtils,UnityAssetUtils,AudioMixerDependencyCacheiUnityMainThreadDispatcheractualitzats 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 deUnity.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
ModuleLabelscentralitzades per a totes les labels de mòdul i labels de tipus de Serenity. - Constants
ModuleLabels.Typesper 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>(...)aFoundationEditorper 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 enAdvancedDropdownper a camps string de tipus de senyal.- Label d’Addressables
module:game-mode. - Registre i etiquetatge d’Addressables per a
GameModeSettings.
Canviat
SerenityPackageDependencyInstallerara considera TextMeshPro satisfet quan els tipus runtime de TMP estan disponibles, encara quecom.unity.textmeshprono 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.ModuleLabelsen lloc de literals string hardcodejats. InstallationConstants.ModuleLabelsara actua com a shim de compatibilitat que reexporta els valors canònics deModuleLabels.InstallationConstants.TypeLabelsara actua com a shim de compatibilitat que reexportaModuleLabels.Types.UnityAddressablesLabelerara usa constants centralitzades deModuleLabelsper a labels gestionades, regles de ruta i regles de tipus.UnityAddressablesLabelerara gestiona labels addicionals de Serenity per als mòduls Character, GameMode, SequencePlayer i Wave.UnityAudioPlayerInstaller,UnityMusicPlayerInstaller,UnityGameSettingsInstaller,UnityLocalizationInstaller,UnityMenuInstaller,UnityModalInstaller,UnityPlayerInputInstaller,UnitySoundMixerInstaller,UnitySystemConfigurationInstaller,UnityCharacterInstalleri els serveis relacionats amb Cutscene/Sequence ara usen constants centralitzades de labels de mòdul.AudioMixerDependencyCacheara usa per defecteModuleLabels.AUDIO_MIXERen lloc d’una label d’Addressables hardcodejada.UnityUiSettingsEditorara renderitzaScaleKeyiFontSizeKeycom a ObjectFields de Unity recolzats per assetsUnityUIGameSettingsDefinition.UnityGameGraphicsSettingsEditorara renderitzaQualityLevelKey,ScreenResolutionKeyiIsFullScreenKeycom a ObjectFields de Unity recolzats per assetsUnityGraphicGameSettingsDefinition.UnityLocalizationSettingsEditorara renderitzaGameLanguageKeyiVoiceLanguageKeycom a ObjectFields de Unity recolzats per assetsUnityLocalizationGameSettingsDefinition.UnityMenuServiceSettingsDefinitionEditorara renderitzaInitMenuIdcom un ObjectField de Unity recolzat per assetsUnityMenuSettingsDefinition.UnityGameModeSettingsDefinitionEditorara renderitzaPauseMenuIdcom un ObjectField de Unity recolzat per assetsUnityMenuSettingsDefinition.UnityActionDefinitionEditorara renderitzaSignalmitjançant un selector de tipus de senyal amb cerca en lloc d’un dropdown simple.UnityModalSettingsEditorara renderitzaSignalTypemitjançant un selector de tipus de senyal amb cerca en lloc d’un dropdown simple.UnityModalSettingsEditorara comparteix el descobriment de tipus de senyal mitjançantEventDispatcherSignalTypePicker, evitant lògica de reflexió duplicada.UnityMenuSettingsDefinitionEditorara usa constants centralitzades de labels de mòdul en resoldre game settings i menús.UnitySoundMixerSettingsEditorara 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
ViewIdexplícits en opcions i valors. - Els assets de menú d’exemple de Serenity ara inclouen arrays
OnShowiOnHideexplícitament buits. - L’asset d’exemple
GameModeSettingsara 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.Signalcontinua emmagatzemantType.FullName.UnityModalSettings.SignalTypecontinua emmagatzemantType.AssemblyQualifiedName.UnityModalSettings.SignalTypeconserva 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-modeper aGameModeSettings. - Corregits diversos camps d’editor que abans requerien selecció per dropdown tot i representar ids recolzats per assets.
- Corregit que
UnityActionDefinition.SignaliUnityModalSettings.SignalTypecontinuessin 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.Constantsallà 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/GameModeSettingsestigui etiquetat ambmodule: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
MusicPlayerTransitionTypeamb tres estratègies de transició:CUT,FADEIN_FADEOUTiCROSS_FADE. - Paràmetres de transició configurables a
IMusicPlayerService.PlaySong(...)i nou mètodePlaySongById(...). - Cas d’ús
MusicPlayerPlaySongByIdi DTOMusicPlayerPlaySongByIdInputper reproduir pistes concretes per identificador amb control explícit de loop i transició. - Mètode de gateway
PlaySongByIdaIMusicPlayerGateway. - Contracte
SetGameModeService(IGameModeService)aIMenuServiceper a coordinació entre serveis. - Contracte
GetSignalsForGameMode(GameModeEnum)aIGameModeSettingsDefinitionper a configuració de senyals per mode. - Valors
InitializationiCutscenea l’enumGameMode, establintInitializationcom el mode inicial per defecte. - Seqüències de transició
EventDispatcherSignalper mode aUnityGameModeSettingsDefinition. - Orquestració
DispatchModeTransitionSignals(...)aUnityGameModeService, 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
ServiceLocatorper aIMusicPlayerServicedurant la instal·lació del music player.
Canviat
UnityGameModeServiceara s’inicialitza en modeInitializationen lloc deMenu, ajornant la primera transició real de mode fins que el sistema de menús estigui preparat.UnitySerenityInstaller.ShowMenu()ara connecta elIGameModeServiceresolt amb el servei de menú abans d’invocarShowInitialMenu(), assegurant que el game mode queda sincronitzat en arrencar.UnityMusicPlayerInstallerara repServiceLocatorInstallerper al descobriment de serveis en runtime.- Format de referència de
Serenity.GameMode.Domain.asmdefestandarditzat a GUID. - Nomenclatura d’assets preparada per a producció:
Audio_SoundToTest→Audio_SoundToTrigger,Audio_TrackToTest→Music_TrackList. - Configuració d’
AudioTestingMenuactualitzada 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_FADEfa fallback automàticament aCUTquan 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.Menuara s’assegura automàticament cada vegada que s’executaShowInitialMenu(), mantenint sincronitzats el sistema de menús i l’estat de mode.
Millorat
- L’inspector
UnityGameModeSettingsDefinitionEditorara renderitza una llista dedicada i reordenable de senyals per cada valor deGameMode, 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’
EventDispatcherSignalper identificar-los d’un cop d’ull. - Les definicions d’assembly
Serenity.Menu.ApplicationiSerenity.UnityMenu.Infrastructureara referencien contractes de GameMode per a coordinació entre capes.
Corregit
- Evitades possibles transicions recursives de mode confiant en el short-circuit de
SetModequan 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.Installationper 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
OnShowiOnHideaUnityMenuSettingsDefinition. - 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(...)aUnityMenuView.
Funcionalitats
- Els menús ara poden despatxar seqüències personalitzades d’
EventDispatcherSignalquan 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
UnityMenuSettingsDefinitionEditoramb una secció dedicadaLifecycle 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’
EventDispatcherSignales 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’
EventDispatcherSignali 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
LocalizationSettingsDefinitionEditorper optimitzar l’UX dels assetsUnityLocalizationGameSettingsDefinition. - 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
ValueTypeaSELECTABLEamb 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
FoundationEditoriUnityGameSettingsDefinitionEditorper 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. ºº
English
Español
Català