Cómo sincronizar un juego con música

10

Puede estar familiarizado con los juegos de ritmo como Dancing Line , Geometry Dash o incluso Guitar Hero . Tienen algo en común: cada acción del juego se sincroniza con la música. Mi propósito es hacer un juego como Geometry Dash donde el jugador tiene que hacer algunas acciones en ritmo mientras el personaje se desplaza automáticamente en el nivel. Tengo algunas preguntas sobre este tipo de juego:

  • ¿Tengo que mantener mi FPS constante ya que siempre debe estar sincronizado con la música?
  • ¿Cómo puedo construir mis niveles con una música en mente para asegurarme de que esté sincronizada?

Estoy trabajando en Unity usando C #.

Shashimee
fuente

Respuestas:

18

No recomiendo usar Time.deltaTime para seguir el progreso a través de la reproducción de la canción como se describe en otra respuesta.

Es genial para que los efectos de suavizado e interpolación se reproduzcan en tiempo real, pero cuando quieras igualar el tiempo de la canción, debes preguntarla.

En Unity, puede medir el progreso de una fuente de audio reproduciendo una pista directamente usando AudioSource.timeo AudioSource.timeSamplespara obtener la posición precisa del cursor de reproducción. (Tenga en cuenta que este último mide en muestras, que pueden variar en velocidad por segundo dependiendo de cómo haya comprimido su pista)

De esta manera, no necesita ejecutar su propio temporizador por separado y esperar que permanezcan sincronizados. Puede conectar disparadores de juego de efectos de coincidencia de ritmo para que se ejecuten fuera de la propia línea de tiempo de la canción.

Para superponer los sonidos del juego en la música, puede usar AudioSource.PlayScheduled para garantizar que sus sonidos lleguen exactamente al ritmo, ya que incluso se puede notar una pequeña falta de coincidencia

DMGregory
fuente
¿Alguna idea de cómo sincronizar gráficos con AudioSource? Fe quiero mostrar una explosión o colisión relacionada con la música. Quiero mostrarlo exactamente cuando se reproduce el sonido.
syabro
De eso se tratan todas las respuestas aquí. ¿Encontró problemas para poner en práctica las sugerencias de estas respuestas, @syabro?
DMGregory
2

Como alternativa, si está bien con no trabajar desde cero.

