ПОВРЕЖДЕНИЯСТЕКЛО
Стекло
Что это делает
Заголовок раздела «Что это делает»Каждая стеклянная панель кузова Crushform может треснуть, разбиться и рассыпаться на осколки. Удар рядом с окном вызывает в нём трещину, более сильный удар разбивает, а если кузов вмят вокруг панели, в ней тоже может появиться трещина. Трещины остаются на панели, пока кузов не отремонтирован.
Как это работает
Заголовок раздела «Как это работает»Панель — это статический меш кузова, UCFGlassComponent. Собственной коллизии у неё нет. Выстрел или брошенный камень попадает в коллизию кузова у окна, и Crushform сопоставляет удар с панелью, до которой он дотянулся, в пределах Hit Reach Cm (UCFGlassDefinition::HitReachCm, 15 см в новом определении).
Каждая панель — это один элемент с тремя уровнями: цела, треснута и разбита. Панели нумеруются по их именам, поэтому все инстансы понимают, какая панель какая.
Трещину в панели могут вызвать три вещи. Пороги для каждой задаёт определение панели:
- Удар. Изменение скорости удара рядом с панелью вызывает в ней трещину при Crack Delta V (
UCFGlassDefinition::CrackDeltaV) и разбивает её при Break Delta V (UCFGlassDefinition::BreakDeltaV). Удар ниже порога трещины стекла никак не затрагивает. - Каркас. Кузов прогибается вокруг панели, когда его вмяли (Вмятины и решётка объясняют вмятины). Самое большое смещение узла внутри коробки панели вызывает в ней трещину при Frame Crack Displacement Cm. Среднее смещение этих узлов разбивает её при Frame Break Displacement Cm.
- Связь. Часть кузова, например капот перед ветровым стеклом (о навесных деталях см. Навесные детали), может вызвать трещину в панели через её Crush Link Box (
UCFGlassComponent::CrushLinkBox). Самый глубокий узел в этой коробке вызывает трещину у ближайшего к нему края панели, а среднее значение разбивает её.
Каркас и связь судят стекло, только когда кузов вмят. Поэтому стеклу нужны Dirt and Dents на адаптере автомобиля. Адаптер находит панели через него. Об адаптере и решётке см. Основные понятия.
Трещины до разрушения. Задайте Cracks Before Break (UCFGlassDefinition::CracksBeforeBreak), чтобы разбить панель после стольких трещин от ударов. Ноль означает, что панель никогда не разбивается по количеству. Считаются только удары, а не каркас кузова, поэтому вмятина, которая остаётся, не разбивает панель со временем.
Вид трещин. Каждая панель хранит не больше четырёх трещин. Радиус трещины растёт с силой удара, между Min Crack Radius Cm и Max Crack Radius Cm. Crack Style задаёт рисунок: Web, Hole или Net.
Внешние удары. Пуля или брошенный камень вызывает в панели трещину, только когда Takes Point Damage (UCFGlassDefinition::bTakesPointDamage) включён. Таблица Hit Responses определения затем решает, какого уровня достигает каждый вид удара. Вид удара, которому нет строки в таблице, ничего не делает (UCFBreakableDefinition::HitResponses).
Разрушение. Разбитая панель скрывается и рассыпается на осколки. Панель покрыта квадратными плитками, первыми идут ближайшие к удару. Каждая плитка имеет сторону Shard Tile Cm и разбивается на Shards Per Tile осколков. В осколки превращается не больше Max Shard Tiles плиток, поэтому осколки покрывают не больше такого числа плиток панели, а остальная часть панели просто исчезает: пять плиток по 50 см закрывают 1.25 м², как в многослойном пресете. Каждая плитка поворачивается вокруг внешней оси панели на случайный угол, чтобы куски двух плиток не выстраивались в линию. Shard Shape задаёт куски: Granules — мелкие кусочки, как у закалённого стекла, или Slabs — плоские пластины, как у многослойного стекла, которое крошится и не разлетается. Каждый осколок — один из мешей осколков, выбранный случайно и масштабированный до размера осколка. Плагин поставляет шесть неправильных многоугольных пластин, от SM_CF_GlassShard_01 до SM_CF_GlassShard_06, которые рисуются с M_CF_GlassShard — прозрачным стеклом с более яркими краями. Каждая разбитая панель бросает свои осколки как частицы одной Niagara-системы, описанной ниже в разделе «Системы осколков».
Кто рисует. Сервер судит стекло и реплицирует трещины, а каждый инстанс, который их рисует, их показывает. Выделенный сервер судит панели, но ничего не рисует и не загружает систему осколков. Ремонт возвращает каждую панель целой и убирает её трещины.
Настройка
Заголовок раздела «Настройка»- Откройте Blueprint вашего автомобиля, например копию
BP_VehicleAdvSedanв вашем проекте. Выберите компонент Crushform Chaos Vehicle Adapter. Проверьте, что Dirt and Dents и Glass включены. Оба включены по умолчанию. - Создайте определение стекла. В Content Browser выберите Add > Miscellaneous > Data Asset, укажите CFGlass Definition и назовите его. Можно также продублировать один из готовых пресетов из Plugins › Crushform Content › Presets:
DA_CF_GlassLaminatedилиDA_CF_GlassTempered. - Проверьте в определении осколки. Определение без осколков предупреждает, что разбитая панель исчезнет без них. Постройте их вызовом Build Glass Shards (
UCFContentLibrary::BuildGlassShards, в категории Crushform|Content) из Editor Utility Blueprint или из Python. Вызов принимает определение и список мешей осколков; плагин поставляет шесть, построенных Build Glass Shard Mesh (UCFContentLibrary::BuildGlassShardMesh).
| Glass | ||
|---|---|---|
| Crushform Hits | ||
| Crack Delta V | 5.0 | |
| Break Delta V | 14.0 | |
| Hit Reach Cm | 20.0 | |
| Frame Crack Displacement Cm | 4.0 | |
| Frame Break Displacement Cm | 12.0 | |
| Link Crack Displacement Cm | 30.0 | |
| Link Break Displacement Cm | 15.0 | |
| Cracks Before Break | ||
| Look | ||
| Crack Style | ||
| Min Crack Radius Cm | 10.0 | |
| Max Crack Radius Cm | 45.0 | |
| Crack Merge Cm | 12.0 | |
| Shards | ||
| Shard Shape | ||
| Shard Tile Cm | 50.0 | |
| Shards Per Tile | 12 | |
| Shard Min Size Cm | 3.0 | |
| Shard Max Size Cm | 9.0 | |
| Shard Thickness Cm | 0.6 | |
| Max Shard Tiles | 5 | |
- Добавьте панель на каждое окно. В Blueprint автомобиля выберите Add › CFGlass, в группе Crushform. Задайте её Static Mesh как меш окна, а Definition — ваше определение стекла. Прикрепите панель к кузову или к навесной детали, на которой она сидит.
- Откройте статический меш окна и включите Allow CPU Access. Без него осколки изогнутого или наклонного окна ложатся на плоскость, потому что плагин не может прочитать форму окна.
- По желанию: задайте Crush Link Box панели, например вокруг лобового стекла, как у седана. Капот — другой вариант для панели, которую складывает капот. Включите Is Valid у Crush Link Box, затем задайте Min и Max в пространстве корня, в см. Коробка без Is Valid ничего не связывает. Выберите панель в редакторе Blueprint, чтобы увидеть коробку во вьюпорте. Она рисуется только в редакторе Blueprint, не на уровне и не в PIE.
Использование
Заголовок раздела «Использование»Получите элементы стекла с адаптера автомобиля через Get Glass. Он ничего не возвращает, пока Glass и Dirt and Dents не включены. Затем привяжите On Unit Level Changed (UCFBreakableUnitsComponent::OnUnitLevelChanged) к пользовательскому событию. Событие передаёт Units, UnitIndex, Level и PreviousLevel.
Событие срабатывает на каждом инстансе каждый раз, когда меняется уровень панели. Сюда входит игрок, который подключился позже и получает состояние уже треснувших или разбитых панелей. Поэтому проверяйте Level в обработчике, а не считайте, что событие означает разрушение. Не запускайте от него одноразовые эффекты. Чтобы узнать, насколько вмята каждая сторона кузова, используйте Зоны повреждений и события.
Из C++ можно вызвать трещину в панели, ближайшей к точке, или разбить её. Работает только на авторити.
#include "CFScriptedHits.h"
// Authority only: crack the pane nearest WorldPoint, within 50 cm of it.const bool bCracked = CFScriptedHits::HitPaneNear(*Deform, WorldPoint, 50.0f, /*bBreak=*/false);Deform — это UCFDeformComponent кузова, а WorldPoint — FVector в мире. Задайте bBreak в значение true, чтобы разбить панель вместо трещины. Функция возвращает false, когда ни одна панель не так близка или ничего не изменилось.
Основные настройки
Заголовок раздела «Основные настройки»| Свойство | Что делает | По умолчанию (новое определение) |
|---|---|---|
UCFGlassDefinition::CrackDeltaV | Изменение скорости удара рядом с панелью, м/с, с которого панель трескается. | 5 |
UCFGlassDefinition::BreakDeltaV | Изменение скорости, м/с, с которого удар разбивает панель. Должно быть выше Crack Delta V. | 12 |
UCFGlassDefinition::HitReachCm | Насколько расширяется коробка панели при сопоставлении удара с ней, см. | 15 |
UCFGlassDefinition::FrameCrackDisplacementCm | Самое большое смещение узла в коробке панели, см, с которого каркас вызывает в ней трещину. | 4 |
UCFGlassDefinition::FrameBreakDisplacementCm | Среднее смещение узлов в коробке панели, см, с которого каркас её разбивает. | 10 |
UCFGlassDefinition::LinkCrackDisplacementCm | Самое большое смещение узла в Crush Link Box, см, с которого связанная деталь вызывает в панели трещину. | 25 |
UCFGlassDefinition::LinkBreakDisplacementCm | Среднее смещение узлов в Crush Link Box, см, с которого связанная деталь разбивает панель. | 15 |
UCFGlassDefinition::CracksBeforeBreak | Число трещин от ударов, после которого панель разбивается. Ноль — никогда по количеству. | 0 |
UCFGlassDefinition::CrackStyle | Рисунок трещины, который оставляет удар: Web, Hole или Net. | Web |
UCFGlassDefinition::MinCrackRadiusCm | Радиус трещины от самого слабого удара, см. | 8 |
UCFGlassDefinition::MaxCrackRadiusCm | Радиус трещины от самого сильного удара, см. | 45 |
UCFGlassDefinition::ShardShape | На что распадается разбитая панель: Granules или Slabs. | Granules |
UCFGlassDefinition::ShardTileCm | Сторона квадратной плитки панели, см, для которой делаются Shards Per Tile осколков. Не меньше 2. | 30 |
UCFGlassDefinition::ShardsPerTile | Осколков, на которые разбивается одна плитка панели. | 8 |
UCFGlassDefinition::ShardMinSizeCm | Наименьшая сторона осколка, см. | 2 |
UCFGlassDefinition::ShardMaxSizeCm | Наибольшая сторона осколка, см. | 4 |
UCFGlassDefinition::ShardThicknessCm | Толщина осколка, см. Только для Slabs. | 0.5 |
UCFGlassDefinition::MaxShardTiles | Наибольшее число плиток одной панели, которые превращаются в осколки при разрушении. | 6 |
UCFGlassDefinition::ShardSystem | Niagara-система, которая бросает осколки этого стекла. Нет: Default Glass Shard System проекта. | Нет |
UCFGlassDefinition::bTakesPointDamage | Может ли пуля или брошенный камень вызвать в панели трещину и разбить её. | Выкл. |
UCFGlassComponent::CrushLinkBox | Часть кузова, сминание которой тоже вызывает в этой панели трещину. Пустая коробка ничего не связывает. | Пусто |
Значения нового определения показаны выше. Поставляемые пресеты отличаются. DA_CF_GlassLaminated, который использует седан, трескается при 5 м/с, разбивается при 14 м/с и дотягивается до 20 см. Его плитки по 50 см, по 12 осколков по 3–9 см на каждой, не больше чем на 5 плитках. DA_CF_GlassTempered трескается при 6 м/с и разбивается при 9 м/с. Его плитки по 30 см, по 16 осколков по 1–2.5 см на каждой, не больше чем на 4 плитках.
Системы осколков
Заголовок раздела «Системы осколков»Каждая разбитая панель бросает свои осколки через одну Niagara-систему, взятую из пула. Система возвращается в пул, когда заканчивается, когда панель отремонтирована и когда игра заканчивается. Панель дальше UCFBreakableSettings::DebrisMaxSpawnDistanceCm (10000 см) от локальной камеры осколков не бросает.
Определение называет свою систему в Shard System (UCFGlassDefinition::ShardSystem). Определение без Shard System использует Default Glass Shard System проекта в Project Settings › Plugins › Crushform, в группе Glass. Плагин задаёт там NS_CF_GlassShards. Система по умолчанию загружается в фоне, когда начинается игра. Пока её нет в памяти, разрушение не бросает осколков, а игра никогда не ждёт её в кадре разрушения. Собственная система определения загружается вместе с определением, поэтому такого промежутка у неё нет.
Слоты мешей. Каждый осколок берёт свой меш из слота меша — пользовательского параметра типа Static Mesh: User.CF_ShardMesh0, User.CF_ShardMesh1 и так далее. Слот 0 получает первый отличный меш осколка определения, слот 1 — второй, в порядке, в котором меши впервые встречаются среди фрагментов. В системе по умолчанию шесть слотов, от CF_ShardMesh0 до CF_ShardMesh5. Седьмой отличный меш использует слот 0, восьмой — слот 1 и так далее. Собственной системе определения нужен слот для каждого отличного меша. Редактор предупреждает, когда у определения без Shard System больше шести отличных мешей осколков. Слот, которого в системе нет, не рисует меш.
Звук осколков. Когда осколки обо что-то ударяются, панель проигрывает звук удара осколков для самого быстрого из них, не чаще чем раз в 0.25 с (UCFBreakableSettings::DebrisImpactCooldownSeconds). Осколок, чей удар слабее UCFBreakableSettings::DebrisMinImpulsePerKg, ничего не проигрывает. Чтобы собственная система давала этот звук, ей нужен интерфейс данных Export, описанный ниже.
Что должна открывать собственная система. Дайте системе эти пользовательские параметры под этими именами. Плагин задаёт каждый из них при каждом создании, поэтому система из пула, которую используют для другой панели, не хранит значений прошлой панели. Параметр, которого в системе нет, игнорируется.
| Параметр | Тип | Что означает | Единицы |
|---|---|---|---|
User.CF_ShardPositions | Массив позиций | Центр каждого осколка в мировых координатах. | см |
User.CF_ShardRotations | Массив кватернионов | Поворот каждого осколка в мировых координатах. | Нет |
User.CF_ShardVelocities | Массив векторов | Начальная линейная скорость каждого осколка. | см/с |
User.CF_ShardAngularVelocities | Массив векторов | Начальное вращение каждого осколка вокруг мировых осей. | град/с |
User.CF_ShardScales | Массив векторов | Масштаб каждого осколка. Он умножает размер меша осколка. | Нет |
User.CF_ShardMeshIndices | Массив целых чисел | Слот меша, из которого каждый осколок берёт свой меш. | Номер слота |
User.CF_ShardCount | Целое число | Число осколков в этом создании. | Нет |
User.CF_ShardLifetime | Float | Сколько секунд осколок живёт самое большее. | с |
User.CF_ShardRestSeconds | Float | Сколько секунд осколок лежит неподвижно, прежде чем начать тонуть. | с |
User.CF_ShardSinkSeconds | Float | За сколько секунд осколок утонет. | с |
User.CF_ShardCollisionDelay | Float | Сколько секунд после создания система не сталкивает осколок. Плагин задаёт 0.1. | с |
User.CF_ShardCallback | Объект | Коллбэк, которому интерфейс данных Export системы сообщает о каждом ударе осколка. | Нет |
User.CF_ShardMesh0, User.CF_ShardMesh1, … | Static Mesh | Меш слота 0, слота 1 и так далее. | Нет |
Для звука осколков также нужен интерфейс данных Export, который сообщает позицию и скорость каждой частицы в User.CF_ShardCallback. Без него осколки всё равно летят, пропадает только их звук.
Три консольные переменные задают, сколько стекла разлетается и когда:
Crushform.Glass.ShardScale(1) — доля осколков разбитой панели, которые разлетаются, от 0 до 1. 0 не бросает ни одного, а панель всё равно разбивается.Crushform.Glass.MaxLiveShards(512) — наибольшее число осколков разбитых панелей, живых одновременно. 0 снимает предел. Сверх предела первыми освобождаются осколки самых старых разбитых панелей, а осколки одного разрушения сверх предела отрезаются.Crushform.Glass.ShardSystemsPerFrame(1) — сколько систем осколков стартует в одном кадре, а 0 снимает ограничение. Панели, которые разбиваются вместе, бросают осколки с разницей в кадр или несколько кадров, чтобы кадр аварии не запускал их все.
Что стоит каждая из них, сказано на странице Производительность.
Проверка работы
Заголовок раздела «Проверка работы»В любой сборке, кроме Shipping, запустите игру в редакторе. Crushform.DebugImpact никогда не бьёт по машине, которой вы управляете, потому что трассировка её пропускает. Подъедьте к припаркованной машине, например BP_VehicleAdvSedan2 на карте Proving Ground, и наведите центр экрана на её лобовое стекло. Введите Crushform.DebugImpact 8. Изменение скорости — 8 м/с. Окно должно треснуть, и вы должны услышать звук трещины. Сначала введите crushform.Impact.LogHits 1, чтобы записывать в лог точку и силу каждого удара.
Затем введите Crushform.DebugImpact 15 по тому же окну. На 15 м/с панель разбивается: она исчезает, и осколки разлетаются от кузова. Crushform.RepairAll возвращает панель целой.
Решение проблем
Заголовок раздела «Решение проблем»- Удар рядом с окном не оставляет трещины. Удар ниже Crack Delta V (5 м/с в новом определении), или у адаптера автомобиля выключен Dirt and Dents, поэтому каркас и связь никогда не судят стекло. Увеличьте удар, понизьте Crack Delta V или включите Dirt and Dents.
- Разбитое окно исчезает без осколков. В определении нет осколков. Постройте их через Build Glass Shards, как на шаге 3 раздела «Настройка».
- Пуля проходит через окно без трещины. Takes Point Damage выключен, или в таблице Hit Responses определения нет строки для этого вида удара. Включите переключатель и добавьте строку для этого вида.
- Осколки летят не в той плоскости у изогнутого окна. У статического меша окна не включён Allow CPU Access, поэтому плагин подгоняет под него плоскую коробку. Включите опцию и постройте осколки заново.
- Разрушение сразу после начала игры не бросает осколков. Система осколков по умолчанию загружается в фоне, когда начинается игра, и пока её нет в памяти, разрушение не бросает осколков. Задайте в определении Shard System со своей системой, которая загружается вместе с определением. Когда система по умолчанию окажется в памяти, следующие разрушения бросают осколки как обычно.
- Когда несколько панелей разбиваются одновременно, часть осколков пропадает. Осколки стекла не используют пул обломков, поэтому Max Live Debris Pieces (
UCFBreakableSettings::MaxLiveDebrisPieces) их не ограничивает. Живые осколки всех разбитых панелей ограниченыCrushform.Glass.MaxLiveShards, по умолчанию 512. Сверх предела первыми уходят осколки самой старой разбитой панели, и они исчезают раньше срока. С поставляемыми пресетами многослойное лобовое стекло разбивается не больше чем на 12 × 5 = 60 осколков, а закалённое боковое окно — не больше чем на 16 × 4 = 64, так что около восьми многослойных лобовых стёкол доходят до предела по умолчанию. Задайте предел 0, чтобы его снять. Пул, который используют фрагменты обломков, описан в Обломках. - Выделенный сервер не показывает трещин. Так задумано. Выделенный сервер судит стекло, но ничего не рисует. Смотрите трещины на клиенте.

