Skip to content

Sonido con FMOD

BLGuyDev edited this page Oct 9, 2026 · 2 revisions

Sonido con FMOD

TDD · Documento técnico

Cómo se organiza

Uso FMOD Studio con su integración para Unity. El proyecto de FMOD vive en la carpeta FMOD/ en la raíz del repositorio, fuera de Assets. Los bancos que genera se compilan en la carpeta que configura la integración y se guardan con Git LFS (*.bank), igual que el resto de binarios pesados. La idea general del sonido del juego está en Interfaz, arte y sonido; aquí describo lo técnico.

Eventos

Evento Parámetros Cuándo suena
event:/Gun/Jet Temperatura (0-1), Amplitud (0-1) En bucle mientras el chorro está activo. Cambia de timbre con la temperatura y con la amplitud
event:/Gun/Vacuum Succion (0-1), TanqueLleno (0/1) En bucle mientras aspiro. Con el tanque lleno cambia a un sonido de esfuerzo
event:/Ice/Melt RitmoFundido En bucle mientras el chorro funde hielo. Sigue los litros fundidos por segundo
event:/Water/Merge Nivel (0-3) Una vez, cuando dos bolitas se fusionan. El nivel cambia el tono
event:/Caves/Open Ninguno Una vez, al abrirse una cueva
event:/Minerals/Crack Integridad Mientras un cristal se agrieta. Sigue su integridad
event:/Minerals/Release Ninguno Una vez, cuando un cristal se suelta
event:/Loot/Species Ninguno Una vez, al registrar una especie nueva
event:/Fossil/Snap Ninguno Una vez, cuando un hueso encaja
event:/Fossil/Slip Ninguno Una vez, cuando un hueso mal colocado resbala
event:/World/ModuleComplete Ninguno Una vez, al completar un módulo
event:/Ambience/Depth Profundidad (global) En bucle durante toda la partida

Parámetros globales, snapshots y mezclador

Profundidad es un parámetro global. Lo calculo a partir de la altura del jugador y lo actualizo cuando cambia, de modo que el ambiente y otros eventos pueden leerlo sin que yo se lo pase a cada uno.

Los snapshots cambian la mezcla en bloque:

Snapshot Cuándo está activo
snapshot:/Surface En la superficie
snapshot:/UnderIce Bajo el hielo, en la piscina
snapshot:/Cave Dentro de una cueva abierta, con reverberación

Para saber si estoy en una cueva consulto el id de región en la posición del jugador, con la misma lectura de densidad del sistema de hielo (Sistema de hielo). Si esa región es una cueva abierta, el snapshot Cave entra con un fundido, y sale igual cuando vuelvo al hielo.

El mezclador tiene un bus Master y cuatro buses debajo: Música, Ambiente, SFX y UI. Los VCAs me dan un control de volumen por categoría para el menú de opciones.

Código

AudioService es el único componente que habla con FMOD. Se suscribe a los canales de eventos (Arquitectura) y reacciona: para los sonidos de una sola vez llama a RuntimeManager.PlayOneShot, y para los bucles guarda un EventInstance que arranca, para y libera él mismo. Los parámetros los cambio con setParameterByName solo cuando el valor ha variado, no en cada fotograma, porque llamar a FMOD con el mismo valor es trabajo inútil.

Los eventos con posición en el mundo, como el chorro o el cristal que se agrieta, siguen su objeto con RuntimeManager.AttachInstanceToGameObject, de modo que se oyen con la espacialización correcta mientras me muevo.

Las referencias a eventos no son cadenas sueltas. Un ScriptableObject AudioEvents guarda un campo EventReference por cada evento de la tabla, y AudioService los lee de ahí. Como EventReference guarda también el GUID del evento, puedo renombrar o mover un evento en FMOD Studio sin que la referencia deje de apuntar al evento correcto.

Depuración

Uso el live update de FMOD Studio para mover parámetros con el juego en marcha y escuchar el resultado al momento, y el profiler de FMOD para ver cuántas voces suenan a la vez y cuánto CPU cuesta el audio. Eso entra en el presupuesto de "Gameplay, UI y audio" de Arquitectura.

El riesgo principal de FMOD es técnico, no de sonido: que la integración rompa el build. Por eso lo compilo pronto y a menudo, como detallo en Guardado, rendimiento y pruebas.

Licencia

FMOD ofrece licencia gratuita para proyectos pequeños y no comerciales. Antes de publicar nada fuera del ámbito de la asignatura, reviso las condiciones vigentes.

Los rangos de los parámetros de esta página son valores iniciales y los ajusto al escuchar el juego.

Clone this wiki locally