ПОВЕРХНОСТИЗАГРЯЗНЕНИЕ
Загрязнение
Проведите автомобиль по грязи, и нижняя часть кузова и арки колёс покроются ею. Поезжайте по асфальту, и они останутся чистыми. Работу делают колёса: каждое колесо передаёт кузову то, что удерживает грунт под ним, и кузов хранит это загрязнение, пока оно не выветрится или вы не смоете его. На этой странице описаны четыре вида загрязнения, то, как они ложатся на кузов, и настройки, которые на это влияют.
Что это делает
Заголовок раздела «Что это делает»Каждое колесо на поверхности выбрасывает на свой кузов загрязнение. Плагин хранит для каждого кузова четыре вида: пыль, грязь, снег и влагу. Каждый вид ложится в свою форму: пыль разлетается вверх по кузову, грязь брызгает в арки и за колёса, а снег лежит низко в тех же местах. Краска кузова и колёса отображают загрязнение, поэтому внешний вид меняется по мере того, как кузов покрывается им.
Как это работает
Заголовок раздела «Как это работает»- Каналы. Атлас загрязнения хранит одно значение каждого вида для каждого текселя: пыль в красном, грязь в зелёном, снег в синем и влага в альфе.
ECFDirtChannelназывает четыре канала. - Коэффициенты. Строка поверхности задаёт каждому колесу на ней четыре коэффициента прироста (
Dust,Mud,Snow,Wet), в секунду при эталонной скорости. Колесо даёт загрязнение пропорционально своей скорости по поверхности относительно Dirt Reference Speed, но не больше чем в Max Dirt Speed Scale раз по сравнению с коэффициентами. Неподвижное колесо на поверхности ничего не даёт, и колесо в воздухе тоже ничего не даёт. - Формы. Канал попадает на кузов через форму из трёх частей: spray, брызги, которые поднимаются от земли, arch, арка вокруг каждой оси, и tail, след за каждым колесом. Часть с весом 0 выключена. Профиль хранит одну форму для каждого вида (
DustShape,MudShape,SnowShapeиWetShape). Dirt Scale умножает каждое осаждение, а 0 оставляет кузов чистым и не создаёт сетку загрязнения вовсе. - Сброс. Коэффициенты
Shedповерхности снимают загрязнение со всего кузова, усреднённо по его колёсам. - Наложение. Канал — либо Layer, который встаёт в стопку, либо Overlay, который рисуется поверх всех слоёв. Стопка следует ZOrder каждого канала: первым рисуется самый низкий. При Most Recent on Top сверху лежит слой, в который последним попало загрязнение. Этот порядок опирается на свежий атлас (Dirt Fresh Atlas), в котором записано, когда каждый тексель в последний раз получал загрязнение. Поставляемые каналы такие:
| Канал | Blend | ZOrder | Fade Delay (s) | Fade Duration (s) |
|---|---|---|---|---|
| Пыль | Layer | 0 | 10 | 120 |
| Грязь | Layer | 1 | 10 | 120 |
| Снег | Layer | 2 | 10 | 90 |
| Влага | Overlay | 3 | 2 | 25 |
- Зафиксированный порядок.
MF_CF_PaintиMF_CF_DirtAmountнесут порядок слоёв как константы: Dirt Layer Order, а также Blend и ZOrder каждого канала. Если изменить один из них в редакторе, обе функции пересобираются сразу. Пересборка оставляет их несохранёнными, поэтому сохраните обе функции, чтобы порядок остался. Fade Delay, Fade Duration и имя канала читаются во время игры и ничего не требуют. - Очистка. Канал ждёт Fade Delay секунд после последнего свежего загрязнения, затем очищается за Fade Duration секунд. Длительность 0 оставляет загрязнение на месте.
- Внешний вид.
MF_CF_Paintрисует загрязнение на кузове, аMF_CF_WheelDirtна колёсах. Обе читаютMPC_CF_Dirt, коллекцию, в которой хранится внешний вид, общий для всех автомобилей. Проект может нарисовать собственный вид: это настраивается в Project Settings в разделе Look. - Выделенный сервер. Выделенный сервер ничего не рисует, поэтому не хранит загрязнение на кузове и не запускает ни одного события о загрязнении.
Настройка
Заголовок раздела «Настройка»- В Content Browser выберите Add > Miscellaneous > Data Asset, укажите класс CFProfile и назовите ассет DA_MyVehicle_Profile. Это профиль деформации кузова, и в нём живут формы загрязнения.
- Откройте профиль. В разделе Dirt задайте Dirt Scale равным 1. Четыре формы начнут со значений по умолчанию: пыль брызжет, грязь и снег бросаются в арки и хвосты, а влага брызжет с лёгкой аркой.
- На компоненте адаптера автомобиля поставьте галочку Dirt and Dents и задайте Deform Profile равным вашему профилю. Если Deform Profile пуст, используется профиль проекта по умолчанию.
- Проверьте таблицу поверхностей. В Project Settings > Plugins > Crushform поле Surfaces по умолчанию указывает на
DA_CF_Surfaces. Каждая строка там говорит, сколько загрязнения даёт её грунт (см. Колёса и поверхности). - Проедьте по полосе DIRT и проверьте результат, как описано ниже, в разделе «Проверка работы».
Использование
Заголовок раздела «Использование»Чтобы очистить на кузове место, куда попал игрок, вызовите Wash At на компоненте деформации, передав точку попадания и радиус в сантиметрах. График ниже выполняется, когда срабатывает пользовательское событие WashNearMe, и смывает круг радиусом 150 см вокруг эктора.
Из C++ получите компонент деформации от адаптера и вызовите WashAt. GetDirtAt читает загрязнение в точке по каждому каналу. Для этих вызовов нужны модуль Crushform (CFDeformComponent.h) и модуль CrushformVehicle (CFVehicleAdapterComponent.h); добавьте оба в PublicDependencyModuleNames в Build.cs вашего модуля.
UCFDeformComponent* Deform = Adapter->GetDeform();Deform->WashAt(HitLocation, 150.f);const FCFDirtValues Here = Deform->GetDirtAt(HitLocation);WashAt работает только на этом инстансе, поэтому вызывайте его на каждом инстансе, который должен видеть результат. Wash смывает весь кузов и выполняется только на авторитете: он запускается на сервере и доходит до каждого инстанса.
Основные настройки
Заголовок раздела «Основные настройки»| Свойство | Что делает | По умолчанию |
|---|---|---|
UCFProfile::DirtScale | Умножает каждое осаждение загрязнения на кузове. 0 оставляет кузов чистым и не создаёт сетку загрязнения. | 1 |
UCFProfile::DustShape | Брызги, арка и след канала пыли. У других видов свои: MudShape, SnowShape, WetShape. | Пыль брызжет; грязь имеет арку и след; снег имеет все три части; влага брызжет с лёгкой аркой |
UCFSettings::DirtReferenceSpeed | Скорость шины, при которой коэффициенты поверхности действуют как записаны, м/с. | 8 |
UCFSettings::MaxDirtSpeedScale | Наибольший множитель коэффициентов для более быстрой шины. | 2 |
UCFSettings::DirtUpdateInterval | Секунды между двумя обновлениями загрязнения одного кузова. | 0.2 |
UCFSettings::DirtLayerOrder | Слои укладываются по ZOrder каждого канала, или самое свежее загрязнение лежит сверху. Зафиксировано в функциях загрязнения. | Fixed |
FCFDirtChannelSettings::FadeDelay | Секунды без свежего загрязнения, прежде чем канал начнёт очищаться. | 10 (влага: 2) |
FCFDirtChannelSettings::FadeDuration | Секунды, за которые полное загрязнение очищается. 0 оставляет его. | 120 (снег: 90, влага: 25) |
UCFSettings::DirtEventInterval | Минимальная пауза в секундах между двумя событиями об изменении загрязнения одного кузова. | 0.5 |
UCFSettings::DirtEventThreshold | На сколько должно измениться среднее загрязнение стороны, от 0 до 1, прежде чем сработает следующее событие. | 0.02 |
UCFSettings::DirtAtlas | Render Target, который хранит загрязнение, по одному каналу на вид. | /Crushform/Atlas/RT_CF_DirtAtlas |
UCFSettings::DirtLook | Коллекция внешнего вида, общего для всех автомобилей: DirtStrength, WetDarken, WetGloss и цвета. | /Crushform/Materials/MPC_CF_Dirt |
UCFSettings::Surfaces | Таблица поверхностей. Без неё ни один кузов не покроется загрязнением. | /Crushform/Surfaces/DA_CF_Surfaces |
DirtStrength не меньше 0, и 0 означает, что загрязнения нигде нет. WetDarken — множитель, на который умножается всё, что лежит под слоем влаги; от 0 до 1, где 1 означает отсутствие затемнения. WetGloss — доля шероховатости краски, которую теряет мокрая краска; от 0 до 1.
Проверка работы
Заголовок раздела «Проверка работы»Проведите седан с полосы ASPHALT на полосу DIRT на Proving Ground и остановитесь на ней. Нижние бока и арки колёс принимают загрязнение, когда колёса по ней катятся. Вернитесь на асфальт и остановитесь. Пыль и грязь начинают очищаться через 10 секунд после последнего свежего загрязнения и очищаются ещё до 120 секунд, если перед этим вы не вымыли кузов.
Устранение неполадок
Заголовок раздела «Устранение неполадок»На кузове нет загрязнения вообще
Заголовок раздела «На кузове нет загрязнения вообще»Причина. Три вещи держат кузов чистым. Без ассета поверхностей в Surfaces ни один кузов не покроется загрязнением. Профиль с Dirt Scale равным 0 не имеет сетки загрязнения. Выделенный сервер загрязнение не рисует.
Решение. Укажите в Surfaces ассет поверхностей со строками для ваших грунтов. Задайте Dirt Scale больше 0 в профиле. Проверяйте на слушающем сервере или на клиенте, а не на выделенном сервере.
Грунт не оставляет загрязнения
Заголовок раздела «Грунт не оставляет загрязнения»Причина. Осаждение колеса растёт вместе с его скоростью по поверхности, поэтому заблокированное колесо, которое стоит на месте, ничего не осаждает. Строка, у которой все коэффициенты загрязнения равны 0, тоже ничего не даёт. Колесо на физическом материале без строки получает строку Default, а колесо в воздухе не получает ничего.
Решение. Заставьте колесо катиться. Задайте коэффициенты загрязнения в строке физического материала этого грунта или в Default для грунтов, у которых нет своей строки.
Загрязнение остаётся на кузове
Заголовок раздела «Загрязнение остаётся на кузове»Причина. Канал, у которого Fade Duration равна 0, держит загрязнение, пока его не смоют.
Решение. Задайте Fade Duration больше 0 для этого канала в Dirt > Channels в настройках проекта или смойте загрязнение с кузова.
Слои не следуют моему новому порядку
Заголовок раздела «Слои не следуют моему новому порядку»Причина. Порядок зафиксирован в MF_CF_Paint и MF_CF_DirtAmount, поэтому изменение Dirt Layer Order, Blend или ZOrder проявится только после пересборки обеих функций. Ничего не пересобирается, пока любая из функций открыта в Material Editor, и уведомление сообщает об этом.
Решение. Закройте MF_CF_Paint и MF_CF_DirtAmount, выполните Crushform.RebakeDirtOrder в консоли редактора и сохраните обе функции. Команда работает только в редакторе.
Most Recent on Top откатывается к Z Order
Заголовок раздела «Most Recent on Top откатывается к Z Order»Причина. Порядок читает свежий атлас загрязнения. Без пригодного Dirt Fresh Atlas он откатывается к Z Order и один раз на мир пишет в лог:
No usable Crushform dirt fresh atlas (Project Settings > Plugins > Crushform > Dirt Fresh Atlas): %s keeps the freshness of its dirt but cannot show it, so on the body Most Recent On Top falls back to Z Order (the wheels keep ranking by freshness)Решение. Укажите в Dirt Fresh Atlas /Crushform/Atlas/RT_CF_DirtFreshAtlas. Замена должна быть RGBA8 Render Target того же размера, что атлас решётки, иначе в логе будет назван ассет, который не подошёл, и откат останется.
