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

НАЧАЛО РАБОТЫОСНОВНЫЕ ПОНЯТИЯ

Основные понятия

Crushform состоит из нескольких частей, которые работают вместе: адаптер, который подключает плагин к автомобилю, решётка, которая гнёт кузов, профиль, который настраивает изгиб, материалы, которые рисуют результат, и host-объекты, которые отвечают на вопросы, на которые способна ответить только ваша игра. Страница разбирает их в таком порядке.

Автомобиль получает весь плагин через один компонент. На колёсном автомобиле Chaos используйте UCFChaosVehicleAdapterComponent: он берёт колёса из компонента движения. На любом другом экторе используйте UCFVehicleAdapterComponent и перечислите его колёса. Прицеп использует общий адаптер. Его колёса вращаются вместе с его движением, поэтому буксируемый прицеп поднимает пыль без двигателя.

Адаптер создаёт перечисленные ниже компоненты на каждом инстансе под именами из первого столбца. Каждый включается флагом из третьего столбца.

ИмяКлассФлагЧто делает
CF_DeformUCFDeformComponentDirt and DentsВмятины и грязь на кузове.
CF_GlassUCFGlassUnitsComponentGlassПокрывает трещинами и разбивает стеклянные панели. Нужен Dirt and Dents, который находит панели.
CF_PropContactUCFPropContactComponentBreaks PropsЛомает разрушаемые объекты, в которые въезжает автомобиль.
CF_ImpactFeedbackUCFNetImpactFeedbackComponentImpact FeedbackЗвуки и эффекты ударов на каждом инстансе.
CF_PartImpactFeedbackUCFPartImpactFeedbackComponentImpact Feedback с Dirt and DentsЗвуки и эффекты навесных деталей.
CF_TiresUCFTireComponentTiresШины деформируются на мешах колёс: сплющиваются под нагрузкой и обволакивают то, во что упираются.
CF_RollingAudioUCFRollingAudioComponentRolling SoundЗвук качения каждого колеса по поверхности под ним.
CF_RollingFXUCFRollingFXComponentRolling FXFX качения каждого колеса по поверхности под ним.
CF_EngineAudioUCFEngineAudioComponentEngine 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 решётка видна как узлы и балки между ними.

Помятый автомобиль с решёткой поверх: узлы и балки, окрашенные от зелёного до красного, вокруг кузова.
Решётка помятого автомобиля, показанная командой 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 профиля, то есть самого быстрого удара или скольжения, о котором клиент может сообщить.
  • Выделенный сервер симулирует и определяет повреждения, но ничего не рисует: ни грязи, ни звука, ни эффекта.

Компонент задаёт владельцу вопросы, на которые может ответить только игра: какой инстанс симулирует кузов, какие колёса касаются земли, какие меши являются колёсами и где находится шина. Каждая группа вопросов — это интерфейс. Реализуйте его у владельца или в одном из его компонентов, в C++ или в Blueprint. Событие Blueprint, которое вы не трогали, даёт ответ кузова без host-объекта.

ИнтерфейсКого спрашиваетЧто отвечает
ICFDeformHostUCFDeformComponent, отклик на ударыКакой инстанс является источником удара, игнорируемые экторы, правдоподобен ли отчёт, какие меши деформируются, меши колёс, стёкла
ICFWheelHostслой грязи, UCFRollingAudioComponent, UCFRollingFXComponentОдин список колёс кадра: точка, радиус, скорости, физический материал, в воздухе или на земле
ICFBreakerHostUCFPropContactComponentСимулирует ли этот инстанс кузов, контактное тело, маршрут отчёта, компонент, которым вминается разрушенный элемент
ICFTireHostUCFTireComponentКолёса, смещения и выталкивания, которые записываются обратно, коэффициенты нагрузки контакта, сцепка
ICFTireViewerбюджет шинНа пешке: в каком автомобиле едет игрок
ICFEngineHostUCFEngineAudioComponentВыключен ли двигатель, запускается он или работает, его обороты, холостые и максимальные обороты и дроссель

Компонент находит свой host-объект в таком порядке:

  1. Явный host-объект, заданный через SetCrushformHost до BeginPlay.
  2. Объект, зарегистрированный для владельца в UCFHostRegistry, подсистеме мира.
  3. Сам владелец, если он реализует интерфейс.
  4. Host-объекта нет.

Адаптер автомобиля регистрирует себя как host-объект владельца для интерфейсов деформации, колёс, ломания, шин и двигателя. Компонент деформации с явным host-объектом регистрирует этот host-объект для владельца, поэтому другие компоненты владельца находят тот же объект. Host-объект, который не реализует интерфейс, отклоняется с ошибкой. Второй host-объект для того же эктора и интерфейса заменяет первый, с предупреждением.

Host-объект на C++ вызывается напрямую. Host-объект на Blueprint выполняет скрипт только для тех событий, которые реализованы как скрипт. О том, как подключить собственный автомобиль к плагину, см. Свой автомобиль.

Классы настроек находятся в Project Settings › Plugins, каждый под своим отображаемым именем:

РазделКлассЧто в нём
CrushformUCFSettingsAtlas (Render Target и размеры слотов), Network (ограничения на отчёты клиентов), Contact (что считается новым контактом), Repair, Surfaces, профиль по умолчанию, Dirt, Look, Loose Parts (как поворачиваются и отрываются навесные детали) и Collision (когда пересобирается коллизия помятого кузова).
Crushform WheelsUCFWheelSettingsRolling Sound (переключатель, аттенюация, класс звука, настройка и значения для салона) и Rolling FX (переключатель, параметр интенсивности и настройка эффектов).
Crushform TireUCFTireSettingsBudget (какие шины деформируются и какие у этого пределы), Sleep (когда покоящееся колесо перестаёт трассировать), Tracing (каналы, которые игнорирует трассировка земли шины) и профиль шин по умолчанию.
Crushform EngineUCFEngineSettingsEngine Sound: переключатель, профиль по умолчанию, класс звука, приоритет и значения для салона.
Crushform Impact FeedbackUCFImpactFeedbackSettingsDefault Set звуков и эффектов и переключатель Breakable Host.
Crushform BreakableUCFBreakableSettingsОграничения и коллизия Debris, а также респаун разрушенных объектов.
Crushform Zone EditorUCFEditorSettingsПресеты редактора зон (сохраняются в DefaultEditor.ini).

В любой сборке, кроме Shipping, откройте консоль клавишей тильда и выполните эти команды.

  • Crushform.Stats выводит занятые слоты атласа и счётчики каждого повреждаемого эктора в мире. Работает во всех сборках, кроме Shipping.
  • Crushform.Debug 2 рисует узлы решётки, которые двигают меши, и балки между ними. Crushform.Debug 1 рисует только повреждённые узлы. Недавние удары видны как синие сферы.
  • Crushform.ShowZones 1 рисует зоны жёсткости боксами: от синего (мягко) через зелёный к красному (жёстко).

Crushform.Debug и Crushform.ShowZones — читы, поэтому работают во всех сборках, кроме Shipping, и в редакторе.