(Unity) Как записывать и инвертировать все звуки, которые происходили перед инверсией?

Пишу класс, который будет по желанию игрока инвертировать всё, что происходит в игре.(позиции, повороты, физику и т.п.) Много посмотрел скриптов, но так и не увидел такого, который мог в какой-то лист, массив записывать все звуки из AudioSource, а потом с какого-то момента воспроизводить назад. Важно понимать, что после отмотки он должен записывать с того момента, где закончилась наша инверсия. То есть у нас есть 3 аудио трека. 1 -> 2 -> 3 Мы инвертируем. 3 -> 2. Останавливаемся, а потом идёт 2 -> 3 и т.п. Увидел только такой вариант, но он мне не подходит, т.к. он лишь меняет питч для отдельного трека + нельзя воспроизвести с конца.

audioSource.pitch = -audioSource.pitch

Ответы (1 шт):

Автор решения: Andrew

Гугление показало что юнитисты и вправду намудрили с наименованием переменной и назвали ее совсем не тем именем, которым она должна называться.

Unity can only change the speed of an AudioSource. It calls this parameter "Pitch". However, changing it will always change both pitch and tempo, since this is just a matterl of changin the playback sampling rate and can be done in realtime at almost no cost and with (almost) no sound distortion. https://answers.unity.com/questions/25139/how-i-can-change-the-speed-of-a-song-or-sound.html

Если коротко и по-русски: переменная Pitch у них должна быть названа PlaybackSpeed или Tempo т.к. она не отвечает за общепринятый термин "Pitch" (тональность звука), а отвечает за скорость воспроизведения.

Так что ты должен сделать для реверса :

audioSource.pitch = -1;

держа в голове что это не pitch, а tempo.

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

Или же ты должен найти алгоритм как это можно делать без сильных затрат ресурсов. Например можно подсмотреть в открытом коде VLC реализацию.

Или же можно поискать готовые библиотеки обработки звука которые можно подключать к юнити. Вероятнее всего есть импортированная в юнити NAudio - поищи в эту сторону.


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

→ Ссылка