Генерация звука для Unity-проектов с помощью Chuck и OSC

в 13:05, , рубрики: Open Sound Control, sound design, unity, unity3d, Работа со звуком, разработка игр

Небольшая заметка по озвучиванию проекта на Unity (Survival Shooter) посредством языка аудио-программирования Chuck и Open Sound Control (OSC).

В результате всех манипуляций, получился такой результат:

Все звуки генерируются “на лету” в Chuck’е. Wav-файлы не используются совсем. Для генерации подобия голоса использовано решение, написанное Perry Cook’ом для Chuck’а, суть решения частично объясняется в курсе Physics-Based Sound Synthesis for Games and Interactive Systems. В качестве выстрела использована обычная пилообразная волна с “падающим” питчем и добавлением хорус-эффекта.

Как это работает

Для посылки OSC-сообщений использованы наработки Mike Heavers’а. Их нужно импортировать в Unity-проект: плагин Osc.cs, плагин UDPPacketIO.cs, скрипт OSCTestSender.cs. К каждому объекту, который издаёт звук, крепим эти плагины и переработанный скрипт — для каждого он свой, изменяются адреса OSC-сообщений.

Всего в проекте 9 источников звука:

  • Player Shoot
  • Player Hurt
  • Player Death
  • Zombunny Hurt (маленький зелёный моб)
  • Zombunny Death
  • Zombear Hurt (маленький красный моб)
  • Zombear Death
  • Hellephant Hurt (большой жёлтый моб)
  • Hellephant Death

Принятие OSC-сообщений в среде Chuck делается с помощью класса OscIn. Указываем соответствующий порт (oin.port) и адрес (oin.addAddress). Далее при поступлении osc-сообщения генерируется звук.

На стороне Chuck сделано 5 отдельных проектов, каждый из которых принимает сообщение по своему порту и генерирует соответствующий звук(и):

  • oscin_shoot
  • oscin_player_hurt
  • oscin_zombunny_hurt
  • oscin_zombear_hurt
  • oscin_hellephant_hurt

Для теста нужно сначала запускать все программы Chuck — делаем отдельный файл запуска init.ck. Затем запускаем проект Unity. Играем, OSC-сообщения генерируются как только происходит нужное событие, Chuck принимает сообщения и генерирует звук.

Наглядно это можно представить схемой:

Unity connected to Chuck via Open Sound Control

Единственная проблема с которой я столкнулся — это переключение OSC-порта на другого моба. Если спаунится много персонажей, например 3 зомбо-кролика, 2 зомбо-медведя, то звук будет проигрываться только у первого заспаунившегося моба соответствующего типа. Переключение канала произойдёт только после убийства этого первого моба. Пока быстрого решения не нашёл.

Надеюсь было интересно, если у кого-то есть интересные ссылки по данным темам (OSC, генерация звука и т.п.) — пожалуйста, поделитесь в комментариях.

Спасибо за внимание!

Автор: headshotlab

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js