Skip to content

Глава 4.4: Аудио (.ogg, .wss)

Главная | << Назад: Материалы | Аудио | Далее: Рабочий процесс DayZ Tools >>


Введение

Звуковой дизайн -- один из самых погружающих аспектов моддинга DayZ. От хлопка винтовки до рассеянного ветра в лесу, аудио оживляет игровой мир. DayZ использует OGG Vorbis как основной аудиоформат и настраивает воспроизведение звука через многоуровневую систему CfgSoundShaders и CfgSoundSets, определяемых в config.cpp. Понимание этого конвейера -- от необработанного аудиофайла до пространственно расположенного внутриигрового звука -- необходимо для любого мода, добавляющего пользовательское оружие, транспорт, эмбиентные эффекты или обратную связь UI.

Эта глава охватывает аудиоформаты, конфигурируемую через конфиги систему звука, 3D-позиционное аудио, затухание громкости и расстояния, зацикливание и полный рабочий процесс добавления пользовательских звуков в мод DayZ.


Содержание


Аудиоформаты

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 определяет сырое аудиосодержимое и базовые параметры воспроизведения:

cpp
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[]массивСписок пар {путь, вес}. Путь не включает расширение файла.
volumefloatБазовый множитель громкости (от 0.0 до 1.0).
rangefloatМаксимальная дальность слышимости в метрах.
rangeCurve[]массивМассив точек {расстояние, громкость}, определяющих затухание по расстоянию.
frequencyfloatМножитель скорости воспроизведения. 1.0 = нормальная, 0.5 = половинная скорость (ниже тон), 2.0 = двойная скорость (выше тон).

Важно: Путь samples[] НЕ включает расширение файла. Движок автоматически добавляет .ogg (или .wss) в зависимости от того, что находит на диске.

CfgSoundSets

SoundSet оборачивает один или несколько SoundShaders и определяет пространственные и поведенческие свойства:

cpp
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 для комбинирования.
volumeFactorfloatДополнительный множитель громкости поверх громкости шейдера.
frequencyFactorfloatДополнительный множитель частоты/высоты тона.
frequencyRandomizerfloatСлучайная вариация тона (0.0 = нет, 0.1 = +/- 10%).
volumeCurvestringИменованная кривая затухания: "InverseSquare", "Linear", "Logarithmic".
spatialint1 для 3D-позиционного аудио, 0 для 2D (UI, музыка).
dopplerint1 для включения доплеровского сдвига для движущихся источников.
loopint1 для непрерывного зацикливания, 0 для однократного воспроизведения.
distanceFilterint1 для применения НЧ-фильтра на расстоянии (приглушённые далёкие звуки).
occlusionFactorfloatНасколько стены/рельеф приглушают звук (от 0.0 до 1.0).
obstructionFactorfloatНасколько препятствия между источником и слушателем влияют на звук.

Категории звуков

DayZ организует звуки в категории, влияющие на их взаимодействие с системой микширования аудио.

Звуки оружия

Звуки оружия -- самое сложное аудио в DayZ, обычно включающее несколько SoundSets для разных аспектов одного выстрела:

Произведён выстрел
  |--> SoundSet ближнего выстрела       ("хлопок" вблизи)
  |--> SoundSet дальнего выстрела       (гул/эхо вдали)
  |--> SoundSet хвоста                  (реверберация/эхо после)
  |--> SoundSet сверхзвукового хлопка   (пуля пролетает над головой)
  |--> SoundSet механизма               (ход затвора, вставка магазина)

Пример конфигурации звука оружия:

cpp
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;
    };
};

Эмбиентные звуки

Атмосферное аудио для окружения:

cpp
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

Звуки обратной связи интерфейса (клики кнопок, уведомления):

cpp
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-аудио

  1. Аудиофайл должен быть моно. Стерео-файлы не будут корректно пространственно расположены.
  2. spatial в SoundSet должен быть 1. Это включает систему 3D-позиционирования.
  3. Источник звука должен иметь мировую позицию. Движку нужны координаты для расчёта направления и расстояния.

Как движок пространственно располагает звук

Источник звука (мировая позиция)
  |
  |--> Рассчитать расстояние до слушателя
  |--> Рассчитать направление относительно ориентации слушателя
  |--> Применить затухание расстояния (rangeCurve)
  |--> Применить окклюзию (стены, рельеф)
  |--> Применить эффект Доплера (если включён и источник движется)
  |--> Вывести в соответствующие каналы динамиков

Запуск 3D-звуков из скрипта

c
// Воспроизвести позиционный звук в мировой локации
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 определяет, как громкость уменьшается с расстоянием. Это массив пар {расстояние, громкость}:

