- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

Для посылки OSC-сообщений использованы наработки Mike Heavers’а [6]. Их нужно импортировать в 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 [7]

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

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

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

Автор: headshotlab

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/unity3d/233323

Ссылки в тексте:

[1] Unity (Survival Shooter): https://www.assetstore.unity3d.com/en/#!/content/40756

[2] языка аудио-программирования Chuck: https://en.wikipedia.org/wiki/ChucK

[3] Open Sound Control (OSC): https://en.wikipedia.org/wiki/Open_Sound_Control

[4] Perry Cook’ом: https://en.wikipedia.org/wiki/Perry_R._Cook

[5] Physics-Based Sound Synthesis for Games and Interactive Systems: https://www.kadenze.com/courses/physics-based-sound-synthesis-for-games-and-interactive-systems/info

[6] наработки Mike Heavers’а: https://github.com/heaversm/unity-osc-receiver

[7] Image: https://hsto.org/files/150/174/fa2/150174fa21264bd5bc5f963f0ebb4450.jpg

[8] Источник: https://habrahabr.ru/post/319524/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best