Найти в Дзене
Тихий Уголок

Перемешивание музыкального плейлиста из FMOD в Unity

перевод оригинальной статьи Алессандро Фама - Shuffle Music Playlist with FMOD in Unity
Оглавление

перевод оригинальной статьи Алессандро Фама - Shuffle Music Playlist with FMOD in Unity

Если нашей игре не нужны музыкальные переходы, и мы просто хотим создать кучу музыкальных ивентов в инспекторе Unity и позволить им воспроизводиться в случайном порядке, то мы можем легко сделать это, написав код на C# . Мы также рассмотрим, как использовать User Properties (свойства пользователя) ивента FMOD для получения заранее определенной информации, в нашем случае мы получим имя исполнителя и название песни для каждого трека.

В оригинальной статье нет ссылки на проект, который можно посмотреть. Я воссоздал его пользуясь данным руководством.
Скачайте проект Unity & FMOD для этого руководства. В проекте использовались Unity 2019.2.20f и FMOD версии 2.00.11.Если после открытия проекта у вас возникнут какие-либо ошибки, удалите файл FMODStudioCache.asset, поскольку он содержит старый путь к проекту FMOD Studio.

***

Оглавление

  • Подготовка в FMOD Studio
  • Код для воспроизведения в случайном порядке
  • Настройка в Unity

***

Подготовка в FMOD Studio

Перетащите несколько ваших музыкальных файлов на вкладку Events FMOD и выберите опцию создания нескольких 2D-event:

вкладка FMOD Studio Events
вкладка FMOD Studio Events

Найдите раздел Properties (Свойства) в правой части окна ивента, вы можете ввести информацию об ивенте в поле User Properties (Свойства пользователя). Введем исполнителя и название песни:

FMOD Studio Event User Properties (свойства для пользователя)
FMOD Studio Event User Properties (свойства для пользователя)

Создайте/сбилдите мастер-банк (master bank) и отправляйтесь в Unity.

***

Код для воспроизведения ивентов в случайном порядке

Создайте новый скрипт с именем ShufflePlaylist.cs и объявите строковый массив (string array), который будет заполнен нашими путями ивентов в инспекторе. Также объявите объект EventInstance FMOD и строки artistName и songName:

[ FMODUnity.EventRef ] public string [] fmodPaths;
private FMOD.Studio.EventInstance instance;
private string artistName, songName;

Теперь создайте метод с именем ShuffleMusic(), который принимает наш строковый массив в качестве параметра. Мы будем использовать алгоритм перемешивания Фишера–Йейтса, чтобы перебрать массив и перемешать ивенты:

Теперь мы создаем корутину(Coroutine) PlayMusic() и передадим туда наш перемешанный строковый массив в качестве параметра:

По сути, мы перебираем массив и напрямую создаем экземпляр FMOD. Мы проверяем, не воспроизводится ли ивент прямо сейчас, и получаем EventDescription для нашего ивента. Нам нужен этот шаг для получения информации из пользовательских свойств User Properties ивента FMOD. Для этого мы собираем количество пользовательских свойств, присутствующих в событии, вызывая getUserPropertyCount(), затеммы объявляем массив структуры (struct) FMOD.Studio.USER_PROPERTY и устанавливаем значение массива равным количеству свойств пользователя User Property. Мы перебираем этот массив и получаем нужное нам свойство пользователя User Property, вызывая getUserPropertyByIndex(). Мы устанавливаем для строк artistName и songName первые два значения массива userProperties и используем Debug.Log() для вывода этой информации в консоль Unity.

После этого мы запускаем инстанс (также сразу же освобождаем его, чтобы освободить его из памяти после воспроизведения до конца) и используем цикл while, чтобы дождаться остановки экземпляра. Метод PlaybackState выглядит так:

FMOD.Studio. PLAYBACK_STATE PlaybackState (FMOD.Studio.EventInstance instance )
{
FMOD.Studio.PLAYBACK_STATE pS;
instance.getPlaybackState( out pS);
return pS;
}

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

Начальный цикл for перейдет к следующей песне, пока все песни не будут воспроизведены один раз. Мы снова вызываем ShuffleMusic(), чтобы перетасовать наши треки. Вставьте ShuffleMusic() в метод Unity Start(), чтобы мы могли протестировать поведение в случайном порядке при запуске игры.

***

Настройка в Unity

Создайте новый GameObject и добавьте к нему компонент ShufflePlaylist. Выберите количество песен в поле Size и выберите свои песни в полях элемента массива:

Вид скрипта ShufflePlaylistв инспекторе Unity
Вид скрипта ShufflePlaylistв инспекторе Unity

Запустите сцену и посмотрите на консоль Unity: вы увидите песни, отображаемые в случайном порядке, а также имя исполнителя и название песни:

Отображение к консоли Unity перемешивания песен
Отображение к консоли Unity перемешивания песен

Я визуализировал эту информацию с помощью Unity Canvas и трех текстовых элементов, включая текущее время песни:

Визуализация FMOD User Properties в Unity
Визуализация FMOD User Properties в Unity

#unity #unity3d #fmod #audioengine #gamedev #sounddesign #саунддизайн