Pipeline d'Inicialització

Una pipeline asíncrona i ordenada que executa les tasques d'arrencada del teu projecte Unity amb nivells de criticitat, progrés ponderat i telemetria transmesa a qualsevol pantalla de càrrega.

Per a què serveix aquest sistema

Tot projecte Unity té una seqüència d'arrencada. Els assets s'han de carregar, els serveis registrar-se, la configuració remota obtenir-se i la sessió de joc preparar-se abans que el jugador vegi el primer fotograma. Sense una estructura per a aquesta seqüència, el codi d'arrencada acaba dispers entre MonoBehaviours, cadenes d'Awake i corrutines impossibles de provar o estendre.

La Pipeline d'Inicialització de Serenity substitueix aquell codi dispers per un conjunt ordenat de tasques asíncrones. Cada tasca declara la seva criticitat i pes, la pipeline les executa en seqüència i el progrés i els errors es transmeten a un port de telemetria que qualsevol pantalla de càrrega pot consumir.

El problema a Unity

El model d'inicialització predeterminat de Unity és pla. Awake i Start es disparen en un ordre que depèn de la configuració del script execution order, fràgil i invisible. Els equips ho compensen amb managers singleton, flags estàtics o cadenes de corrutines que es trenquen davant qualsevol refactorització. No existeix cap mecanisme estàndard per expressar que un pas d'arrencada és crític i un altre opcional, ni per mostrar una barra de progrés que reflecteixi amb precisió el treball de boot que queda.

A mesura que el projecte creix, la seqüència d'arrencada acumula dependències silencioses. Un servei assumeix que un altre ja està inicialitzat. Una petició remota falla silenciosament i deixa la sessió en un estat parcial. Una pantalla de càrrega mostra un spinner bloquejat perquè ningú no va connectar els esdeveniments de progrés. Aquests problemes només es manifesten en temps d'execució i només en condicions concretes de dispositiu o xarxa.

Com ho aborda Serenity

Serenity modela cada pas d'arrencada com un ITask amb un ID únic, un nivell de TaskCriticality i un float Weight. TaskCriticality té tres valors: Critical, Required i Degradable. Les tasques Critical avorten la pipeline si fallen. Les Degradable registren l'error i permeten que la pipeline continuï. La pipeline es defineix a través d'IInitializationPipelineProfileDefinition, que exposa una llista de només lectura d'instàncies ITaskDefinition que construeixen un ITask concret en temps d'execució mitjançant un TaskBuildContext.

L'InitializationPipelineService rep un conjunt ordenat d'instàncies ITask, un ISkipPolicy, un port IInitializationPipelineTelemetry i un ILogService. Construeix un pla de registres InitializationPipelineStep i els executa seqüencialment mitjançant RunAsync, cridant el port de telemetria a cada pas perquè les pantalles de càrrega rebin els esdeveniments OnStarted, OnProgress, OnTaskCompleted, OnTaskFailed i OnCompleted sense cap acoblament amb els interns de la pipeline.

Initialize Serenity construeix un perfil per tu. El seu pas Systems té una secció Gameplay modules per a Character, Wave, Stage, Game Spawner, Hittable, Game Weapon, Checkpoint, Combo, Gameplay Entity, Game Rail i Game Session: marcar-ne un afegeix la seva tasca d'instal·lació al lloc correcte, en un perfil nou o en el teu després del game mode, i marcar Wave també marca Character. Després, Health Check pot donar a cada component de prefab que no té id un de propi en una sola acció.

Com encaixa a Serenity

La Pipeline d'Inicialització viu al namespace Serenity.InitializationPipeline i segueix l'estructura per capes de Domini, Aplicació i Instal·lació de la foundation. La capa de Domini defineix InitializationPipelineStep. La capa d'Aplicació exposa IInitializationPipelineProfileDefinition, IInitializationPipelineTelemetry, ISkipPolicy i InitializationPipelineService. La capa d'Instal·lació proveeix InitializationPipelineInstaller i el seu DTO d'entrada, que transporta els proveïdors de tasques, la política d'omissió, la implementació de telemetria i el servei de log.

