Как синхронизировать игру с музыкой

10

Вы можете быть знакомы с играми ryhtm, такими как Dancing Line , Geometry Dash или даже Guitar Hero . У них есть что-то общее: каждое действие в игре синхронизировано с музыкой. Моя цель - создать игру типа Geometry Dash, в которой игрок должен выполнять некоторые действия в ритме, пока персонаж автоматически прокручивает уровень. У меня есть несколько вопросов об этом типе игры:

  • Должен ли я поддерживать постоянный FPS, так как он всегда должен синхронизироваться с музыкой?
  • Как я могу строить свои уровни с учетом музыки, чтобы обеспечить ее синхронизацию?

Я работаю над Unity с использованием C #.

Shashimee
источник

Ответы:

18

Я не рекомендую использовать Time.deltaTime для отслеживания прогресса при воспроизведении песни, как описано в другом ответе.

Это отлично подходит для сглаживания и интерполяции эффектов для воспроизведения в реальном времени, но когда вы хотите соответствовать времени песни, вы должны спросить песню.

В Unity вы можете измерять прогресс аудиоисточника, воспроизводя трек напрямую, используя AudioSource.timeилиAudioSource.timeSamples для получения точного положения точки воспроизведения. (Обратите внимание, что последний измеряет в сэмплах, которые могут варьироваться по частоте в секунду в зависимости от того, как вы сжимали вашу дорожку)

Таким образом, вам не нужно запускать свой отдельный таймер и надеяться, что они будут синхронизированы. Вы можете подключить игровые триггеры эффектов совпадения ударов, чтобы убежать от собственной временной шкалы песни.

Для наложения звуков игрового процесса на музыку вы можете использовать AudioSource.PlayScheduled, чтобы гарантировать, что ваши звуки попадают точно в такт, поскольку можно заметить даже небольшое несоответствие

Д.М.Григорий
источник
Есть идеи, как синхронизировать графику с AudioSource? Например, я хочу показать взрыв или столкновение, связанное с музыкой. Я хочу показать это точно, когда звучит звук.
Сябро
Вот о чем все ответы здесь. @Syabro, не сталкивались ли вы с претворением предложений из этих ответов в жизнь?
DMGregory
2

В качестве альтернативы, если у вас все в порядке с не работать с нуля.

