Проблемы с синхронизацией звука для ритм-игры (время звучания впереди, а не позади) - PullRequest
0 голосов
/ 06 июня 2019

Я работаю над преобразованием нашей старой игры для iOS Rhythm Control 2 в Unity.Сначала все шло хорошо, но когда я начал работать над основной игровой логикой, у меня начались проблемы с синхронизацией звука.Чтобы объяснить, как работает игра: Круглая нота появляется в песне с определенными значениями в миллисекундах и сжимается до тех пор, пока не достигнет размера меньшего статического объекта круга на экране.В этот момент вы нажимаете на ноту и получаете очки в зависимости от того, насколько вы точны (33 мс за потрясающий, 66 мс за отличный и т. Д.).

Логика игры работает следующим образом:

ВНачало:

  • Чтение из текстового файла, содержащего всю информацию о «нотах» песни, и сохранение их в массиве пользовательских объектов.
  • Воспроизведение песни с небольшой задержкой музыки. PlayScheduled (AudioSettings.dspTime + 3.0f);

В обновлении:

  • Обработка ввода с клавиатуры (сравнить время анимации заметки с моментом нажатия кнопки)
  • Рассчитать время звука, float audioTime = music.timeSamples / 44100.0f * 1000.0f;
  • Проверьте массив неактивных заметок и, если audioTime> время обращения к заметке - 500 мс (время анимации), отметьте как активную и начните анимацию заметки.
  • Добавление неактивной заметки в массив активных заметок для обработки клавиатуры.

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

Проблема:

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

Вещи, которые я пробовал:

  • Пробовал с использованием файлов .mp3, .ogg и .wav.Все экспонаты одинаковы.
  • Пробовал различные варианты сжатия, а также отключение всех сжатий для аудиофайла.
  • Проверка длины трека в редакторе идентична тому, что я вижу в Audacity.
  • Четверная проверка моей логики и того, как я оживляю круги.Создание таймера с помощью dt, а также использование секундомера для проверки анимации занимает около 500 мс (и не идет быстрее).
  • Использование FMOD в качестве альтернативы, также демонстрирует ту же проблему.
  • В настройках проекта установите частоту дискретизации системы, а также все звуковые устройства на моем компьютере, равную 44100.
  • Попытка использовать другой размер буфера DSP (Хорошая задержка, лучшая задержка и т. Д.)
  • Попытка вне редактора при сборке Windows.Экспериментируя с различными настройками качества.
  • Использование audio.time, audio.timeSamples, дельта-времени и секундомера после воспроизведения песни, чтобы попытаться проверить аудио-время.

Заключение / Вопросы:

Ячестно говоря, не уверен, что происходит в этот момент.Я потратил около 40 часов на эту проблему, и хотя я мог бы просто применить смещение 200 мс, я действительно хочу понять, что происходит, или если я допустил действительно глупую логическую ошибку.

1.) Когдаимпортируя файл wav без сжатия, я замечаю, что размер файла все еще изменяется.Например, в инспекторе я вижу «Оригинальный размер: 22,2 МБ, Импортированный размер: 7,1 МБ».Почему это происходит?Есть ли способ отключить это?

2.) Удаляет ли Unity какую-либо аудиоинформацию из файлов при импорте или воспроизведении, которая может повлиять на общую длину трека?

3.) Что ещечто я могу проверить?

Спасибо за ваше время.Буду очень признателен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...