Sistema de Game Camera
Un servei que coneix totes les càmeres de l'escena, canvia l'activa sense trencar els teus rigs i organitza la pantalla dividida automàticament.
Per a què serveix aquest sistema
Les càmeres a Unity comencen sent senzilles: una Main Camera, un tag, Camera.main pertot arreu. Després el projecte suma una càmera de menú, una altra de gameplay, un rig de cinemàtiques, potser un muntatge amb Cinemachine, i de sobte mig codi es dedica a activar i desactivar GameObjects esperant que guanyi la càmera correcta. Afegeix-hi multijugador local i les matemàtiques de viewports es converteixen en una feature pròpia.
El sistema Game Camera de Serenity converteix tot això en un únic contracte. Manté un registre de totes les càmeres del joc, exposa un canvi de càmera activa explícit que coopera amb Cinemachine i amb rigs a mida, i resol per tu els layouts de pantalla dividida del multijugador local.
El problema a Unity
La majoria de projectes gestionen càmeres activant i desactivant GameObjects. Funciona fins que una càmera viu dins d'un rig amb altres scripts: desactivar l'objecte mata el CinemachineBrain, l'audio listener o el component de shake juntament amb la càmera. Els equips acaben escrivint casos especials per rig, i canviar de càmera es converteix en una cosa que només una persona de l'equip sap fer sense trencar res.
El descobriment és l'altra meitat del problema. Les càmeres que comencen desactivades, o que viuen en escenes carregades de manera additiva, són invisibles per a Camera.main i per a un FindObjectOfType ingenu. I quan arriba el multijugador local, algú ha d'escriure les matemàtiques de Camera.rect, recalcular-les cada cop que un jugador entra o surt, i mantenir en funcionament els ajustos per jugador.
Com ho aborda Serenity
Serenity exposa el contracte a través d'IGameCameraService a la capa d'Aplicació. El servei manté un registre de totes les càmeres del joc: s'autodescobreixen en carregar l'escena, incloses les inactives i les no referenciades, i també es poden registrar explícitament per API o amb un component UnityGameCameraRegistrar sense escriure codi. Un marcador UnityGameCameraExclude exclou una càmera del descobriment.
El canvi és exclusiu i segur per als rigs: activar una càmera desactiva només el component Camera de les altres, mai els seus GameObjects, així que un CinemachineBrain o qualsevol script germà continua funcionant intacte. Per a multijugador local, el servei calcula automàticament els layouts de Camera.rect segons el nombre de jugadors, els recalcula quan algú entra o surt, i accepta ajustos de viewport per jugador o un asset de configuració per a layouts personalitzats.
Com encaixa a Serenity
Game Camera viu al namespace Serenity.GameCamera, amb el contracte IGameCameraService a la capa d'Aplicació i la implementació específica d'Unity a Infraestructura. L'instal·la UnitySerenityInstaller just després dels serveis globals, de manera que qualsevol altre sistema pot resoldre'l mitjançant el service locator o injecció de dependències.
La resta de sistemes de Serenity s'hi recolzen en lloc de recórrer a Camera.main. Screen Feedback resol l'objectiu del shake a través del servei de càmera, les cinemàtiques poden cedir el control a la càmera d'un rig i tornar-lo, i les transicions de Game Mode poden canviar de càmera en entrar al menú o al gameplay.
Flux de treball pràctic
- Instal·la el sistema mitjançant UnitySerenityInstaller; el descobriment no requereix configuració extra a l'escena.
- Deixa que el descobriment en carregar l'escena registri les teves càmeres, o col·loca un component UnityGameCameraRegistrar per registrar-les explícitament sense codi.
- Marca les càmeres auxiliars (miniatures, reflexos, render textures) amb UnityGameCameraExclude perquè mai no entrin al registre.
- Resol IGameCameraService i crida GetActiveCamera() allà on abans feies servir Camera.main.
- Canvia la càmera activa a través del servei en entrar a menús, gameplay o cinemàtiques.
- Per a multijugador local, activa la pantalla dividida i deixa que el servei organitzi els viewports per jugador, o aporta els teus propis ajustos.
Què inclou
- Contracte IGameCameraService resolt mitjançant service locator o DI
- Registre de càmeres autodescobert en carregar l'escena, incloses càmeres inactives i no referenciades
- API de registre explícit més un component UnityGameCameraRegistrar sense codi
- Marcador UnityGameCameraExclude per excloure càmeres del descobriment
- Canvi exclusiu de càmera activa que desactiva només el component Camera, mai el GameObject
- Agnòstic respecte a Cinemachine: els brains i els scripts del rig continuen funcionant durant els canvis
- Pantalla dividida per a multijugador local amb layouts de Camera.rect automàtics segons el nombre de jugadors
- Layouts recalculats quan un jugador entra o surt, amb ajustos de viewport per jugador
- SetActiveCameraOverride per fixar un rig personalitzat com a càmera activa
Quan fer-lo servir
- Projectes amb més d'una càmera: menús, gameplay, cinemàtiques o vistes de depuració.
- Muntatges amb Cinemachine o rigs a mida on desactivar GameObjects trenca el rig.
- Jocs de multijugador local que necessiten pantalla dividida sense matemàtiques de viewport escrites a mà.
- Bases de codi que volen eliminar Camera.main i els helpers estàtics de càmera a favor d'un servei injectable.
Sistemes relacionats
Fes servir Serenity quan vulguis una gestió de càmeres que ja coopera amb els teus rigs, els teus modes de joc i el teu multijugador, però que et continua deixant decidir quines càmeres existeixen i quan prenen el control.
English
Español
Català