Ya hay activos listos (en Extensiones de editor / Audio como https://www.assetstore.unity3d.com/en/#!/content/54639 (pagado) o https://www.assetstore.unity3d.com/en / #! / content / 39835 (gratis)) donde puedes sincronizar pistas de música a eventos. En ese ejemplo, el arma está disparando al ritmo de la música.

Si quieres aprender cómo funcionan, prueba 1-2 de los gratuitos y mira la fuente.

Zibelas
fuente
Vi una presentación de los desarrolladores de Koreographer hace un tiempo, ¡parecía una gran pieza de tecnología! En ese momento, sus capacidades de análisis de audio eran limitadas, pero si conocía de antemano la pista con la que está trabajando, podría usar la tecnología para programar con mucha precisión los eventos del juego a ritmos / momentos específicos en la música. No sé si agregaron la capacidad de hacer más análisis automáticamente desde esa demostración.
DMGregory
1

La unidad ya desacopla la jugabilidad de la velocidad de fotogramas. Si recuerdas usar siempre Time.deltaTimeen tus funciones de actualización, la velocidad de cuadros de gráficos real no debería afectar la velocidad de juego. Entonces, cuando comienzas el juego y la pista de audio al mismo tiempo, deben permanecer sincronizados.

Con respecto al diseño de niveles en torno a la música, hay dos enfoques:

  • El enfoque manual. Niveles meticulosamente hechos a mano en torno a pistas de audio específicas. Tener las partituras originales a mano puede ayudar, pero también es posible hacerlo solo de oído.
  • El enfoque procesal. Use algoritmos de análisis de audio para generar automáticamente niveles alrededor de pistas de audio. Lo más simple es buscar picos de volumen. Eso ya debería permitirle identificar ritmos de batería en muchas canciones y generar obstáculos en consecuencia. Un paso más allá es detectar cambios de volumen por separado en diferentes espectros de frecuencia. Esto hace que la detección de latidos sea más confiable y le permite generar diferentes obstáculos para diferentes tonos. Pero eso sigue rascando la superficie. El análisis de audio es un campo muy amplio e interesante. La gente escribió mucha literatura científica al respecto.

    La profundidad que necesita para sumergirse en este campo depende de cuán ambicioso sea. Algunos juegos están satisfechos con solo detectar los latidos y generar aleatoriamente todo el resto del diseño de nivel ( Crypt of the Necrodancer ). Otros intentan poner tantos aspectos del diseño de niveles bajo el control del audio como pueden ( Audiosurf ).

Muchos juegos de ritmo utilizan un enfoque híbrido. Generas un primer borrador del nivel usando un generador y luego lo modificas a mano para que sea más jugable.

Philipp
fuente
Gracias por tu respuesta, ¡lo investigaré! ¿Es Time.deltaTime realmente preciso y no habrá ningún retraso de tiempo creado con músicas largas?
Shashimee
@Shashimee Debería ser lo suficientemente preciso. Si desea estar realmente seguro de no perder nada por redondear las diferencias, use Time.timeen su lugar.
Philipp
Recomendaría un enfoque de procedimiento porque abre muchas más posibilidades para el desarrollo del juego. Los jugadores pueden agregar sus propias pistas, puedes cambiar la malla y todas las demás cosas al ritmo, como partículas. Además, no pasará muuuucho tiempo diseñando niveles.
Candid Moon _Max_
1
@Philipp desafortunadamente Time.time puede ser aún más susceptible a la imprecisión si el juego lleva un tiempo funcionando . Dado que mide el tiempo de juego desde el inicio, en lugar de desde el inicio de la pista o el inicio del nivel, después de reproducir una canción o dos, habrá perdido tantos bits bajos de precisión como una ingenua suma de deltas, y el error puede continuará aumentando si el juego se deja en ejecución / se duerme y se restaura repetidamente.
DMGregory
0

Muy común es el enfoque para tener un "mapa de ritmo". Cualquier tipo de datos que represente los ritmos de la canción. Puede ser una textura, un archivo de datos o cualquier otra cosa que contenga esa información. La mayoría de las veces se crea manualmente para crear diferentes ritmos y combinaciones, versiones de velocidades para un mapa de audio.

Sin embargo, puede generarse procesalmente a partir de datos de archivos de audio.

¿Cómo conseguir que la velocidad coincida con el "punto de latido"? ¿Cuándo generar un objeto?

Speed = Distance / Time.

Distance = Distancia entre los puntos de creación de GameObject y de "beat point".

Time =La longitud de audio y el mapa de ritmo construido deberían ser suficientes. Con esta información puede analizar los datos de audio / mapa para predecir cuándo se debe generar un objeto para llegar al punto exacto. Ahora todo depende de cuándo quieres engendrar ese objeto, si quieres que sea muy rápido después del engendro, entonces lo engendras más tarde con gran velocidad. Si desea que esté a una velocidad normal, necesitará tiempo para llegar al reproductor y el audio necesita tiempo para reproducirse en el momento adecuado.

Incluso puede generar un nuevo mapa con marcas de tiempo para engendros de objetos beat para un mapa de audio en particular. Tienes que hacer algunas predicciones en algún momento para poder igualar el ritmo, para el estilo más popular, diría, para predecir whengenerar el objeto para que se mueva con seguridad speed. Esos pueden hacerse en tiempo de ejecución, o leerse de algún archivo calculado previamente, o guardarse en RAM ...

Supongo que los juegos como Osuno tienen esto Distance, solo tienen tiempo de reducción de círculos, bpm ... Los mapas generalmente están hechos a medida. Por lo tanto, el enfoque para calcular las imágenes depende del estilo del juego que estés haciendo también.

Para resumir todo, los valores son interdependientes. Depende de cuántos latidos tenga, de la distancia entre el punto de generación y el jugador, y a veces depende de los datos proporcionados [algunos juegos tienen la velocidad de cada latido y su apariencia codificada en algún archivo de datos que se crea manualmente]. Si lo está haciendo de manera procesal, puede calcular todo básicamente utilizando datos de audio.

Candid Moon _Max_
fuente