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

ПОВЕРХНОСТИКОЛЁСА И ПОВЕРХНОСТИ

Колёса и поверхности

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

Crushform
Surfaces7 Map elements
Index [ 0 ]
KeyPM_CF_Asphalt
Value
Dirt
Rolling SoundSW_CF_Tire_Asphalt_Loop
Rolling FXNS_CF_Rolling_Asphalt
Rolling FX Intensity Parameter
Index [ 1 ]
Index [ 2 ]
Index [ 3 ]
Index [ 4 ]
Index [ 5 ]
Index [ 6 ]
Default
Таблица Surfaces ассета DA_CF_Surfaces: одна строка на физический материал, у первой строки раскрыты звук и эффект качения.

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

Пять полос грунта на Proving Ground стоят рядом на оранжевом полу, подписаны слева направо: WATER, MUD, SNOW, DIRT и ASPHALT.
Пять полос грунта на Proving Ground, слева направо: WATER, MUD, SNOW, DIRT и ASPHALT.
  • Таблица. UCFSurfaces — ассет данных. Его карта Surfaces хранит одну строку FCFSurface на физический материал, а строка Default обслуживает грунт без строки и колесо в воздухе, у которого нет материала. Пустое поле в строке остаётся пустым: оно не берёт звук или эффект из строки Default.
  • Строка. FCFSurface содержит четыре поля. Dirt задаёт коэффициенты пыли, грязи, снега и влаги, которые грунт передаёт кузову, и коэффициенты, с которыми каждый вид снимается с него. Rolling Sound — звук, который издаёт шина на этом грунте. Rolling FX — система Niagara. Rolling FX Intensity Parameter называет float-параметр, который принимает интенсивность. Если он пуст, используется FXIntensityParameter проекта.
  • Колёса автомобиля. Колёса приходят от автомобиля. Общий адаптер автомобиля (UCFVehicleAdapterComponent) трассирует колёса из своего списка Wheels. Каждая запись требует компонент Wheel у владельца: меш колеса или scene-компонент, вокруг которого вращается колесо, так указывается колесо, закреплённое на кости. Radius — радиус шины в см; 0 берёт половину высоты границ меша при первом использовании списка. Ground Channel — канал, по которому трассируются колёса, а Ground Probe Margin позволяет шине, которая на несколько сантиметров выше земли, всё же касаться её. Адаптер системы автомобиля, например адаптер Chaos, читает собственные колёса и этот список игнорирует.
  • Контакты колёс. Каждый кадр host-объект владельца сообщает по одному FCFWheelContact на колесо: где шина касается земли, её радиус, скорость по поверхности, физический материал, стоит ли она на земле и WheelIndex, который не меняется за всю жизнь колеса. Точка и материал колеса в воздухе не читаются. Адаптер автомобиля заполняет эти контакты через Build Wheel Contacts. Любой другой эктор отвечает на ICFWheelHost сам. Без host-объекта кузов не имеет колёс и никогда не загрязняется.
  • Чтение колеса. Компонент деформации хранит, на чём стоит каждое колесо. GetWheelSurface возвращает текущее состояние колеса, а OnWheelSurfaceChanged срабатывает, когда меняется физический материал колеса или признак, что оно на земле. Одно только изменение скорости ничего не запускает.
  • Выделенный сервер. Проверка поверхности колеса на выделенном сервере не выполняется.
  1. В Content Browser выберите Add > Miscellaneous > Data Asset, укажите класс CFSurfaces и назовите ассет DA_MyGame_Surfaces.
  2. Откройте его. В Default задайте строку для любого грунта без собственной строки.
  3. Добавьте в Surfaces запись для каждого грунта. В качестве ключа выберите физический материал грунта, затем заполните его коэффициенты Dirt, Rolling Sound и Rolling FX. Оставьте поле пустым, если ничего не нужно.
  4. В Project Settings > Plugins > Crushform задайте Surfaces равным DA_MyGame_Surfaces.
  5. На адаптере автомобиля заполните Wheels, по одной записи на колесо: выберите его компонент Wheel и задайте Radius или оставьте радиус 0, чтобы взять его из меша.
  6. Задайте физический материал каждого грунта в его материале, в поле Physical Material, как Phys Material. Настройка поверхностей подробнее описана на странице Основные понятия.

Blueprint может считать поверхность колеса из компонента деформации. График ниже выполняется, когда срабатывает пользовательское событие ReadWheelZero, считывает колесо 0 и выводит, стоит ли колесо на земле.

График выполняется, когда срабатывает пользовательское событие ReadWheelZero, и выводит, стоит ли колесо 0 на земле.

