АВТОМОБИЛЬЗВУК ДВИГАТЕЛЯ
Звук двигателя
Назначение
Заголовок раздела «Назначение»Звук двигателя воспроизводит двигатель автомобиля. Он плавно переходит между набором петель, каждая из которых записана на одних оборотах двигателя, и меняет их высоту тона под обороты двигателя в игре. Под нагрузкой двигатель звучит громче, чем на накате. Звук воспроизводит компонент Crushform Engine Audio. Адаптер автомобиля и адаптер Chaos создают его для машины как CF_EngineAudio.
Как это работает
Заголовок раздела «Как это работает»Петли. UCFEngineSoundProfile содержит петли как слои. Слой — это одна зацикленная звуковая дорожка, обороты двигателя, на которых она записана, и её громкость. Компонент сортирует слои по оборотам. Он переходит между двумя петлями вокруг оборотов двигателя и меняет высоту тона каждой петли под обороты в игре. Высота остаётся между Min Pitch и Max Pitch. По умолчанию аудиоустройство ограничивает высоту тона диапазоном от 0,4 до 2,0, поэтому эти два значения действуют только внутри него.
Нагрузка. Без газа двигатель играет на Coast Volume. При полном газе он играет на полной громкости. Громкость переходит между ними по мере изменения нагрузки.
Состояние работы. Компонент раз в кадр спрашивает у host-объекта двигателя машины его состояние: выключен, прокручивается или работает. Пока двигатель прокручивается, звучит Starter Sound в цикле, а петли двигателя молчат. Когда двигатель работает, петли нарастают за Start Fade Seconds. Когда он останавливается, они затихают за Stop Fade Seconds, и один раз проигрывается Shutdown Sound.
Слышимость. Двигатель звучит, только пока слушатель находится в пределах дальности Attenuation профиля. Вне слышимости звуки останавливаются. Когда слушатель возвращается, двигатель звучит так, как звучит в этот момент, без нарастания или остановки, которые слушатель пропустил.
Салон. Слушатель внутри салона слышит двигатель тише и глуше. SetCabinMuffled адаптера приглушает и двигатель. Отдельный компонент вызывает SetCabinMuffling сам.
Только для показа игроку. На выделенном сервере звук двигателя молчит, потому что там некого слушать. Без Attenuation у профиля звук остаётся выключенным, и лог об этом сообщает.
Настройка
Заголовок раздела «Настройка»Этот пример делает звук двигателя для вашей машины. Плагин поставляет профиль по умолчанию DA_CF_DefaultEngineSound с его петлями и затуханием, так что профиль можно пропустить и использовать его.
- В Content Browser нажмите Add, выберите Miscellaneous, затем Data Asset, и выберите CFEngine Sound Profile. Назовите его
MyEngineSoundв папке вашего проекта. - Откройте профиль. В разделе Layers добавьте по записи на каждую петлю. Задайте Sound — зацикленный звук, RPM — обороты, на которых он записан, и Volume — его усиление. Для каждого слоя задайте свои RPM.
| Engine Sound | ||
|---|---|---|
| Layers | 3 Array elements | |
| Index [ 0 ] | ||
| Sound | SW_CF_Engine_Ranger_0850 | |
| RPM | 850.0 rpm | |
| Volume | 0.7 | |
| Index [ 1 ] | ||
| Index [ 2 ] | ||
| Attenuation | SA_CF_Engine | |
- Задайте Attenuation — ассет sound attenuation. Образец плагина —
SA_CF_Engine. Без него двигатель молчит. - По желанию задайте Starter Sound (он должен быть зацикленным, и играет, пока двигатель прокручивается) и Shutdown Sound (он не должен быть зацикленным, и играет один раз, когда двигатель останавливается).
- Откройте Edit, затем Project Settings, затем Plugins, затем Crushform Engine. Проверьте, что Engine Sound включён и что Default Profile — тот профиль, который нужен машинам без своего.
| Engine Sound | ||
|---|---|---|
| Engine Sound | ||
| Default Profile | DA_CF_DefaultEngineSound | |
- На адаптере машины задайте Engine Sound Profile как
MyEngineSoundили оставьте пустым для значения по умолчанию. Задайте Engine Sound Offset, чтобы переместить звук в позицию двигателя. Включите Engine Sound.
Сохранение профиля запускает его проверки. Они сообщают о профиле без слоёв, о слое без звука или со звуком, который не зациклен, о двух слоях с одинаковыми оборотами, об отсутствии Attenuation, о минимальной высоте тона выше максимальной и о звуке остановки, который зациклен.
Использование
Заголовок раздела «Использование»В Blueprint обычная задача — приглушить двигатель, когда слушатель сидит в салоне. График получает аудиокомпонент двигателя от адаптера через Get Engine Audio на CF_Adapter, затем вызывает Set Cabin Muffling на нём с масштабом громкости 0,5 и частотой среза фильтра нижних частот 1200 Гц. У машины с адаптером Set Cabin Muffled на самом адаптере приглушает звук качения и двигатель вместе — со значениями из настроек или, когда его переопределение включено, со значениями самого адаптера.
Те же вызовы в C++. Найдите компонент на машине, затем вызовите его функцию. Сигнатура — та, что в заголовке. Ваш модуль должен перечислить модули Crushform в Build.cs, как в Установке.
#include "CFEngineAudioComponent.h"
void AMyVehicle::SetListenerInCabin(const bool bInCabin){ if (UCFEngineAudioComponent* Audio = FindComponentByClass<UCFEngineAudioComponent>()) { // The volume scale and the low-pass cutoff in Hz, applied while muffled. Audio->SetCabinMuffling(bInCabin, 0.5f, 1200.f); }}Host-объект двигателя, объект, который отвечает на вопросы о состоянии двигателя, задаётся в C++ вызовом SetCrushformHost до начала игры компонента. Его явный host-объект имеет приоритет над host-объектом из реестра для владельца.
Основные настройки
Заголовок раздела «Основные настройки»Значения профиля находятся в UCFEngineSoundProfile, настройки — в UCFEngineSettings, а настройки адаптера — в UCFVehicleAdapterComponent. Значения по умолчанию — из кода.
| Свойство | Что делает | По умолчанию |
|---|---|---|
UCFEngineSoundProfile::Layers | Петли, в любом порядке. Слой без звука пропускается. | пусто |
FCFEngineSoundLayer::Sound | Зацикленный звук двигателя на одних постоянных оборотах. | нет |
FCFEngineSoundLayer::RPM | Обороты двигателя, на которых записана петля, в об/мин. Петля играет со своей высотой тона на этих оборотах. | 1000 об/мин |
FCFEngineSoundLayer::Volume | Усиление петли при её полной доле в миксе. | 1,0 |
UCFEngineSoundProfile::Attenuation | Спад громкости и пространственное звучание всех звуков. Без него звук двигателя молчит. | пусто |
UCFEngineSoundProfile::CoastVolume | Доля полной громкости при нулевой нагрузке. | 0,6 |
UCFEngineSoundProfile::RPMInterpSpeed | Насколько быстро слышимые обороты следуют за оборотами двигателя, в 1/с. 0 — сразу. | 8 |
UCFEngineSoundProfile::LoadInterpSpeed | Насколько быстро громкость следует за нагрузкой, в 1/с. 0 — сразу. | 5 |
UCFEngineSoundProfile::MinPitch | Самая низкая высота тона, до которой замедляется петля. | 0,5 |
UCFEngineSoundProfile::MaxPitch | Самая высокая высота тона, до которой ускоряется петля. | 2,0 |
UCFEngineSoundProfile::StartFadeSeconds | Сколько секунд петли нарастают от тишины, когда двигатель заработал. 0 — сразу. | 0,4 с |
UCFEngineSoundProfile::StopFadeSeconds | Сколько секунд петли затухают, когда двигатель остановился. 0 — сразу. | 1 с |
UCFEngineSoundProfile::StarterSound | Звучит в цикле, пока двигатель прокручивается. Пусто — тихий запуск. | пусто |
UCFEngineSoundProfile::ShutdownSound | Звучит один раз, когда работающий двигатель выключается. Пусто — ничего. | пусто |
UCFEngineSettings::bEngineSound | Engine Sound: главный переключатель. Выключен — двигатель не звучит ни у одной машины. | вкл. |
UCFEngineSettings::DefaultProfile | Профиль для двигателя, который не назвал свой. | DA_CF_DefaultEngineSound |
UCFEngineSettings::SoundClass | Класс звуков двигателя. Пусто — Master. | пусто |
UCFEngineSettings::Priority | Приоритет воспроизведения звуков двигателя. Он выше, чем у звука качения, поэтому тихая шина уступает двигателю. | 0,5 |
UCFEngineSettings::CabinVolumeScale | Громкость двигателя внутри салона. | 0,8 |
UCFEngineSettings::CabinLowPassFrequency | Частота среза фильтра нижних частот для двигателя внутри салона, в Гц. | 3000 Гц |
UCFVehicleAdapterComponent::bEngineSound | Engine Sound на адаптере. Также нужен главный переключатель в Crushform Engine. | вкл. |
UCFVehicleAdapterComponent::EngineSoundProfile | Профиль этой машины. Пусто берёт UCFEngineSettings::DefaultProfile. | пусто |
UCFVehicleAdapterComponent::EngineSoundOffset | Где звучит двигатель относительно корня владельца, в сантиметрах. | ноль |
Проверка работы
Заголовок раздела «Проверка работы»- Нажмите Play и поддайте газу. Затем откройте консоль и выполните
stat CrushformEngine. Появится время Engine Audio Tick, пока звук обновляется. - Отъезжайте от машины. Двигатель затихает, когда вы выходите за пределы дальности затухания, и возвращается, когда вы возвращаетесь.
Звук сам по себе на скриншоте не виден. Оцените его на слух.
Решение проблем
Заголовок раздела «Решение проблем»Двигатель молчит, и в логе написано, что у профиля нет Attenuation
Заголовок раздела «Двигатель молчит, и в логе написано, что у профиля нет Attenuation»Причина. Attenuation профиля пуст. Без него звук двигателя остаётся выключенным, с предупреждением.
Решение. Задайте Attenuation в профиле. Образец плагина — SA_CF_Engine.
Звука двигателя нет, и на машине нет компонента аудио двигателя
Заголовок раздела «Звука двигателя нет, и на машине нет компонента аудио двигателя»Причина. Либо Engine Sound выключен в Crushform Engine, либо Engine Sound выключен на адаптере. В обоих случаях адаптер не создаёт компонент аудио двигателя.
Решение. Включите оба переключателя и запустите игру снова.
Двигатель слышно, только когда вы близко к машине
Заголовок раздела «Двигатель слышно, только когда вы близко к машине»Причина. Двигатель звучит, только пока слушатель находится в пределах дальности Attenuation профиля — то есть его наибольшего расстояния.
Решение. Увеличьте дальность затухания или проверьте, что слушатель находится там, где вы ожидаете.
На сервере звука двигателя нет
Заголовок раздела «На сервере звука двигателя нет»Причина. Звук двигателя нужен только для показа игроку. На выделенном сервере он молчит, потому что там нет слушателя.
Решение. Это ожидаемо. Слушайте двигатель на клиенте.
Установка host-объекта ничего не меняет
Заголовок раздела «Установка host-объекта ничего не меняет»Причина. SetCrushformHost отклоняется, как только компонент начал игру, и лог сообщает об этом.
Решение. Вызывайте SetCrushformHost до начала игры компонента.