НАЧАЛО РАБОТЫОСНОВНЫЕ ПОНЯТИЯ
Основные понятия
Crushform состоит из нескольких частей, которые работают вместе: адаптер, который подключает плагин к автомобилю, решётка, которая гнёт кузов, профиль, который настраивает изгиб, материалы, которые рисуют результат, и host-объекты, которые отвечают на вопросы, на которые способна ответить только ваша игра. Страница разбирает их в таком порядке.
Адаптер
Заголовок раздела «Адаптер»Автомобиль получает весь плагин через один компонент. На колёсном автомобиле Chaos используйте UCFChaosVehicleAdapterComponent: он берёт колёса из компонента движения. На любом другом экторе используйте UCFVehicleAdapterComponent и перечислите его колёса. Прицеп использует общий адаптер. Его колёса вращаются вместе с его движением, поэтому буксируемый прицеп поднимает пыль без двигателя.
Адаптер создаёт перечисленные ниже компоненты на каждом инстансе под именами из первого столбца. Каждый включается флагом из третьего столбца.
| Имя | Класс | Флаг | Что делает |
|---|---|---|---|
CF_Deform | UCFDeformComponent | Dirt and Dents | Вмятины и грязь на кузове. |
CF_Glass | UCFGlassUnitsComponent | Glass | Покрывает трещинами и разбивает стеклянные панели. Нужен Dirt and Dents, который находит панели. |
CF_PropContact | UCFPropContactComponent | Breaks Props | Ломает разрушаемые объекты, в которые въезжает автомобиль. |
CF_ImpactFeedback | UCFNetImpactFeedbackComponent | Impact Feedback | Звуки и эффекты ударов на каждом инстансе. |
CF_PartImpactFeedback | UCFPartImpactFeedbackComponent | Impact Feedback с Dirt and Dents | Звуки и эффекты навесных деталей. |
CF_Tires | UCFTireComponent | Tires | Шины деформируются на мешах колёс: сплющиваются под нагрузкой и обволакивают то, во что упираются. |
CF_RollingAudio | UCFRollingAudioComponent | Rolling Sound | Звук качения каждого колеса по поверхности под ним. |
CF_RollingFX | UCFRollingFXComponent | Rolling FX | FX качения каждого колеса по поверхности под ним. |
CF_EngineAudio | UCFEngineAudioComponent | Engine Sound | Звук двигателя. Переключатель Engine Sound в настройках Crushform Engine тоже должен быть включён. |
Deform, glass, prop contact и impact feedback реплицируются. Каждый создаётся под фиксированным именем на каждом инстансе, поэтому копия на клиенте соответствует копии на сервере. Звуки и эффекты работают только там, где что-то отрисовывается, поэтому на выделенном сервере они никогда не запускаются.
Authority в UCFVehicleAdapterComponent::Authority выбирает, какой инстанс симулирует автомобиль и оценивает его удары:
- Server: сервер симулирует автомобиль и не принимает отчёты о ударах от клиентов. Это стандартная настройка Chaos.
- Owning Client: инстанс, на котором игрок управляет автомобилем, симулирует его и сообщает о своих ударах. Сервер делает это, пока автомобилем никто не управляет. Сервер верит сообщённому удару, только если он не сильнее, чем позволяет недавняя скорость автомобиля плюс Ram Allowance Mps, а эта сумма затем умножается на коэффициент до примерно 2,2. Множитель — запас на удар в более лёгкий кузов, который уступает: такой удар забирает у автомобиля больше энергии, чем то же изменение скорости при ударе в стену, поэтому сервер это учитывает.
Решётка и профиль
Заголовок раздела «Решётка и профиль»Когда начинается игра, UCFDeformComponent натягивает решётку узлов на кузов, в пространстве его корневого компонента. Каждый узел хранит смещение и значение износа краски. Удар толкает узлы так, как сминается металл: вмятина распространяется от места контакта, как гармошка, и растекается по удару. Физический контакт с деформированным мешем становится ударом на инстансе, который симулирует кузов. Скользящий контакт стирает краску.
Решётка гнёт Static Mesh, которые не входят в ISM, и Skeletal Mesh владельца. Include Tags и Exclude Tags в профиле фильтруют их по тегу компонента. Решётка закрепляется за корнем в BeginPlay, поэтому исключите каждую деталь, которая двигается относительно кузова, например дверь или руль. Такая деталь гнулась бы в той позе, которую имела в BeginPlay.
Навесная деталь, например дверь или капот на UCFHingeComponent, поворачивается на шарнире, когда её вмятины превышают порог качания. Она отрывается, только если её смяло достаточно сильно.
Форму повреждения задаёт профиль, Data Asset UCFProfile. Создайте его и задайте компоненту: в настройках класса по умолчанию или между SpawnActorDeferred и FinishSpawning. Без профиля компонент ничего не делает. Основные настройки такие:
- Resolution (
UCFProfile::Resolution): узлы решётки по каждой оси. Каждая ось кратна 4. Решётка уменьшается, чтобы поместиться в один слот атласа, а валидация ассета сообщает об ошибке с размером, до которого игра её уменьшит, если это понадобилось. - Min Delta V: скорость удара в м/с, ниже которой кузов не вминается. Более мягкие удары его не трогают.
- Stiffness: глубина вмятины в сантиметрах на каждый м/с сверх Min Delta V.
- Max Displacement (
UCFProfile::MaxDisplacement): максимальное смещение любого узла в сантиметрах. Материалы кузова должны использовать его как Max World Position Offset Displacement. - Stiffness Zones (
UCFProfile::StiffnessZones): боксы в пространстве корня, где кузов жёстче или мягче остального, например мягкая зона смятия спереди или салон, который сохраняет форму. У каждой зоны свой Stiffness.Crushform.ShowZones 1рисует их. - Include Tags и Exclude Tags: меши, которые гнутся, как описано выше.
- Dents: если выключено, удары и продавливания никогда не вминают и не царапают кузов. Грязь по-прежнему работает.
- Deform Collision: коллизия кузова следует за его вмятинами. Каждый бокс или выпуклая форма разрезается на блоки там, где вмятина их гнёт. Масса и инерция сохраняют свои значения.
- Hinged Parts: если выключено, навесные детали никогда не поворачиваются и не отрываются. Они вминаются вместе с кузовом, как любая другая панель.
С Crushform.Debug 2 решётка видна как узлы и балки между ними.
Материалы рисуют повреждения
Заголовок раздела «Материалы рисуют повреждения»Повреждения кузова рисуют его материалы. Все повреждённые компоненты используют один атлас, RT_CF_LatticeAtlas (/Crushform/Atlas/RT_CF_LatticeAtlas), Render Target RGBA8 размером 1024 на 256 текселей. По умолчанию в нём 128 слотов по 256 на 8 текселей. UCFRenderSubsystem выдаёт каждому повреждённому компоненту слот и копирует туда решётку компонента. Материал находит свой слот через Custom Primitive Data. Плагин записывает 18 float, начиная с Custom Data Offset, который по умолчанию равен 0. Если его изменить, функции материала, которые его запекают, пересоберутся: сохраните их или выполните Crushform.RebakeOffsets в редакторе.
Три функции материала рисуют кузов и колёса:
MF_CF_Deformдвигает вершины через World Position Offset и поворачивает их нормали. Там, где вмятина укоротила металл, она ещё и создаёт складки.MF_CF_Paintстирает краску и рисует линии царапин. Он ставится между вашей краской и Base Color, Roughness и Metallic, а его износ и линии царапин берутся изMF_CF_Deform.MF_CF_WheelDirtрисует грязь на колёсах.
В каждом материале меша, который должен гнуться, подключите MF_CF_Deform в World Position Offset и Normal. Задайте Max World Position Offset Displacement не меньше, чем Max Displacement профиля плюс амплитуда складок материала, потому что складки двигают вершины дальше вмятин. Компонент без повреждений не получает слота и рисуется точно так же, как без плагина. Когда в атласе заканчиваются слоты, повреждённые экторы, которые дальше всего от камер своих игроков, рисуются неповреждёнными, пока слот не освободится.
Пыль, грязь, снег и влагу рисуют MF_CF_Paint и MF_CF_WheelDirt, а трещины на стекле — MF_CF_GlassCrack. У каждой есть встроенный вид. В Project Settings › Plugins › Crushform › Look можно указать Body Dirt Look, Wheel Dirt Look и Glass Crack Look на собственную функцию материала.
Поверхности
Заголовок раздела «Поверхности»Что делает колесо на грунте, зависит от поверхности под ним. Поверхность — это физический материал. UCFSurfaces хранит по одной строке на каждый физический материал. Она указывается в Project Settings › Plugins › Crushform › Surfaces, а по умолчанию это /Crushform/Surfaces/DA_CF_Surfaces. Каждая строка говорит, что эта поверхность делает с колесом на ней:
- Dirt: сколько грязи поверхность даёт кузову и сколько с него снимает, в секунду при эталонной скорости.
- Rolling Sound: звук качения шины по этой поверхности.
- Rolling FX: FX качения, система Niagara.
- Rolling FX Intensity Parameter: float-параметр эффекта, который принимает интенсивность. Если поле пусто, эффект использует
UCFWheelSettings::FXIntensityParameter.
Пустое поле означает «ничего». Строка без Rolling Sound беззвучна и не заимствует звук строки Default. Колесо на материале без строки или вовсе без материала получает строку Default. Без ассета поверхностей ни один кузов не пачкается.
В поставке есть строка для каждого из семи физических материалов, PM_CF_Asphalt, PM_CF_Dirt, PM_CF_Grass, PM_CF_Mud, PM_CF_Swamp, PM_CF_Snow и PM_CF_Water, а также строка Default. Чтобы использовать один из них, задайте Phys Material материала земли в разделе Physical Material. Чтобы использовать собственную поверхность, добавьте строку для её физического материала.
Кто решает повреждения
Заголовок раздела «Кто решает повреждения»У каждого кузова есть один инстанс, который решает его повреждения, тот, что его симулирует. Для автомобиля его задаёт Authority. Для любого другого тела host-объект может ответить, какой инстанс является источником удара (ICFDeformHost).
- Сервер хранит настоящую решётку. Он публикует её чанками по 4x4x4, один чанк за сетевое обновление, сначала самые большие изменения. Каждый клиент рисует чанки, которые получает.
- Клиент, который симулирует тело, применяет свои удары сразу, как клиентское предсказание. Он сообщает каждый удар серверу и держит удар, пока чанк от сервера его не подтвердит или сервер не отклонит.
- Сервер отклоняет любой отчёт выше Max Plausible Delta V профиля, то есть самого быстрого удара или скольжения, о котором клиент может сообщить.
- Выделенный сервер симулирует и определяет повреждения, но ничего не рисует: ни грязи, ни звука, ни эффекта.
Host-объекты
Заголовок раздела «Host-объекты»Компонент задаёт владельцу вопросы, на которые может ответить только игра: какой инстанс симулирует кузов, какие колёса касаются земли, какие меши являются колёсами и где находится шина. Каждая группа вопросов — это интерфейс. Реализуйте его у владельца или в одном из его компонентов, в C++ или в Blueprint. Событие Blueprint, которое вы не трогали, даёт ответ кузова без host-объекта.
| Интерфейс | Кого спрашивает | Что отвечает |
|---|---|---|
ICFDeformHost | UCFDeformComponent, отклик на удары | Какой инстанс является источником удара, игнорируемые экторы, правдоподобен ли отчёт, какие меши деформируются, меши колёс, стёкла |
ICFWheelHost | слой грязи, UCFRollingAudioComponent, UCFRollingFXComponent | Один список колёс кадра: точка, радиус, скорости, физический материал, в воздухе или на земле |
ICFBreakerHost | UCFPropContactComponent | Симулирует ли этот инстанс кузов, контактное тело, маршрут отчёта, компонент, которым вминается разрушенный элемент |
ICFTireHost | UCFTireComponent | Колёса, смещения и выталкивания, которые записываются обратно, коэффициенты нагрузки контакта, сцепка |
ICFTireViewer | бюджет шин | На пешке: в каком автомобиле едет игрок |
ICFEngineHost | UCFEngineAudioComponent | Выключен ли двигатель, запускается он или работает, его обороты, холостые и максимальные обороты и дроссель |
Компонент находит свой host-объект в таком порядке:
- Явный host-объект, заданный через
SetCrushformHostдо BeginPlay. - Объект, зарегистрированный для владельца в
UCFHostRegistry, подсистеме мира. - Сам владелец, если он реализует интерфейс.
- Host-объекта нет.
Адаптер автомобиля регистрирует себя как host-объект владельца для интерфейсов деформации, колёс, ломания, шин и двигателя. Компонент деформации с явным host-объектом регистрирует этот host-объект для владельца, поэтому другие компоненты владельца находят тот же объект. Host-объект, который не реализует интерфейс, отклоняется с ошибкой. Второй host-объект для того же эктора и интерфейса заменяет первый, с предупреждением.
Host-объект на C++ вызывается напрямую. Host-объект на Blueprint выполняет скрипт только для тех событий, которые реализованы как скрипт. О том, как подключить собственный автомобиль к плагину, см. Свой автомобиль.
Настройки проекта
Заголовок раздела «Настройки проекта»Классы настроек находятся в Project Settings › Plugins, каждый под своим отображаемым именем:
| Раздел | Класс | Что в нём |
|---|---|---|
| Crushform | UCFSettings | Atlas (Render Target и размеры слотов), Network (ограничения на отчёты клиентов), Contact (что считается новым контактом), Repair, Surfaces, профиль по умолчанию, Dirt, Look, Loose Parts (как поворачиваются и отрываются навесные детали) и Collision (когда пересобирается коллизия помятого кузова). |
| Crushform Wheels | UCFWheelSettings | Rolling Sound (переключатель, аттенюация, класс звука, настройка и значения для салона) и Rolling FX (переключатель, параметр интенсивности и настройка эффектов). |
| Crushform Tire | UCFTireSettings | Budget (какие шины деформируются и какие у этого пределы), Sleep (когда покоящееся колесо перестаёт трассировать), Tracing (каналы, которые игнорирует трассировка земли шины) и профиль шин по умолчанию. |
| Crushform Engine | UCFEngineSettings | Engine Sound: переключатель, профиль по умолчанию, класс звука, приоритет и значения для салона. |
| Crushform Impact Feedback | UCFImpactFeedbackSettings | Default Set звуков и эффектов и переключатель Breakable Host. |
| Crushform Breakable | UCFBreakableSettings | Ограничения и коллизия Debris, а также респаун разрушенных объектов. |
| Crushform Zone Editor | UCFEditorSettings | Пресеты редактора зон (сохраняются в DefaultEditor.ini). |
Проверка работы
Заголовок раздела «Проверка работы»В любой сборке, кроме Shipping, откройте консоль клавишей тильда и выполните эти команды.
Crushform.Statsвыводит занятые слоты атласа и счётчики каждого повреждаемого эктора в мире. Работает во всех сборках, кроме Shipping.Crushform.Debug 2рисует узлы решётки, которые двигают меши, и балки между ними.Crushform.Debug 1рисует только повреждённые узлы. Недавние удары видны как синие сферы.Crushform.ShowZones 1рисует зоны жёсткости боксами: от синего (мягко) через зелёный к красному (жёстко).
Crushform.Debug и Crushform.ShowZones — читы, поэтому работают во всех сборках, кроме Shipping, и в редакторе.