Из C++ считайте поверхность колеса и проверьте, что оно стоит на земле, прежде чем использовать материал. Для вызова нужен модуль Crushform (CFDeformComponent.h), который добавьте в PublicDependencyModuleNames в Build.cs вашего модуля.

const FCFWheelSurface Surface = Deform->GetWheelSurface(0);
if (Surface.bGrounded && IsValid(Surface.PhysicalMaterial))
{
// The wheel stands on Surface.PhysicalMaterial.
}

Пользовательский автомобиль, который не использует адаптер, реализует host-объект колёс и сообщает свои колёса. Метод интерфейса находится в CFWheelHost.h модуля Crushform, и у него такая сигнатура:

void GatherCrushformWheelContacts_Implementation(TArray<FCFWheelContact>& OutContacts) const override;

Каждому колесу задавайте один и тот же WheelIndex в каждом кадре и сообщайте обо всех колёсах, стоящих на земле или нет, чтобы колесо, отрывающееся от земли, было замечено.

СвойствоЧто делаетПо умолчанию
FCFSurface::DirtКоэффициенты загрязнения поверхности в секунду при эталонной скорости: Dust, Mud, Snow, Wet, и что каждый снимает с кузова.0 для каждого коэффициента
FCFSurface::RollingSoundЗвук качения на поверхности. None означает, что звука качения там нет.None
FCFSurface::RollingFXЭффект качения Niagara на поверхности. None означает, что эффекта там нет.None
FCFSurface::RollingFXIntensityParameterFloat-параметр эффекта, который принимает интенсивность.None, тогда используется UCFWheelSettings::FXIntensityParameter
UCFSurfaces::SurfacesОдна строка на физический материал.В классе пусто; поставляемый ассет содержит строки для семи
UCFSurfaces::DefaultСтрока для грунта без строки и для колеса в воздухе.Строка с пустыми полями
UCFSettings::SurfacesАссет поверхностей, который использует проект./Crushform/Surfaces/DA_CF_Surfaces
FCFAdapterWheel::RadiusРадиус шины колеса в списке адаптера, в см. 0 берёт половину высоты границ меша.0
UCFVehicleAdapterComponent::GroundChannelКанал, по которому колёса адаптера трассируют грунт.ECC_Visibility
FCFWheelContact::bGroundedКасается ли колесо земли. Колесо в воздухе не оставляет загрязнения.true
FCFWheelContact::WheelIndexИндекс колеса, стабильный за всю его жизнь. INDEX_NONE означает, что host-объект не называет свои колёса.INDEX_NONE

Откройте DA_MyGame_Surfaces и проверьте, что в нём перечислены ваши грунты и строка Default. Затем запустите Lvl_ProvingGround и проведите седан с полосы ASPHALT на полосу DIRT. Звук качения перетекает на новую поверхность, когда она удерживается под колесом в течение Surface Hold Time из настроек, по умолчанию 0,15 секунды.

Колёса молчат, а в логе сказано, что поверхности не загружаются

Заголовок раздела «Колёса молчат, а в логе сказано, что поверхности не загружаются»

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

Crushform surfaces %s do not load; wheels stay silent

Решение. Задайте Surfaces в Project Settings > Plugins > Crushform на существующий ассет, например /Crushform/Surfaces/DA_CF_Surfaces.

У грунта есть строка, но он не издаёт звука

Заголовок раздела «У грунта есть строка, но он не издаёт звука»

Причина. Пустое поле Rolling Sound означает отсутствие звука на этом грунте. Строка не берёт звук из строки Default.

Решение. Задайте Rolling Sound в этой строке. Звук должен быть зацикленным ассетом: незацикленный звук попадает в лог и обрывается между перезапусками.

Причина. У материала грунта нет физического материала или у его физического материала нет строки. В обоих случаях колесо получает строку Default.

Решение. Задайте Phys Material в материале грунта и добавьте в таблицу поверхностей строку для этого физического материала.

Колесо никогда не сообщает об изменении поверхности

Заголовок раздела «Колесо никогда не сообщает об изменении поверхности»

Причина. Host-объект, который задаёт колесу INDEX_NONE в качестве WheelIndex, никогда не передаёт это колесо в OnWheelSurfaceChanged. Host-объект, который сообщает только колёса на земле, никогда не видит, как колесо уходит с неё, потому что колесо считается стоящим на земле, если host-объект не сказал иначе.

Решение. Задайте каждому колесу WheelIndex от 0 по порядку и сообщайте обо всех колёсах в каждом кадре, с bGrounded, равным false, пока колесо в воздухе.