Уже есть готовые ресурсы (в разделе «Расширения редактора / Аудио», например https://www.assetstore.unity3d.com/en/#!/content/54639 (платно) или https://www.assetstore.unity3d.com/en. / #! / content / 39835 (бесплатно)), где вы можете синхронизировать музыкальные треки с событием. В этом примере оружие стреляет в такт музыки.

Если вы хотите узнать, как они работают, попробуйте 1-2 бесплатных и посмотрите на источник.

Zibelas
источник
Некоторое время назад я видел презентацию от разработчиков Koreographer - выглядело как отличная технология! В то время его возможности аудио анализа были ограничены, но если вы заранее знали, с какой дорожкой вы работаете, вы могли бы использовать эту технологию для очень точного планирования игровых событий в соответствии с конкретными ударами / моментами в музыке. Я не знаю, добавили ли они возможность делать больше анализа автоматически после этой демонстрации.
DMGregory
1

Unity уже отделяет игровой процесс от частоты кадров. Если вы не забываете всегда использовать Time.deltaTimeв своих функциях обновления, фактическая частота кадров графики не должна влиять на скорость игрового процесса. Поэтому, когда вы запускаете игру и звуковую дорожку одновременно, они должны оставаться синхронизированными.

Что касается проектирования уровней вокруг музыки, есть два подхода:

  • Ручной подход. Дотошно ручной уровень вокруг определенных звуковых дорожек. Наличие оригинальных нотных листов под рукой может помочь, но также возможно сделать это только на слух.
  • Процедурный подход. Используйте алгоритмы аудио анализа для автоматической генерации уровней вокруг звуковых дорожек. Самое простое - просто посмотреть на объемные пики. Это уже должно позволить вам идентифицировать удары барабанов во многих песнях и создавать препятствия соответственно. Следующим шагом является обнаружение сдвигов объема отдельно в разных частотных спектрах. Это делает обнаружение ударов более надежным и позволяет создавать различные препятствия для разных полей. Но это все еще только царапает поверхность. Аудиоанализ - очень широкая и интересная область. Люди написали много научной литературы об этом.

    Насколько глубоко вам нужно погрузиться в это поле, зависит от ваших амбиций. В некоторых играх достаточно просто определять удары и генерировать случайным образом все остальные элементы дизайна уровней ( Crypt of the Necrodancer ). Другие пытаются поставить как можно больше аспектов дизайна уровней под контроль звука ( Audiosurf ).

Многие ритм-игры используют гибридный подход. Вы создаете первый черновик уровня, используя генератор, а затем настраиваете его вручную, чтобы сделать его более играбельным.

Philipp
источник
Спасибо за ваш ответ, я посмотрю на это! Является ли Time.deltaTime действительно точным, и не будет никакого временного лага, созданного с помощью длинных музыкальных композиций?
Шашим
@ Shashimee Это должно быть достаточно точно. Если вы хотите быть уверены, что ничего не потеряете из-за округления, используйте Time.timeвместо этого.
Филипп
Я бы порекомендовал процедурный подход, потому что он открывает гораздо больше возможностей для развития игры. Игроки могут добавлять свои собственные треки, вы можете менять сетку и все остальное в такт, как частицы. Кроме того, вы не будете тратить много времени на разработку уровней.
Candid Moon _Max_
1
@ Филипп, к сожалению, Time.time может быть еще более подвержен неточности, если игра была запущена некоторое время . Так как он измеряет игровое время с момента запуска, а не с начала трека или начала уровня, после воспроизведения одной или двух песен он потеряет столько же младших битов точности, сколько наивная сумма дельт, и ошибка может продолжайте увеличиваться, если игра снова будет запущена / спит-восстановлена.
DMGregory
0

Очень распространенным является подход к созданию «карты ударов». Любые данные, которые представляют ритмы в песне. Это может быть текстура, файл данных или что-то еще, что содержит эту информацию. Большую часть времени он создается вручную для создания различных ударов и комбинаций, версий скоростей для звуковой карты.

Однако он может быть сгенерирован процедурно из данных аудиофайла.

Как получить скорость, соответствующую «точке удара»? Когда порождать объект?

Speed = Distance / Time,

Distance = Расстояние между точками создания GameObject и «точки удара».

Time =Длина звука и построенная карта битов должно быть достаточно. С помощью этой информации вы можете анализировать данные аудио / карты, чтобы предсказать, когда объект должен быть создан для достижения точной точки. Теперь все зависит от того, когда вы хотите порождать этот объект, если вы хотите, чтобы он был очень быстрым после появления, тогда вы вызываете его позже с большой скоростью. Если вы хотите, чтобы он работал с нормальной скоростью - тогда ему понадобится время, чтобы дойти до плеера, а для воспроизведения звука нужно время.

Вы даже можете создать новую карту с метками времени для появления объектов битов для конкретной звуковой карты. Вы должны сделать некоторые прогнозы в какой-то момент, чтобы иметь возможность соответствовать ритму, для самого популярного стиля, я бы сказал, чтобы предсказать whenпоявление объекта, чтобы он перемещался с определенной вероятностью speed. Они могут быть сделаны во время выполнения, или считаны из некоторого файла, рассчитанного ранее, или сохранены в RAM ...

Я полагаю, что в играх Osuэтого нет Distance, просто время сокращения кругов, ударов в минуту ... Карты обычно создаются на заказ. Таким образом, подход к вычислению визуальных эффектов зависит также от стиля игры, которую вы делаете.

Таким образом, чтобы подвести итог всего, значения являются взаимозависимыми. Зависит от того, сколько ударов у вас есть, на расстоянии между точкой возрождения и игроком, а иногда зависит от предоставленных данных [в некоторых играх скорость каждого удара и его внешний вид закодированы в некотором файле данных, который создается вручную]. Если вы делаете это процедурным способом, то вы можете вычислить все в основном, используя аудиоданные.

Candid Moon _Max_
источник