Перейти к содержимому
CRUSHFORMV1.1.0
ПОЛУЧИТЬ НА FAB

ПОВЕРХНОСТИЗАГРЯЗНЕНИЕ

Загрязнение

Проведите автомобиль по грязи, и нижняя часть кузова и арки колёс покроются ею. Поезжайте по асфальту, и они останутся чистыми. Работу делают колёса: каждое колесо передаёт кузову то, что удерживает грунт под ним, и кузов хранит это загрязнение, пока оно не выветрится или вы не смоете его. На этой странице описаны четыре вида загрязнения, то, как они ложатся на кузов, и настройки, которые на это влияют.

Седан плагина спереди слева и чуть снизу, с коричневым загрязнением на бампере, арке колеса, дверях, задней четверти и колёсах.
Загрязнение на кузове и колёсах седана плагина.

Каждое колесо на поверхности выбрасывает на свой кузов загрязнение. Плагин хранит для каждого кузова четыре вида: пыль, грязь, снег и влагу. Каждый вид ложится в свою форму: пыль разлетается вверх по кузову, грязь брызгает в арки и за колёса, а снег лежит низко в тех же местах. Краска кузова и колёса отображают загрязнение, поэтому внешний вид меняется по мере того, как кузов покрывается им.

Седан разбрызгивает грязь, выезжая на полосу MUD.
  • Каналы. Атлас загрязнения хранит одно значение каждого вида для каждого текселя: пыль в красном, грязь в зелёном, снег в синем и влага в альфе. 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), в котором записано, когда каждый тексель в последний раз получал загрязнение. Поставляемые каналы такие:
КаналBlendZOrderFade Delay (s)Fade Duration (s)
ПыльLayer010120
ГрязьLayer110120
СнегLayer21090
ВлагаOverlay3225
  • Зафиксированный порядок. 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.
  • Выделенный сервер. Выделенный сервер ничего не рисует, поэтому не хранит загрязнение на кузове и не запускает ни одного события о загрязнении.
  1. В Content Browser выберите Add > Miscellaneous > Data Asset, укажите класс CFProfile и назовите ассет DA_MyVehicle_Profile. Это профиль деформации кузова, и в нём живут формы загрязнения.
  2. Откройте профиль. В разделе Dirt задайте Dirt Scale равным 1. Четыре формы начнут со значений по умолчанию: пыль брызжет, грязь и снег бросаются в арки и хвосты, а влага брызжет с лёгкой аркой.
  3. На компоненте адаптера автомобиля поставьте галочку Dirt and Dents и задайте Deform Profile равным вашему профилю. Если Deform Profile пуст, используется профиль проекта по умолчанию.
  4. Проверьте таблицу поверхностей. В Project Settings > Plugins > Crushform поле Surfaces по умолчанию указывает на DA_CF_Surfaces. Каждая строка там говорит, сколько загрязнения даёт её грунт (см. Колёса и поверхности).
  5. Проедьте по полосе DIRT и проверьте результат, как описано ниже, в разделе «Проверка работы».

Чтобы очистить на кузове место, куда попал игрок, вызовите Wash At на компоненте деформации, передав точку попадания и радиус в сантиметрах. График ниже выполняется, когда срабатывает пользовательское событие WashNearMe, и смывает круг радиусом 150 см вокруг эктора.

График выполняется, когда срабатывает пользовательское событие 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::DirtAtlasRender 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 в консоли редактора и сохраните обе функции. Команда работает только в редакторе.

Причина. Порядок читает свежий атлас загрязнения. Без пригодного 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 того же размера, что атлас решётки, иначе в логе будет назван ассет, который не подошёл, и откат останется.