ПОВЕРХНОСТИКОЛЁСА И ПОВЕРХНОСТИ
Колёса и поверхности
Грунт определяет, что делает колесо: сколько загрязнения оно передаёт кузову и как шина звучит и выглядит на этом грунте. Плагин находит грунт под каждым колесом по его физическому материалу, а затем ищет этот материал в таблице. На этой странице описаны таблица, колёса, которые считывает кузов, и то, как добавить свой грунт.
| Crushform | ||
|---|---|---|
| Surfaces | 7 Map elements | |
| Index [ 0 ] | ||
| Key | PM_CF_Asphalt | |
| Value | ||
| Dirt | ||
| Rolling Sound | SW_CF_Tire_Asphalt_Loop | |
| Rolling FX | NS_CF_Rolling_Asphalt | |
| Rolling FX Intensity Parameter | ||
| Index [ 1 ] | ||
| Index [ 2 ] | ||
| Index [ 3 ] | ||
| Index [ 4 ] | ||
| Index [ 5 ] | ||
| Index [ 6 ] | ||
| Default | ||
Что это делает
Заголовок раздела «Что это делает»У каждого физического материала, который вы используете для грунта, есть строка в таблице поверхностей. Строка говорит, какое загрязнение колесо на этом грунте передаёт кузову, какой звук качения оно проигрывает и какой эффект качения показывает. Поставляемый ассет DA_CF_Surfaces содержит строки для семи физических материалов, которые поставляет плагин.
Как это работает
Заголовок раздела «Как это работает»- Таблица.
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срабатывает, когда меняется физический материал колеса или признак, что оно на земле. Одно только изменение скорости ничего не запускает. - Выделенный сервер. Проверка поверхности колеса на выделенном сервере не выполняется.
Настройка
Заголовок раздела «Настройка»- В Content Browser выберите Add > Miscellaneous > Data Asset, укажите класс CFSurfaces и назовите ассет DA_MyGame_Surfaces.
- Откройте его. В Default задайте строку для любого грунта без собственной строки.
- Добавьте в Surfaces запись для каждого грунта. В качестве ключа выберите физический материал грунта, затем заполните его коэффициенты Dirt, Rolling Sound и Rolling FX. Оставьте поле пустым, если ничего не нужно.
- В Project Settings > Plugins > Crushform задайте Surfaces равным DA_MyGame_Surfaces.
- На адаптере автомобиля заполните Wheels, по одной записи на колесо: выберите его компонент Wheel и задайте Radius или оставьте радиус 0, чтобы взять его из меша.
- Задайте физический материал каждого грунта в его материале, в поле Physical Material, как Phys Material. Настройка поверхностей подробнее описана на странице Основные понятия.
Использование
Заголовок раздела «Использование»Blueprint может считать поверхность колеса из компонента деформации. График ниже выполняется, когда срабатывает пользовательское событие 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::RollingFXIntensityParameter | Float-параметр эффекта, который принимает интенсивность. | 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, пока колесо в воздухе.
