Sistema de menús per a Unity
Menús declaratius, temes d'UI compartits i navegació predictible, configurats com a assets en lloc de cablejats a mà sobre GameObjects.
Per a què serveix aquest sistema
La majoria de projectes de Unity comencen amb un parell de botons en un Canvas i acaben convertits en una xarxa enredada d'escenes, variants de prefab i referències directes. Menús de pausa, ajustos, selecció de nivell i diàlegs de confirmació acaben cadascun amb el seu propi cablejat a mida. El resultat és codi d'UI fràgil que costa localitzar, retematitzar o ampliar.
El Sistema de Menús de Serenity descriu els menús com a dades. Cada menú és un asset de definició amb les seves opcions, transicions i regles de presentació. Un únic servei consumeix aquestes definicions en temps d'execució, dirigeix les vistes i emet les senyals adequades quan el jugador selecciona alguna cosa. Configures menús en lloc de cosir prefabs.
El problema a Unity
Els menús de Unity creixen per tres camins dolorosos alhora. Visualment, cada pantalla nova copia un prefab i s'aparta de la resta de l'UI. Pel que fa al comportament, els OnClick dels botons referencien objectes d'escena, managers i singletons que poden o no existir quan es carrega l'escena. Estructuralment, el mateix codi es duplica entre el menú principal, el de pausa i qualsevol overlay del joc.
A més, els menús són la superfície on es creuen localització, temes, input, feedback d'àudio i persistència d'ajustos. Si algun d'aquests sistemes està cablejat a mida, cada menú es converteix en un focus de bugs. Les etiquetes localitzades es desincronitzen, els temes es couen dins del prefab, la navegació amb gamepad es trenca en certs panells i els diàlegs de confirmació es reinventen tres vegades al mateix projecte.
Com ho aborda Serenity
Serenity tracta cada menú com una unitat de configuració. Una definició d'ajustos de menú declara les opcions, les vistes disponibles i les dades que necessita cada opció. Un servei de menú llegeix aquestes definicions i exposa un conjunt petit de casos d'ús: seleccionar una opció, canviar-ne el valor, confirmar o cancel·lar. Les vistes s'enganxen a través de presenters i view models, així que la capa visual mai no és propietària de l'estat de navegació.
Quan el jugador interactua amb l'UI, el servei emet senyals tipades a través de l'Event Dispatcher. La resta del projecte reacciona a aquestes senyals en lloc de cridar al prefab del menú directament. Pots canviar el prefab, retematitzar la pantalla o canviar l'ordre de navegació sense tocar el codi de joc que respon a les confirmacions.
Les transicions entre vistes de menú es descriuen amb el seu propi cas d'ús, així que obrir un submenú, tornar enrere o saltar a una vista germana deixa de ser un script a mida per pantalla. La mateixa definició pot alimentar el menú principal, el de pausa o qualsevol overlay perquè les regles viuen a les dades, no al prefab.
Com encaixa a Serenity
El Sistema de Menús pertany a la capa d'Aplicació dins del namespace Serenity.Menu i fa servir interfícies de Domini com IMenuSettingsDefinition per descriure la configuració. La capa d'Infraestructura aporta les implementacions Unity del servei, les factories de vistes i els presenters. Un instal·lador dedicat ho registra tot perquè la resta del projecte resolgui els menús a través d'interfícies.
Els menús no viuen aïllats. Depenen del sistema de Temes d'UI per als visuals i el feedback sonor compartits, de Localització per a les etiquetes, del Sistema d'Input per a la navegació, de l'Event Dispatcher per a les senyals sortints i del Sistema de Modals per als diàlegs de confirmació. Les transicions de Game Mode poden obrir o tancar menús quan el joc entra o surt d'un estat. El codi del menú es concentra a seleccionar i transicionar; la presentació, l'input i l'idioma vénen de sistemes ja connectats.
Com que cada capa es descriu amb interfícies, canviar qualsevol peça consisteix a registrar una implementació diferent a l'instal·lador. Pots substituir la factoria de vistes per introduir un renderitzat a mida, substituir el presenter per afegir analítica o reemplaçar el servei sencer als tests. Els assets de configuració no canvien, així que les definicions de menú existents segueixen funcionant quan canvia la implementació.
Flux de treball pràctic
- Crea un asset de definició de menú per a la pantalla que vols construir, per exemple un menú de pausa o un d'ajustos.
- Afegeix les opcions, valors per defecte i vistes o transicions objectiu dins de la definició.
- Assigna el prefab de vista del menú i connecta'l al tema d'UI compartit que fa servir la resta de la interfície.
- Deixa que l'instal·lador de menús registri el servei i les factories durant la pipeline d'inicialització.
- Reacciona a les senyals sortints com OnMenuSubmitOptionSignal als sistemes que han de respondre a les eleccions del jugador.
- Itera sobre opcions, ordre i visuals des de l'asset de definició sense tocar el cablejat de l'escena.
Què inclou
- Definicions de menú declaratives com a assets basats en ScriptableObject
- Casos d'ús per seleccionar, canviar valor, confirmar i cancel·lar opcions
- Cas d'ús de transició MenuTransitionateToView per moure't entre subvistes
- Senyals sortints com OnMenuSubmitOptionSignal encaminades per l'Event Dispatcher
- Factories de vista, presenter i view model que mantenen la capa visual reemplaçable
- Factoria de servei IMenuServiceFactory per poder substituir el propi servei de menú
- Integració amb el tema d'UI compartit per no duplicar estils visuals
- Integració amb Localització per a etiquetes i textos d'opcions
- Compatible amb el Sistema d'Input per a navegació amb teclat, gamepad i punter
- Instal·ladors que registren el sistema una sola vegada a tot el projecte
- Separació neta entre les capes de Domini, Aplicació i Infraestructura
Quan fer-lo servir
- Projectes amb més d'una pantalla de menú que necessiten coherència visual i de comportament entre elles.
- Equips que volen localitzar i retematitzar els menús sense editar prefabs d'escena.
- Jocs on els menús de pausa, ajustos i els del joc han de compartir les mateixes convencions d'input, àudio i tema.
- Bases de codi que es mouen del cablejat directe amb UnityEvent cap a un flux basat en senyals tipades.
- Projectes on la navegació de menús ha de ser testejable de manera aïllada respecte a les escenes de Unity.
Sistemes relacionats
Utilitza Serenity quan vulguis un sistema de menús que ja parla amb temes, localització, input i esdeveniments, però que segueix sent configurable des del teu propi projecte de Unity.
English
Español
Català