cpp
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"Громко вблизи, быстро падает на средней дистанции, затем медленно затухает.

Практические примеры затухания

Выстрел (громкий, далеко несётся):

cpp
range = 800;
rangeCurve[] = {{0, 1.0}, {100, 0.6}, {300, 0.3}, {600, 0.1}, {800, 0.0}};

Шаг (тихий, ближняя дистанция):

cpp
range = 30;
rangeCurve[] = {{0, 1.0}, {10, 0.5}, {20, 0.15}, {30, 0.0}};

Двигатель транспорта (средняя дальность, постоянный):

cpp
range = 200;
rangeCurve[] = {{0, 1.0}, {50, 0.7}, {100, 0.4}, {200, 0.0}};

Зацикленные звуки

Зацикленные звуки повторяются непрерывно, пока не будут явно остановлены. Они используются для двигателей, атмосферного фона, сирен и любого постоянного аудио.

Настройка зацикленного звука

В SoundSet:

cpp
class MyMod_Alarm_SoundSet
{
    soundShaders[] = {"MyMod_Alarm_SoundShader"};
    spatial = 1;
    loop = 1;              // Включить зацикливание
};

Зацикливание из скрипта

c
// Запустить зацикленный звук
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;
    }
}

Подготовка аудиофайла для зацикливания

Для бесшовного зацикливания сам аудиофайл должен чисто зацикливаться:

  1. Пересечение нуля в начале и конце. Волновая форма должна пересекать нулевую амплитуду в обеих конечных точках, чтобы избежать щелчка/хлопка в точке цикла.
  2. Совпадение начала и конца. Конец файла должен бесшовно переходить в начало.
  3. Без плавного нарастания/затухания. Фейды были бы слышны на каждой итерации цикла.
  4. Тестируйте цикл в 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

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 ссылается в классе конфигурации оружия:

cpp
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

  1. File --> Export --> Export as OGG Vorbis
  2. Качество: 5-7 (5 для эмбиента/UI, 7 для оружия/важных звуков)
  3. Каналы: Моно для 3D-звуков, Стерео для UI/музыки

Другие полезные инструменты

ИнструментНазначениеСтоимость
AudacityОбщее редактирование аудио, конвертация форматовБесплатно
ReaperПрофессиональная DAW, расширенное редактирование$60 (персональная лицензия)
FFmpegПакетная конвертация аудио из командной строкиБесплатно
OcenaudioПростой редактор с предпрослушиванием в реальном времениБесплатно

Пакетная конвертация с FFmpeg

Конвертация всех WAV-файлов в директории в моно OGG:

bash
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[]. Движок добавляет его автоматически.

cpp
// НЕПРАВИЛЬНО
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 для вариации тона.

cpp
// Несколько семплов для разнообразия
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, если исходное аудио не очень тихое.


Лучшие практики

  1. Всегда экспортируйте 3D-звуки как моно OGG. Это самое важное правило. Стерео-файлы не будут пространственно располагаться.

  2. Предоставляйте 3-5 вариантов семплов для часто слышимых звуков (выстрелы, шаги, удары). Случайный выбор предотвращает "эффект пулемёта" идентично повторяющегося аудио.

  3. Используйте frequencyRandomizer между 0.03 и 0.08 для естественной вариации тона. Даже незначительная вариация существенно улучшает воспринимаемое качество аудио.

  4. Устанавливайте реалистичные значения дальности. Изучите ванильные звуки DayZ для справки. Выстрел винтовки на 600-800м, подавленный выстрел на 150-200м, шаги на 20-40м.

  5. Создавайте многослойные звуки. Сложные аудиособытия (выстрелы) должны использовать несколько SoundSets: ближний выстрел + дальний гул + хвост/эхо. Это создаёт глубину, которую один звуковой файл не может достичь.

  6. Тестируйте на разных расстояниях. Отойдите от источника звука в игре и проверьте, что кривая затухания ощущается естественно. Итеративно корректируйте контрольные точки rangeCurve[].

  7. Организуйте директорию звуков. Используйте поддиректории по категориям (weapons/, ambient/, ui/, vehicles/). Плоская директория с 200 OGG-файлами неуправляема.

  8. Поддерживайте разумные размеры файлов. Игровому аудио не нужно студийное качество. OGG качества 5-7 достаточно. Большинство отдельных звуковых файлов должны быть менее 500 КБ.


Использование в реальных модах

ПаттернМодДетали
Пользовательские звуки уведомлений через SoundSetsExpansion (модуль уведомлений)Определяет несколько 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 Tools4.5 Рабочий процесс DayZ Tools

Released under CC BY-SA 4.0 | Code examples under MIT License