Глава 4.4: Аудио (.ogg, .wss)
Главная | << Назад: Материалы | Аудио | Далее: Рабочий процесс DayZ Tools >>
Введение
Звуковой дизайн -- один из самых погружающих аспектов моддинга DayZ. От хлопка винтовки до рассеянного ветра в лесу, аудио оживляет игровой мир. DayZ использует OGG Vorbis как основной аудиоформат и настраивает воспроизведение звука через многоуровневую систему CfgSoundShaders и CfgSoundSets, определяемых в config.cpp. Понимание этого конвейера -- от необработанного аудиофайла до пространственно расположенного внутриигрового звука -- необходимо для любого мода, добавляющего пользовательское оружие, транспорт, эмбиентные эффекты или обратную связь UI.
Эта глава охватывает аудиоформаты, конфигурируемую через конфиги систему звука, 3D-позиционное аудио, затухание громкости и расстояния, зацикливание и полный рабочий процесс добавления пользовательских звуков в мод DayZ.
Содержание
- Аудиоформаты
- CfgSoundShaders и CfgSoundSets
- Категории звуков
- 3D-позиционное аудио
- Затухание громкости и расстояния
- Зацикленные звуки
- Добавление пользовательских звуков в мод
- Инструменты для работы с аудио
- Распространённые ошибки
- Лучшие практики
Аудиоформаты
OGG Vorbis (основной формат)
OGG Vorbis -- это основной аудиоформат DayZ. Все пользовательские звуки следует экспортировать как файлы .ogg.
| Свойство | Значение |
|---|---|
| Расширение | .ogg |
| Кодек | Vorbis (сжатие с потерями) |
| Частоты дискретизации | 44100 Гц (стандартная), 22050 Гц (допустимо для эмбиента) |
| Глубина бит | Управляется кодировщиком (настройка качества) |
| Каналы | Моно (для 3D-звуков) или Стерео (для музыки/UI) |
| Диапазон качества | от -1 до 10 (5-7 рекомендуется для игрового аудио) |
Ключевые правила для OGG в DayZ
- 3D-позиционные звуки ДОЛЖНЫ быть моно. Если вы предоставите стерео-файл для 3D-звука, движок может неправильно пространственно расположить его или проигнорировать один канал.
- UI и музыкальные звуки могут быть стерео. Непозиционные звуки (меню, обратная связь HUD, фоновая музыка) корректно работают в стерео.
- Частота дискретизации должна быть 44100 Гц для большинства звуков. Более низкие частоты (22050 Гц) можно использовать для дальних эмбиентных звуков для экономии места.
WSS (устаревший формат)
WSS -- это устаревший аудиоформат из старых игр Bohemia (серия Arma). DayZ всё ещё может загружать WSS-файлы, но новые моды должны использовать исключительно OGG.
| Свойство | Значение |
|---|---|
| Расширение | .wss |
| Статус | Устаревший, не рекомендуется для новых модов |
| Конвертация | WSS-файлы можно конвертировать в OGG с помощью Audacity или подобных инструментов |
Вы встретите WSS-файлы при изучении ванильных данных DayZ или портировании контента из старых игр Bohemia.
CfgSoundShaders и CfgSoundSets
Аудиосистема DayZ использует двухуровневый подход конфигурации, определяемый в config.cpp. SoundShader определяет, какой аудиофайл воспроизводить и как, а SoundSet определяет, где и как звук слышен в мире.
Взаимосвязь
config.cpp
|
|--> CfgSoundShaders (ЧТО воспроизводить: файл, громкость, частота)
| |
| |--> MyShader ссылается --> sound\my_sound.ogg
|
|--> CfgSoundSets (КАК воспроизводить: 3D-позиция, расстояние, пространственность)
|
|--> MySoundSet ссылается --> MyShaderИгровой код и другие конфигурации ссылаются на SoundSets, никогда на SoundShaders напрямую. SoundSets -- это публичный интерфейс; SoundShaders -- это деталь реализации.
CfgSoundShaders
SoundShader определяет сырое аудиосодержимое и базовые параметры воспроизведения:
class CfgSoundShaders
{
class MyMod_GunShot_SoundShader
{
// Массив аудиофайлов -- движок выбирает один случайно
samples[] =
{
{"MyMod\sound\gunshot_01", 1}, // {путь (без расширения), вес вероятности}
{"MyMod\sound\gunshot_02", 1},
{"MyMod\sound\gunshot_03", 1}
};
volume = 1.0; // Базовая громкость (0.0 - 1.0)
range = 300; // Максимальная дальность слышимости (метры)
rangeCurve[] = {{0, 1.0}, {300, 0.0}}; // Кривая затухания громкости
};
};Свойства SoundShader
| Свойство | Тип | Описание |
|---|---|---|
samples[] | массив | Список пар {путь, вес}. Путь не включает расширение файла. |
volume | float | Базовый множитель громкости (от 0.0 до 1.0). |
range | float | Максимальная дальность слышимости в метрах. |
rangeCurve[] | массив | Массив точек {расстояние, громкость}, определяющих затухание по расстоянию. |
frequency | float | Множитель скорости воспроизведения. 1.0 = нормальная, 0.5 = половинная скорость (ниже тон), 2.0 = двойная скорость (выше тон). |
Важно: Путь
samples[]НЕ включает расширение файла. Движок автоматически добавляет.ogg(или.wss) в зависимости от того, что находит на диске.
CfgSoundSets
SoundSet оборачивает один или несколько SoundShaders и определяет пространственные и поведенческие свойства:
class CfgSoundSets
{
class MyMod_GunShot_SoundSet
{
soundShaders[] = {"MyMod_GunShot_SoundShader"};
volumeFactor = 1.0; // Масштабирование громкости (поверх громкости шейдера)
frequencyFactor = 1.0; // Масштабирование частоты
volumeCurve = "InverseSquare"; // Имя предустановленной кривой затухания
spatial = 1; // 1 = 3D-позиционное, 0 = 2D (HUD/меню)
doppler = 0; // 1 = включить эффект Доплера
loop = 0; // 1 = непрерывный цикл
};
};Свойства SoundSet
| Свойство | Тип | Описание |
|---|---|---|
soundShaders[] | массив | Список имён классов SoundShader для комбинирования. |
volumeFactor | float | Дополнительный множитель громкости поверх громкости шейдера. |
frequencyFactor | float | Дополнительный множитель частоты/высоты тона. |
frequencyRandomizer | float | Случайная вариация тона (0.0 = нет, 0.1 = +/- 10%). |
volumeCurve | string | Именованная кривая затухания: "InverseSquare", "Linear", "Logarithmic". |
spatial | int | 1 для 3D-позиционного аудио, 0 для 2D (UI, музыка). |
doppler | int | 1 для включения доплеровского сдвига для движущихся источников. |
loop | int | 1 для непрерывного зацикливания, 0 для однократного воспроизведения. |
distanceFilter | int | 1 для применения НЧ-фильтра на расстоянии (приглушённые далёкие звуки). |
occlusionFactor | float | Насколько стены/рельеф приглушают звук (от 0.0 до 1.0). |
obstructionFactor | float | Насколько препятствия между источником и слушателем влияют на звук. |
Категории звуков
DayZ организует звуки в категории, влияющие на их взаимодействие с системой микширования аудио.
Звуки оружия
Звуки оружия -- самое сложное аудио в DayZ, обычно включающее несколько SoundSets для разных аспектов одного выстрела:
Произведён выстрел
|--> SoundSet ближнего выстрела ("хлопок" вблизи)
|--> SoundSet дальнего выстрела (гул/эхо вдали)
|--> SoundSet хвоста (реверберация/эхо после)
|--> SoundSet сверхзвукового хлопка (пуля пролетает над головой)
|--> SoundSet механизма (ход затвора, вставка магазина)Пример конфигурации звука оружия:
class CfgSoundShaders
{
class MyMod_Rifle_Shot_SoundShader
{
samples[] =
{
{"MyMod\sound\weapons\rifle_shot_01", 1},
{"MyMod\sound\weapons\rifle_shot_02", 1},
{"MyMod\sound\weapons\rifle_shot_03", 1}
};
volume = 1.0;
range = 200;
rangeCurve[] = {{0, 1.0}, {50, 0.8}, {100, 0.4}, {200, 0.0}};
};
class MyMod_Rifle_Tail_SoundShader
{
samples[] =
{
{"MyMod\sound\weapons\rifle_tail_01", 1},
{"MyMod\sound\weapons\rifle_tail_02", 1}
};
volume = 0.8;
range = 800;
rangeCurve[] = {{0, 0.6}, {200, 0.4}, {500, 0.2}, {800, 0.0}};
};
};
class CfgSoundSets
{
class MyMod_Rifle_Shot_SoundSet
{
soundShaders[] = {"MyMod_Rifle_Shot_SoundShader"};
volumeFactor = 1.0;
spatial = 1;
doppler = 0;
loop = 0;
};
class MyMod_Rifle_Tail_SoundSet
{
soundShaders[] = {"MyMod_Rifle_Tail_SoundShader"};
volumeFactor = 1.0;
spatial = 1;
doppler = 0;
loop = 0;
distanceFilter = 1;
};
};Эмбиентные звуки
Атмосферное аудио для окружения:
class MyMod_Wind_SoundShader
{
samples[] = {{"MyMod\sound\ambient\wind_loop", 1}};
volume = 0.5;
range = 50;
};
class MyMod_Wind_SoundSet
{
soundShaders[] = {"MyMod_Wind_SoundShader"};
volumeFactor = 0.6;
spatial = 0; // Непозиционный (окружающий)
loop = 1; // Непрерывный цикл
};Звуки UI
Звуки обратной связи интерфейса (клики кнопок, уведомления):
class MyMod_ButtonClick_SoundShader
{
samples[] = {{"MyMod\sound\ui\click_01", 1}};
volume = 0.7;
range = 0; // Пространственная дальность не нужна
};
class MyMod_ButtonClick_SoundSet
{
soundShaders[] = {"MyMod_ButtonClick_SoundShader"};
volumeFactor = 0.8;
spatial = 0; // 2D -- воспроизводится "в голове" слушателя
loop = 0;
};Звуки транспорта
Транспорт использует сложные звуковые конфигурации с несколькими компонентами:
- Холостые обороты двигателя -- зацикленные, тон зависит от RPM
- Разгон двигателя -- зацикленные, громкость и тон зависят от дросселя
- Шум шин -- зацикленный, громкость зависит от скорости
- Сигнал -- по нажатию, зацикленный пока удерживается
- Столкновение -- однократный при ударе
Звуки персонажа
Звуки, связанные с игроком:
- Шаги -- различаются по типу поверхности (бетон, трава, дерево, металл)
- Дыхание -- зависит от выносливости
- Голос -- эмоции и команды
- Инвентарь -- звуки манипуляции предметами
3D-позиционное аудио
DayZ использует 3D-пространственное аудио для позиционирования звуков в игровом мире. Когда оружие стреляет в 200 метрах слева от вас, вы слышите это из левого динамика/наушника с соответствующим снижением громкости.
Требования для 3D-аудио
- Аудиофайл должен быть моно. Стерео-файлы не будут корректно пространственно расположены.
spatialв SoundSet должен быть1. Это включает систему 3D-позиционирования.- Источник звука должен иметь мировую позицию. Движку нужны координаты для расчёта направления и расстояния.
Как движок пространственно располагает звук
Источник звука (мировая позиция)
|
|--> Рассчитать расстояние до слушателя
|--> Рассчитать направление относительно ориентации слушателя
|--> Применить затухание расстояния (rangeCurve)
|--> Применить окклюзию (стены, рельеф)
|--> Применить эффект Доплера (если включён и источник движется)
|--> Вывести в соответствующие каналы динамиковЗапуск 3D-звуков из скрипта
// Воспроизвести позиционный звук в мировой локации
void PlaySoundAtPosition(vector position)
{
EffectSound sound;
SEffectManager.PlaySound("MyMod_Rifle_Shot_SoundSet", position);
}
// Воспроизвести звук, привязанный к объекту (двигается с ним)
void PlaySoundOnObject(Object obj)
{
EffectSound sound;
SEffectManager.PlaySoundOnObject("MyMod_Engine_SoundSet", obj);
}Затухание громкости и расстояния
Кривая дальности
rangeCurve[] в SoundShader определяет, как громкость уменьшается с расстоянием. Это массив пар {расстояние, громкость}:
rangeCurve[] =
{
{0, 1.0}, // На 0м: полная громкость
{50, 0.7}, // На 50м: 70% громкости
{150, 0.3}, // На 150м: 30% громкости
{300, 0.0} // На 300м: тишина
};Движок линейно интерполирует между определёнными точками. Вы можете создать любую кривую затухания, добавив больше контрольных точек.
Предустановленные кривые громкости
SoundSets могут ссылаться на именованные кривые через свойство volumeCurve:
| Имя кривой | Поведение |
|---|---|
"InverseSquare" | Реалистичное затухание (громкость = 1/расстояние^2). Естественное звучание. |
"Linear" | Равномерное затухание от максимума до нуля по дальности. |
"Logarithmic" | Громко вблизи, быстро падает на средней дистанции, затем медленно затухает. |
Практические примеры затухания
Выстрел (громкий, далеко несётся):
range = 800;
rangeCurve[] = {{0, 1.0}, {100, 0.6}, {300, 0.3}, {600, 0.1}, {800, 0.0}};Шаг (тихий, ближняя дистанция):
range = 30;
rangeCurve[] = {{0, 1.0}, {10, 0.5}, {20, 0.15}, {30, 0.0}};Двигатель транспорта (средняя дальность, постоянный):
range = 200;
rangeCurve[] = {{0, 1.0}, {50, 0.7}, {100, 0.4}, {200, 0.0}};Зацикленные звуки
Зацикленные звуки повторяются непрерывно, пока не будут явно остановлены. Они используются для двигателей, атмосферного фона, сирен и любого постоянного аудио.
Настройка зацикленного звука
В SoundSet:
class MyMod_Alarm_SoundSet
{
soundShaders[] = {"MyMod_Alarm_SoundShader"};
spatial = 1;
loop = 1; // Включить зацикливание
};Зацикливание из скрипта
// Запустить зацикленный звук
EffectSound m_AlarmSound;
void StartAlarm(vector position)
{
if (!m_AlarmSound)
{
m_AlarmSound = SEffectManager.PlaySound("MyMod_Alarm_SoundSet", position);
}
}
// Остановить зацикленный звук
void StopAlarm()
{
if (m_AlarmSound)
{
m_AlarmSound.Stop();
m_AlarmSound = null;
}
}Подготовка аудиофайла для зацикливания
Для бесшовного зацикливания сам аудиофайл должен чисто зацикливаться:
- Пересечение нуля в начале и конце. Волновая форма должна пересекать нулевую амплитуду в обеих конечных точках, чтобы избежать щелчка/хлопка в точке цикла.
- Совпадение начала и конца. Конец файла должен бесшовно переходить в начало.
- Без плавного нарастания/затухания. Фейды были бы слышны на каждой итерации цикла.
- Тестируйте цикл в Audacity. Выделите весь клип, включите воспроизведение в цикле и прослушайте на наличие щелчков или прерываний.
Добавление пользовательских звуков в мод
Полный рабочий процесс
Шаг 1: Подготовка аудиофайлов
- Запишите или найдите аудио.
- Отредактируйте в Audacity (или вашем предпочтительном аудиоредакторе).
- Для 3D-звуков: конвертируйте в моно.
- Экспортируйте как OGG Vorbis (качество 5-7).
- Называйте файлы описательно:
rifle_shot_01.ogg,rifle_shot_02.ogg.
Шаг 2: Организация в директории мода
MyMod/
sound/
weapons/
rifle_shot_01.ogg
rifle_shot_02.ogg
rifle_shot_03.ogg
rifle_tail_01.ogg
rifle_tail_02.ogg
ambient/
wind_loop.ogg
ui/
click_01.ogg
notification_01.ogg
config.cppШаг 3: Определение SoundShaders в config.cpp
class CfgPatches
{
class MyMod_Sounds
{
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] = {"DZ_Sounds_Effects"};
};
};
class CfgSoundShaders
{
class MyMod_RifleShot_SoundShader
{
samples[] =
{
{"MyMod\sound\weapons\rifle_shot_01", 1},
{"MyMod\sound\weapons\rifle_shot_02", 1},
{"MyMod\sound\weapons\rifle_shot_03", 1}
};
volume = 1.0;
range = 300;
rangeCurve[] = {{0, 1.0}, {100, 0.6}, {200, 0.2}, {300, 0.0}};
};
};
class CfgSoundSets
{
class MyMod_RifleShot_SoundSet
{
soundShaders[] = {"MyMod_RifleShot_SoundShader"};
volumeFactor = 1.0;
spatial = 1;
doppler = 0;
loop = 0;
distanceFilter = 1;
};
};Шаг 4: Ссылка из конфигурации оружия/предмета
Для оружия SoundSet ссылается в классе конфигурации оружия:
class CfgWeapons
{
class MyMod_Rifle: Rifle_Base
{
// ... другая конфигурация ...
class Sounds
{
class Fire
{
soundSet = "MyMod_RifleShot_SoundSet";
};
};
};
};Шаг 5: Сборка и тестирование
- Упакуйте PBO (используйте
-packonly, так как OGG-файлы не нуждаются в бинаризации). - Запустите игру с загруженным модом.
- Протестируйте звук в игре на различных расстояниях.
Инструменты для работы с аудио
Audacity (бесплатный, с открытым исходным кодом)
Audacity -- рекомендуемый инструмент для работы с аудио DayZ:
- Скачать: audacityteam.org
- Экспорт OGG: File --> Export --> Export as OGG
- Конвертация в моно: Tracks --> Mix --> Mix Stereo Down to Mono
- Нормализация: Effect --> Normalize (установить пик на -1 дБ для предотвращения клиппинга)
- Удаление шума: Effect --> Noise Reduction
- Тестирование цикла: Transport --> Loop Play (Shift+Space)
Настройки экспорта OGG в Audacity
- File --> Export --> Export as OGG Vorbis
- Качество: 5-7 (5 для эмбиента/UI, 7 для оружия/важных звуков)
- Каналы: Моно для 3D-звуков, Стерео для UI/музыки
Другие полезные инструменты
| Инструмент | Назначение | Стоимость |
|---|---|---|
| Audacity | Общее редактирование аудио, конвертация форматов | Бесплатно |
| Reaper | Профессиональная DAW, расширенное редактирование | $60 (персональная лицензия) |
| FFmpeg | Пакетная конвертация аудио из командной строки | Бесплатно |
| Ocenaudio | Простой редактор с предпрослушиванием в реальном времени | Бесплатно |
Пакетная конвертация с FFmpeg
Конвертация всех WAV-файлов в директории в моно OGG:
for file in *.wav; do
ffmpeg -i "$file" -ac 1 -codec:a libvorbis -qscale:a 6 "${file%.wav}.ogg"
doneРаспространённые ошибки
1. Стерео-файл для 3D-звука
Симптом: Звук не пространственно располагается, воспроизводится по центру или только в одном ухе. Исправление: Конвертируйте в моно перед экспортом. 3D-позиционные звуки требуют моно аудиофайлы.
2. Расширение файла в пути samples[]
Симптом: Звук не воспроизводится, нет ошибки в логе (движок молча не находит файл). Исправление: Уберите расширение .ogg из пути в samples[]. Движок добавляет его автоматически.
// НЕПРАВИЛЬНО
samples[] = {{"MyMod\sound\gunshot_01.ogg", 1}};
// ПРАВИЛЬНО
samples[] = {{"MyMod\sound\gunshot_01", 1}};3. Отсутствие requiredAddons в CfgPatches
Симптом: SoundShaders или SoundSets не распознаются, звуки не воспроизводятся. Исправление: Добавьте "DZ_Sounds_Effects" в requiredAddons[] вашего CfgPatches, чтобы базовая звуковая система загрузилась до ваших определений.
4. Слишком малая дальность
Симптом: Звук резко обрывается на коротком расстоянии, ощущается неестественно. Исправление: Установите range на реалистичное значение. Выстрелы должны быть слышны на 300-800м, шаги на 20-40м, голоса на 50-100м.
5. Отсутствие случайной вариации
Симптом: Звук ощущается повторяющимся и искусственным после многократного прослушивания. Исправление: Предоставьте несколько семплов в SoundShader и добавьте frequencyRandomizer в SoundSet для вариации тона.
// Несколько семплов для разнообразия
samples[] =
{
{"MyMod\sound\step_01", 1},
{"MyMod\sound\step_02", 1},
{"MyMod\sound\step_03", 1},
{"MyMod\sound\step_04", 1}
};
// Плюс рандомизация тона в SoundSet
frequencyRandomizer = 0.05; // +/- 5% вариация тона6. Клиппинг / Искажение
Симптом: Звук трещит или искажается, особенно вблизи. Исправление: Нормализуйте аудио до -1 дБ или -3 дБ пика в Audacity перед экспортом. Никогда не устанавливайте volume или volumeFactor выше 1.0, если исходное аудио не очень тихое.
Лучшие практики
Всегда экспортируйте 3D-звуки как моно OGG. Это самое важное правило. Стерео-файлы не будут пространственно располагаться.
Предоставляйте 3-5 вариантов семплов для часто слышимых звуков (выстрелы, шаги, удары). Случайный выбор предотвращает "эффект пулемёта" идентично повторяющегося аудио.
Используйте
frequencyRandomizerмежду 0.03 и 0.08 для естественной вариации тона. Даже незначительная вариация существенно улучшает воспринимаемое качество аудио.Устанавливайте реалистичные значения дальности. Изучите ванильные звуки DayZ для справки. Выстрел винтовки на 600-800м, подавленный выстрел на 150-200м, шаги на 20-40м.
Создавайте многослойные звуки. Сложные аудиособытия (выстрелы) должны использовать несколько SoundSets: ближний выстрел + дальний гул + хвост/эхо. Это создаёт глубину, которую один звуковой файл не может достичь.
Тестируйте на разных расстояниях. Отойдите от источника звука в игре и проверьте, что кривая затухания ощущается естественно. Итеративно корректируйте контрольные точки
rangeCurve[].Организуйте директорию звуков. Используйте поддиректории по категориям (
weapons/,ambient/,ui/,vehicles/). Плоская директория с 200 OGG-файлами неуправляема.Поддерживайте разумные размеры файлов. Игровому аудио не нужно студийное качество. OGG качества 5-7 достаточно. Большинство отдельных звуковых файлов должны быть менее 500 КБ.
Использование в реальных модах
| Паттерн | Мод | Детали |
|---|---|---|
| Пользовательские звуки уведомлений через SoundSets | Expansion (модуль уведомлений) | Определяет несколько CfgSoundSets для разных типов уведомлений (успех, предупреждение, ошибка) с spatial = 0 |
| UI-звуки кликов с кэшированным воспроизведением | VPP Admin Tools | Использует SEffectManager.PlaySoundCachedParams() для кликов кнопок, чтобы избежать повторного парсинга конфигурации |
| Многослойное аудио оружия (выстрел + хвост + хлопок) | Паки оружия сообщества (RFCP, MuchStuffPack) | Каждое оружие определяет 3-5 отдельных SoundSets на событие стрельбы для ближнего выстрела, дальнего гула, сверхзвукового хлопка |
frequencyRandomizer для вариации шагов | Ванильный DayZ | Использует рандомизацию тона 0.05-0.08 на SoundSets шагов для предотвращения роботоподобного повторения |
Совместимость и влияние
- Мульти-мод: Имена классов SoundShader и SoundSet глобальные. Два мода, определяющие одинаковое имя класса, будут конфликтовать (побеждает последний загруженный). Всегда используйте префикс с идентификатором вашего мода (например,
MyMod_Shot_SoundShader). - Производительность: OGG-файлы декомпрессируются во время выполнения. Моды с сотнями уникальных аудиофайлов увеличивают потребление памяти. Держите отдельные файлы под 500 КБ и переиспользуйте семплы для вариантов.
- Версионность: Аудиосистема DayZ (CfgSoundShaders/CfgSoundSets) стабильна с версии 1.0. Предустановки
sound3DProcessingTypeиvolumeCurveбыли добавлены в более поздних обновлениях, но обратно совместимы.
Навигация
| Предыдущая | Вверх | Следующая |
|---|---|---|
| 4.3 Материалы | Часть 4: Форматы файлов и DayZ Tools | 4.5 Рабочий процесс DayZ Tools |
