Reproductor de música para Unity

Música de fondo dirigida por definiciones de pista, transiciones configurables y señales tipadas que puedes enganchar al estado del juego.

Para qué sirve este sistema

La música de fondo en Unity suele empezar como un AudioSource que arranca en Awake. Luego aparece uno para la música de menú, otro para la del jefe y un script a medida que cambia clips e intenta hacer fade. Pausar, reanudar y saltar acaban repartidos entre managers, y en cuanto el juego añade un nuevo estado el código de música hay que tocarlo de nuevo.

El Reproductor de música de Serenity trata la música como un sistema tipado y configurable. Las pistas se definen como assets, el servicio expone casos de uso explícitos para reproducir, pausar, reanudar, parar y saltar, y las transiciones entre pistas tienen un tipo definido en vez de una corutina puntual.

El problema en Unity

La música es uno de los sistemas que más sufre el crecimiento gradual. Un loop de fondo simple se convierte en un sistema dinámico en cuanto el juego tiene menús, niveles, cinemáticas y un estado de pausa. Los managers de música caseros acaban con estáticos globales, referencias a clip cocidas y una rutina de fade que no cubre todos los casos límite. Hacer crossfade, encolar la siguiente pista y reanudar tras pausa son fáciles de equivocar por separado, y más fácil aún en combinación.

La música también tiene que reaccionar al estado del juego. Entrar en un menú, pausar, empezar una sesión y cambiar de modo de juego son momentos donde debería reaccionar. Sin una integración limpia, esas reacciones se reparten entre scripts que no deberían saber nada de audio.

Cómo lo aborda Serenity

Serenity expone la reproducción a través de los casos de uso MusicPlayerPlaySong, MusicPlayerPlaySongById, MusicPlayerPauseSong, MusicPlayerResumeSong, MusicPlayerStopSong, MusicPlayerPlayNextSong y MusicPlayerPlayPreviousSong. Las pistas se describen mediante IMusicTrackDefinition y se almacenan como entidades MusicTrack. Las transiciones se configuran a través de MusicPlayerTransitionType, lo que evita el código de fade ad hoc.

El servicio publica señales como PlayMusicTrackSignal y PlayMusicTrackFromGameSettingsSignal, así que el resto del proyecto puede pedir cambios de música sin referenciar el servicio directamente. La implementación Unity la proporciona UnityMusicPlayerService.

La reproducción por id facilita dirigir la música desde datos externos como la definición de un nivel o una partida guardada. El servicio sabe resolver el id contra las pistas configuradas, así que el código que llama solo necesita saber qué canción quiere escuchar.

Cómo encaja en Serenity

El Reproductor de música pertenece al namespace Serenity.MusicPlayer. Las entidades de Dominio describen las pistas. La capa de Aplicación expone los casos de uso, la interfaz IMusicPlayerService y el gateway IMusicPlayerGateway. La capa de Infraestructura aporta UnityMusicPlayerService y un editor para los ajustes.

El Reproductor de música conecta de forma natural con Game Mode para entrar y salir de estados de juego, con el Event Dispatcher para encaminar señales, con el Sound Mixer para el volumen de la categoría de música, con Game Settings para preferencias de música persistentes y con el Reproductor de audio para los efectos sonoros que no deberían confundirse con la pista de fondo.

Flujo de trabajo práctico

  1. Crea definiciones de pista para cada música que quieras exponer.
  2. Configura las transiciones en cada pista o por petición usando MusicPlayerTransitionType.
  3. Deja que el instalador de música registre el servicio en la pipeline de inicialización.
  4. Lanza PlayMusicTrackSignal o llama a MusicPlayerPlaySong para iniciar una pista.
  5. Reacciona a las señales de Game Mode para cambiar pistas al entrar en menú, iniciar partida, pausar y reanudar.
  6. Asocia un control de volumen de música a Game Settings y a la categoría correspondiente del Sound Mixer.

Qué incluye

  • Definiciones de pista descritas mediante IMusicTrackDefinition
  • Casos de uso para reproducir, reproducir por id, pausar, reanudar, parar, siguiente y anterior
  • Transiciones configurables vía MusicPlayerTransitionType
  • Señales PlayMusicTrackSignal y PlayMusicTrackFromGameSettingsSignal
  • Implementación Unity UnityMusicPlayerService respaldada por un gateway de música
  • Integración con señales de Game Mode para cambios de música dirigidos por estado
  • Integración con Sound Mixer para el volumen de la categoría de música
  • Instalador que registra el reproductor para todo el proyecto

Cuándo usarlo

  • Proyectos con más de una pista y al menos una transición de estado entre ellas.
  • Juegos que necesitan crossfades u otras transiciones sin escribir corutinas a medida.
  • Equipos que quieren que los cambios de música reaccionen al estado del juego en vez de dispararse a mano.
  • Bases de código que quieren el volumen de música ligado a una categoría real del Sound Mixer en lugar de al campo de volumen de un AudioSource.

Sistemas relacionados

Usa Serenity cuando quieras una pipeline de música que ya coopera con mixers, ajustes y señales de estado, pero que te sigue dejando decidir qué pistas suenan y cómo transicionan.

Volver a la página principal