lunes, 20 de abril de 2015

Configuración de sonido

Sigo con el sonido, después de ver la teoría, vamos a ver cómo lo uso en el juego. Intenté hacerlo todo con snapshots y transiciones entre ellas. No es mala idea pero no funciona por usar este sistema para intentar crear animaciones de sonido.

Unity 5 mixer

Voy a comenzar por explicar los efectos que quiero conseguir y después voy a explicar los intentos de conseguirlo. Lo que quiero es:

  • Poder controlar (incluso dar la opción al usuario en la configuración) el volumen de música y efectos de juego (espada, curación, quejidos...) por separado.
  • Poder cortar el volumen de todo el sonido del juego cuando suene una interrupción, que se note también que se interrumpe el sonido normal del juego con esa interferencia.
  • Un efecto de corte de frecuencias altas en el menú de pausa.
  • Poder poner un efecto de reberveración y eco ajustable a todos los sonidos y bajar el pitch de la música según el estado de salud del personaje.
  • Que la transición entre estados del personaje sea suave.

Mi jerarquía de groups en el mixer es la siguiente: tengo un group padre (Master) y 4 hijos directos: Music, Effects, Reverb e Interrupción. Los nombres son bastante descriptivos, un group para la música ambiente, otro para efectos de sonido, otro para el efecto de reverberación y eco; y otro para el sonido de las interrupciones.

En el group de reverberación recibo los sonidos que me quieran mandar en lo alto de la pila, después viene la atenuación (así puedo controlar el volumen del eco) y después vienen los efectos de reverberación y eco. Lo que recibe este canal son la salida de los canales de música y efectos.

Cuando hablo de transiciones entre estados, no solo quiero poder hacer una transición cuando cambie el estado, sino que el sonido esté constantemente cambiando entre los 2 extremos del estado en el que estemos, para conseguir un efecto de cambio constante, al igual que haré con los efectos gráficos. Espero conseguir un efecto parecido a cuando estamos mareados, que no es algo constante sino que a veces se nos va más la cabeza, como si el mareo se fuera haciendo más fuerte en algunos momentos. Así pues si tenemos la vida al 66%, el sonido iría alternando entre los efectos para el 75% y 50%. Por lo que necesito 5 estados de sonido: 0, 25, 50, 75 y 100 para cubrir los 4 estados de salud que tiene el juego.

Lo del menú de pausa con el corte de altas frecuencias lo hacen en el tutorial de Unity y me parece muy buena idea. No quitas el sonido al juego (al estar pausado seguramente no haya efectos de sonido al no moverse nada), y la música se sigue oyendo, pero como si hubieras cerrado una puerta, que no es solo una reducción de sonido, sino que los agudos desaparecen, los medios casi también y solo se escucha un poco de los bajos, parecido a estar fuera de una discoteca. Me pareció buen efecto para el menú de pausa, donde sigues en el juego pero no jugando, es como cerrar una puerta al juego, pero no te has ido de esa casa. Este efecto lo coloco en el master, y no me hace falta usar send y recieve ya que va a afectar a todos los sonidos.

Todo esto lo quería hacer con snapshots. Tendría una para cada estado sonoro (100, 75, 50...) y otras dos para los casos de interrupción y pausa. En cada snapshot están los valores que necesito: volumen, pitch, nivel de send a eco, el recorte por frecuencias, etc. La idea es hacer transiciones largas (10 segundos) entre los dos extremos del estado de salud (entre 100 y 75 por ejemplo) y transiciones rápidas (de 0.1 segundos por ejemplo) para pasar a los snapshots de interrupción o pausa.

El problema es que no funciona. Bueno, funciona, pero raro. Porque los snapshots cambian todos los parámetros. Entonces al hacer una interrupción, a lo mejo el pitch estaba a 92 (un valor entre 90 y 100 es normal cuando estamos entre los snapshots de 100 y 75), al ir a Interrupción se pone al 100, pero es normal en la interrupción, el problema es al volver de la interrupción, tengo que volver a 100 o a 75, en cuyo caso sería poner un pitch de 90 o 100, si paso de 92 a 100 de forma inmediata, aunque sea con una interrupción de por medio se nota mucho el cambio de tono. Y si no cambio rápido de interrupción a normal, sino que voy lento para que no se note esa transición el volumen también irá lento y tardaré 10 segundos en volver a subir el volumen, inaceptable.

Así que he cambiado un poco la forma de plantearlo, he dejado los snapshots solo para los estados de juego normal (100, 75, 50...) y los de interrupción y pausa ya no lo hago como snapshot, sino desde código, exponiendo ciertos parámetros. En un mixer se pueden exponer ciertos valores, de los groups, efectos, de lo que sea, tenemos que exponer el parámetro explícitamente y darle un nombre, de forma muy parecida a como se hace en Mecanim. Pero tenemos que tener en cuenta que una vez que modificamos un parámetro expuesto por código, deja de formar parte del snapshot y ya no hará caso a los cambios de snapshot (hasta que lo liberemos).

Exposed parameters

Así que expongo 4 parámetros, por un lado el volumen de los canales de música, fx y reverb. Y el cuarto es el nivel de corte del filtro de paso bajo. Así cuando hay una interrupción paso el volumen de los 3 primeros de 0db (volumen “a tope”) a -80 db (silenciado). Y a la inversa cuando la interrupción acaba. De normal la frecuencia de corte del filtro de paso bajo es de 22000 HZ (es decir no corta nada que oigamos los humanos), y al pausar, cambio por código ese valor a 250 HZ, con lo que se corta todo sonido más agudo que esa frecuencia.

De esta forma cuando vamos a una interrupción, la transición entre estados sigue su curso y al volver de la interrupción estamos en los mismos valores o muy cercanos de antes de irnos y no notamos nada raro.

No hay comentarios :

Publicar un comentario