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

ПОВРЕЖДЕНИЯЗОНЫ ПОВРЕЖДЕНИЙ И СОБЫТИЯ

Зоны повреждений и события

Зоны повреждений сообщают вашей игре, насколько помята каждая сторона кузова. У кузова шесть сторон: перед, зад, левая, правая, верх и низ. Каждая сторона сообщает свою самую глубокую вмятину и свою среднюю вмятину — от 0 для неповреждённого кузова до 1 для кузова, помятого настолько, насколько он это допускает. Событие On Damage Changed срабатывает, когда меняется любая сторона, чтобы игра могла реагировать на повреждения: предупреждающая лампа, сниженная максимальная скорость, очки.

Шесть сторон. Каждая сторона — это внешняя треть кузова вдоль одной оси его корня. Перед — это +X корня, зад — -X, левая сторона — -Y, правая — +Y, верх — +Z, низ — -Z. Соседние стороны перекрываются на краях, поэтому вмятина возле угла считается для обеих сторон.

Max и Mean. Для каждой стороны Max — это самая глубокая вмятина на ней: самое большое смещение узла решётки, делённое на Max Displacement профиля и ограниченное единицей. Mean — среднее того же значения по узлам этой стороны. Оба значения лежат от 0 до 1.

Любая коробка. GetDamageInBox даёт те же два значения для коробки, которую вы выберете, например для области вокруг фары. Коробка задана в пространстве корня, в том же пространстве, что и Crush Link Box стеклянной панели.

Только подтверждённые повреждения. Зоны читают повреждения, которые подтвердил сервер. На клиенте удар, который вы предсказали, не попадает в зоны, пока сервер его не подтвердит. Поэтому событие сообщает одни и те же числа на каждом инстансе, а удар, который сервер отклонил, никогда не появляется.

Когда срабатывает событие. Событие проверяется не чаще одного раза за кадр, после того как решётка кузова изменилась. Оно срабатывает, только когда зоны отличаются от того, что оно сообщило в последний раз. Оно срабатывает на каждом инстансе, включая выделенный сервер. Ремонт вызывает его с нулями. Игрок, который подключился позже, получает его, когда реплицированные повреждения построят решётку на его инстансе.

Что нужно. Адаптеру автомобиля нужны Dirt and Dents, а профилю — Dents. Без них зоны показывают ноль, и событие никогда не срабатывает. Адаптер пробрасывает событие и оба геттера, поэтому можно привязаться к адаптеру автомобиля, не находя deform-компонент.

Зоны повреждений — не то же, что зоны жёсткости. Зоны жёсткости — это коробки, которые делают часть кузова жёстче или мягче, и Crushform.ShowZones рисует именно их. Зоны повреждений только сообщают о том, что уже произошло. О зонах жёсткости см. Мягкие зоны.

  1. Откройте Blueprint вашего автомобиля, например копию BP_VehicleAdvSedan. Выберите компонент Crushform Chaos Vehicle Adapter. Убедитесь, что Dirt and Dents включено. Поставьте вторую копию автомобиля на уровень для проверки ниже, подальше от машины, которой вы управляете.
  2. Откройте deform-профиль автомобиля и убедитесь, что Dents включено. См. Вмятины и решётку.
  3. Ничего больше создавать не нужно. Зоны берутся из решётки кузова. Следующий раздел показывает, как их читать.

В Blueprint привяжите On Damage Changed к адаптеру автомобиля. Событие передаёт шесть сторон как Zones. Разверните Zones через Break, чтобы получить Front, разверните Front, чтобы получить его Max, и выведите его. Те же пины дают остальные стороны, а вместо Max — Mean.

Граф печатает Max передней стороны при каждом срабатывании события.

Граф печатает Max передней стороны при каждом срабатывании события. Он выводит голое число без подписи: только значение, без имени стороны. Событие также доходит до каждой другой стороны через те же пины.

Из C++ привяжите лямбду к нативному событию deform-компонента и так же читайте коробку. Нативное событие срабатывает непосредственно перед событием Blueprint, с теми же зонами. Коллизия кузова следует за теми же вмятинами.

#include "CFDamageTypes.h"
#include "CFDeformComponent.h"
Deform->OnDamageChangedNative.AddLambda([](const FCFDamageZones& Zones)
{
UE_LOG(LogTemp, Log, TEXT("Front max %.2f"), Zones.Front.Max);
});
const FCFDamageValues Nose = Deform->GetDamageInBox(NoseBox); // NoseBox: an FBox in the owner's root space

Deform — это UCFDeformComponent кузова. NoseBox — это FBox в пространстве корня.

СвойствоЧто делаетПо умолчанию
UCFVehicleAdapterComponent::bDirtAndDentsВключает повреждения для машины. Выкл.: зоны показывают ноль, и событие никогда не срабатывает.Вкл.
UCFProfile::bDentsОставляют ли удары и прижатия вмятины на кузове. Выкл.: зоны никогда не меняются.Вкл.
UCFProfile::MaxDisplacementСмещение в см, которое считается полной вмятиной. Max и Mean делятся на него.60

Ни одна другая настройка не меняет зоны. Значения берутся из решётки кузова.

В любой сборке, кроме Shipping, запустите игру в редакторе. Crushform.DebugImpact никогда не бьёт по машине, которой вы управляете, потому что трассировка её пропускает. Поэтому используйте вторую копию с графом, поставленную подальше от вашей машины. Подъедьте к ней спереди и введите Crushform.DebugImpact 10 <name>, где вместо <name> подставьте часть имени вашей копии, как её показывает World Outliner. Удар попадает в точку кузова этой машины, ближайшую к её середине, если смотреть с того места, где вы стоите, поэтому спереди он попадает в переднюю часть. Событие срабатывает, и граф печатает Max передней стороны. Удар спереди должен вывести значение больше нуля.

Чтобы проверить заднюю сторону, замените в графе узел Break так, чтобы он читал Back, а не Front, затем подъедьте к копии сзади и ударьте так же. Введите Crushform.RepairAll: каждая сторона возвращается к нулю, и событие срабатывает один раз с нулями.

Из C++ на авторити CFScriptedHits::ApplyScatteredHits применяет несколько ударов в случайных точках кузова. Пресеты режима отладки используют его.

  • On Damage Changed никогда не срабатывает. Выключено Dirt and Dents у адаптера автомобиля, или выключено Dents в профиле, или у кузова нет профиля. Включите переключатели и назначьте профиль.
  • Зоны показывают ноль сразу после удара по машине. На клиенте ваш собственный удар — только предсказание, пока сервер его не подтвердит, а зоны считают только подтверждённые повреждения. Подождите ответа сервера или читайте зоны на сервере.
  • Коробка показывает ноль над видимой вмятиной. Коробка не в пространстве корня, или лежит за пределами решётки кузова, или не задана. Постройте коробку в пространстве корня владельца, том же, что и оси корня.
  • Перед и зад выглядят перепутанными. Стороны следуют осям корневого компонента, где +X — перед. Машине, чей меш смотрит в другую сторону, нужно повернуть корень, чтобы оси совпали. Проверьте поворот корня.