Les tasques es creen com a definicions basades en ScriptableObject usant l'agregat Task del namespace Serenity.Tasking. ITaskDefinition, ITaskFactory i TaskBuildContext gestionen el límit de creació. La implementació ReflectionCallTask permet apuntar una tasca a qualsevol mètode del codi font per nom de tipus i mètode sense escriure una classe ITask dedicada. La pipeline coopera amb l'AssetPrefetcher i el flux de treball d'Addressables per escalfar assets a l'arrencada, amb Game Session per preparar la sessió i amb l'Event Dispatcher per publicar senyals d'inici.

Flux de treball pràctic

  1. Crea un ScriptableObject UnityInitializationPipelineProfile i afegeix les definicions de tasca en l'ordre d'execució desitjat.
  2. Assigna a cada definició de tasca un nivell de TaskCriticality i un float Weight que reflecteixi la seva part del temps d'arrencada.
  3. Implementa IInitializationPipelineTelemetry a la teva pantalla de càrrega per rebre esdeveniments de progrés i error.
  4. Opcionalment implementa ISkipPolicy per permetre que tasques no crítiques s'ometin segons les condicions en temps d'execució.
  5. Registra la pipeline a través de UnityInitializationPipelineInstaller, passant els proveïdors, la política d'omissió i la implementació de telemetria.
  6. Crida RunAsync a InitializationPipelineService a l'arrencada i espera el resultat booleà per saber si totes les tasques crítiques han tingut èxit.
  7. O executa Initialize Serenity i marca els mòduls de gameplay que necessitis al seu pas Systems, perquè s'afegeixin les seves tasques d'instal·lació.
  8. Obre Health Check una vegada i fes servir Assign identity to prefab components, perquè cada component de prefab del projecte tingui el seu propi id.

Què inclou

  • Primitiva ITask amb ID, TaskCriticality, Weight, RunAsync i LastError
  • Tres nivells de criticitat: Critical, Required i Degradable
  • Seguiment del progrés ponderat a través de registres InitializationPipelineStep
  • Port IInitializationPipelineTelemetry amb OnStarted, OnProgress, OnTaskCompleted, OnTaskFailed i OnCompleted
  • ISkipPolicy intercanviable per ometre tasques en temps d'execució sense modificar el perfil
  • IInitializationPipelineProfileDefinition i autoria mitjançant ScriptableObject amb UnityInitializationPipelineProfile
  • ReflectionCallTask per al despatx de mètodes sense codi addicional i sense necessitat d'una classe ITask dedicada
  • UnityInitializationPipelineInstaller integrat al patró d'instal·ladors de la foundation
  • Wizard Initialize Serenity amb una secció Gameplay modules que afegeix la tasca d'instal·lació d'onze mòduls de gameplay
  • Reparació a Health Check que dona el seu propi id a cada component de prefab que no en té cap

Quan fer-lo servir

  • Projectes que necessiten una seqüència d'arrencada fiable i ordenada abans de carregar la primera escena de gameplay.
  • Jocs amb pantalla de càrrega que ha de reflectir el progrés real a través de tasques d'inici heterogènies.
  • Projectes on alguns passos d'arrencada són opcionals o omissibles segons feature flags o capacitats del dispositiu.
  • Bases de codi que volen que els passos d'inici es creïn des de l'inspector de Unity sense escriure noves classes de C# per a cadascun.
  • Projectes nous que volen els mòduls de gameplay connectats a l'arrencada des del primer dia, sense escriure codi d'instal·lador.

Sistemes relacionats

Utilitza Serenity quan vulguis una seqüència d'arrencada inspeccionable, testejable i capaç d'alimentar qualsevol pantalla de càrrega, sense dispersar la lògica d'inicialització entre cadenes d'Awake i managers singleton.

Tornar a la pàgina principal