Reproductor de audio
Reproducción centralizada con assets de definición, emisores y señales tipadas para sonidos de UI y de juego.
Para qué sirve este sistema
Todo proyecto Unity acaba necesitando lo mismo: un único sitio donde pedir un efecto de sonido. Clics de botón, transiciones de menú, confirmaciones de modal y eventos de juego quieren un clip, pero cada prefab inventa su propio cableado de AudioSource. El resultado es un proyecto donde el mismo sonido de clic está duplicado en tres prefabs, los volúmenes no cuadran y averiguar qué AudioSource reproduce qué se convierte en una tarea de depuración propia.
El Reproductor de audio de Serenity centraliza la reproducción de clips. Describes los clips mediante definiciones, le pides al servicio que los reproduzca por referencia o señal, y los emisores se encargan del AudioSource real en el lado de Unity.
El problema en Unity
Los AudioSource de Unity son fáciles de añadir y difíciles de organizar. Sin una capa por encima, cada botón coge un clip y cada sistema termina con su propio código de audio. Los volúmenes derivan, los clips se solapan y pausar toda la pila de audio se convierte en un bucle manual sobre escenas. El feedback sonoro de UI, en particular, suele estar cocido dentro del prefab, lo que hace imposible retematizar la UI sin tocar audio al mismo tiempo.
La otra mitad del problema son las señales. Cuando el código de juego quiere reproducir un sonido no debería necesitar una referencia directa a un AudioSource sobre un GameObject concreto. Ese acoplamiento es lo que hace que los prefabs de UI sean difíciles de reutilizar entre pantallas.
Cómo lo aborda Serenity
Serenity expone la reproducción como casos de uso sobre el servicio AudioPlayer: AudioPlayerPlayClip, AudioPlayerPauseAllClips, AudioPlayerResumeAllClips y AudioPlayerStopAllClips. Los clips se describen mediante IAudioPlayerClipDefinition, se agrupan en entradas AudioPlayerGroup y se reproducen por instancias AudioPlayerEmitter creadas a través de IAudioPlayerEmitterFactory.
El sistema también publica señales como PlayAudioClipSignal y PlayAudioClipFromGameSettingsSignal. Cualquier código del proyecto puede lanzar una señal para reproducir un clip sin resolver el servicio directamente. Los Temas de UI pueden cargar referencias de sonido, así que menús y modales reciben su feedback sonoro desde el tema activo.
Los sonidos posicionales también pueden reaccionar al mundo. Un canal activa los depth cues — un filtro que oscurece los sonidos con la distancia y detrás de muros, más un eco en cada sonido posicional — desde el desplegable Depth Cues de Create Audio Player Settings o desde el inspector del canal. Los muros pueden graduarse según la distancia extra que un sonido debe recorrer rodeándolos para quedar totalmente bloqueado, de modo que una valla baja apenas amortigua un sonido mientras que un edificio lo cierra, y una Audio Room con hijos Audio Portal permite oír un sonido que está detrás del muro de la sala a través del portal abierto más corto. Un clip también puede llevar su propia distancia mínima y máxima, modo de atenuación y spread. Todo está desactivado por defecto, y los canales de música y los sonidos 2D nunca se tocan.
Cómo encaja en Serenity
El Reproductor de audio vive en el namespace Serenity.AudioPlayer. Las entidades de Dominio describen clips, grupos y emisores. La capa de Aplicación expone el servicio, las factorías y los casos de uso. La capa de Infraestructura aporta la implementación Unity, incluido el emisor respaldado por AudioSource, el editor del servicio y el adaptador de interfaz UnityAudioPlayerGateway con el que habla el resto del sistema.
El Reproductor de audio conecta con el Sound Mixer para los volúmenes por categoría, con Game Settings para los volúmenes persistentes, con el Event Dispatcher para las señales de reproducción y pausa, y con los Temas de UI para que menús y modales declaren su feedback sonoro junto a sus visuales.
Flujo de trabajo práctico
- Autora definiciones de clip para los sonidos que quieras exponer, agrupados por propósito o escena.
- Configura un emisor de audio con CreateAudioPlayerEmitterInput cuando necesites un nuevo destino de reproducción.
- Dispara sonidos llamando a AudioPlayerPlayClip con el input correspondiente o lanzando PlayAudioClipSignal.
- Enruta los sonidos de UI a través del tema de UI activo para que menús y modales sean coherentes.
- Usa AudioPlayerPauseAllClips y AudioPlayerResumeAllClips cuando el juego se pausa o se reanuda.
- Asocia un volumen de efectos a Game Settings y al Sound Mixer para que el jugador pueda ajustarlo.
- Activa los depth cues de un canal en Create Audio Player Settings y añade una Audio Room con hijos Audio Portal donde una puerta deba dejar pasar el sonido.
- Define la distancia mínima y máxima, el modo de atenuación y el spread de un clip desde su inspector, Batch Import Sound Effects o la receta del proyecto cuando las reproducciones posicionales lo necesiten.
Qué incluye
- Definiciones de clip descritas mediante IAudioPlayerClipDefinition
- Casos de uso AudioPlayerPlayClip, AudioPlayerPauseAllClips, AudioPlayerResumeAllClips y AudioPlayerStopAllClips
- Factoría de emisores que crea emisores respaldados por AudioSource en tiempo de ejecución
- Señales PlayAudioClipSignal y PlayAudioClipFromGameSettingsSignal para disparos desacoplados
- Grupos de reproducción para organizar clips por propósito
- Adaptador de interfaz UnityAudioPlayerGateway entre la capa de aplicación y la de Unity
- Integración con Sound Mixer para volúmenes por categoría y con Game Settings para persistencia
- Instalador que registra el servicio para todo el proyecto
- Depth cues por canal: un filtro para la distancia y los muros y un eco en cada sonido posicional, desactivados por defecto
- Oclusión graduada de muros, para que una valla baja apenas amortigüe un sonido mientras que un edificio lo cierra
- Audio Room y Audio Portal para oír el sonido a través de puertas, con un gizmo en Play Mode que muestra lo que se bloquea
- Distancia mínima y máxima, modo de atenuación y spread por clip para reproducciones posicionales
Cuándo usarlo
- Proyectos que necesitan feedback sonoro de UI y clips de juego dirigidos desde el mismo servicio.
- Equipos que quieren sonidos asociados a temas y señales en vez de a AudioSource sueltos en prefabs.
- Juegos que necesitan pausar y reanudar todos los sonidos a la vez cuando el juego cambia de estado.
- Bases de código que quieren una separación limpia entre efectos de sonido y pistas de música.
- Juegos con sonido posicional donde los muros, las salas y las puertas deben cambiar lo que oye el jugador.
Sistemas relacionados
Usa Serenity cuando quieras una pipeline de efectos que ya coopera con temas, mixers y ajustes, pero que te sigue dejando elegir los clips y volúmenes desde tu propio proyecto de Unity.
English
Español
Català