Sistema de Game Camera

Un servicio que conoce todas las cámaras de la escena, cambia la activa sin romper tus rigs y organiza la pantalla dividida automáticamente.

Para qué sirve este sistema

Las cámaras en Unity empiezan siendo simples: una Main Camera, un tag, Camera.main por todas partes. Después el proyecto suma una cámara de menú, otra de gameplay, un rig de cinemáticas, quizá un montaje con Cinemachine, y de repente medio código se dedica a activar y desactivar GameObjects esperando que gane la cámara correcta. Añade multijugador local y las matemáticas de viewports se convierten en una feature propia.

El sistema Game Camera de Serenity convierte todo eso en un único contrato. Mantiene un registro de todas las cámaras del juego, expone un cambio de cámara activa explícito que coopera con Cinemachine y con rigs a medida, y resuelve por ti los layouts de pantalla dividida del multijugador local.

El problema en Unity

La mayoría de proyectos gestionan cámaras activando y desactivando GameObjects. Funciona hasta que una cámara vive dentro de un rig con otros scripts: desactivar el objeto mata el CinemachineBrain, el audio listener o el componente de shake junto con la cámara. Los equipos acaban escribiendo casos especiales por rig, y cambiar de cámara se convierte en algo que solo una persona del equipo sabe hacer sin romper nada.

El descubrimiento es la otra mitad del problema. Las cámaras que empiezan desactivadas, o que viven en escenas cargadas de forma aditiva, son invisibles para Camera.main y para un FindObjectOfType ingenuo. Y cuando llega el multijugador local, alguien tiene que escribir las matemáticas de Camera.rect, recalcularlas cada vez que un jugador entra o sale, y mantener funcionando los ajustes por jugador.

Cómo lo aborda Serenity

Serenity expone el contrato a través de IGameCameraService en la capa de Aplicación. El servicio mantiene un registro de todas las cámaras del juego: se autodescubren al cargar la escena, incluidas las inactivas y las no referenciadas, y también pueden registrarse explícitamente por API o con un componente UnityGameCameraRegistrar sin escribir código. Un marcador UnityGameCameraExclude excluye una cámara del descubrimiento.

El cambio es exclusivo y seguro para los rigs: activar una cámara desactiva solo el componente Camera de las demás, nunca sus GameObjects, así que un CinemachineBrain o cualquier script hermano sigue funcionando intacto. Para multijugador local, el servicio calcula automáticamente los layouts de Camera.rect según el número de jugadores, los recalcula cuando alguien entra o sale, y acepta ajustes de viewport por jugador o un asset de configuración para layouts personalizados.

Cómo encaja en Serenity

Game Camera vive en el namespace Serenity.GameCamera, con el contrato IGameCameraService en la capa de Aplicación y la implementación específica de Unity en Infraestructura. Lo instala UnitySerenityInstaller justo después de los servicios globales, de modo que cualquier otro sistema puede resolverlo mediante el service locator o inyección de dependencias.

El resto de sistemas de Serenity se apoyan en él en lugar de recurrir a Camera.main. Screen Feedback resuelve el objetivo del shake a través del servicio de cámara, las cinemáticas pueden ceder el control a la cámara de un rig y devolverlo, y las transiciones de Game Mode pueden cambiar de cámara al entrar en menú o gameplay.

Flujo de trabajo práctico

  1. Instala el sistema mediante UnitySerenityInstaller; el descubrimiento no requiere configuración extra en la escena.
  2. Deja que el descubrimiento al cargar la escena registre tus cámaras, o coloca un componente UnityGameCameraRegistrar para registrarlas explícitamente sin código.
  3. Marca las cámaras auxiliares (miniaturas, reflejos, render textures) con UnityGameCameraExclude para que nunca entren en el registro.
  4. Resuelve IGameCameraService y llama a GetActiveCamera() allí donde antes usabas Camera.main.
  5. Cambia la cámara activa a través del servicio al entrar en menús, gameplay o cinemáticas.
  6. Para multijugador local, activa la pantalla dividida y deja que el servicio organice los viewports por jugador, o aporta tus propios ajustes.

Qué incluye

  • Contrato IGameCameraService resuelto mediante service locator o DI
  • Registro de cámaras autodescubierto al cargar la escena, incluidas cámaras inactivas y no referenciadas
  • API de registro explícito más un componente UnityGameCameraRegistrar sin código
  • Marcador UnityGameCameraExclude para excluir cámaras del descubrimiento
  • Cambio exclusivo de cámara activa que desactiva solo el componente Camera, nunca el GameObject
  • Agnóstico respecto a Cinemachine: los brains y los scripts del rig siguen funcionando durante los cambios
  • Pantalla dividida para multijugador local con layouts de Camera.rect automáticos según el número de jugadores
  • Layouts recalculados cuando un jugador entra o sale, con ajustes de viewport por jugador
  • SetActiveCameraOverride para fijar un rig personalizado como cámara activa

Cuándo usarlo

  • Proyectos con más de una cámara: menús, gameplay, cinemáticas o vistas de depuración.
  • Montajes con Cinemachine o rigs a medida donde desactivar GameObjects rompe el rig.
  • Juegos de multijugador local que necesitan pantalla dividida sin matemáticas de viewport escritas a mano.
  • Bases de código que quieren eliminar Camera.main y los helpers estáticos de cámara en favor de un servicio inyectable.

Sistemas relacionados

Usa Serenity cuando quieras una gestión de cámaras que ya coopera con tus rigs, tus modos de juego y tu multijugador, pero que sigue dejándote decidir qué cámaras existen y cuándo toman el control.

Volver a la página principal