МИРРАЗРУШАЕМЫЕ ДЕРЕВЬЯ И СТОЛБЫ
Разрушаемые деревья и столбы
Что это делает
Заголовок раздела «Что это делает»Разрушаемое дерево — это ствол, который автомобиль может повалить. Въедьте в дерево, и оно согнётся. Дотолкните его за угол поддачи, и оно либо упадёт и останется лежать там, где приземлилось, либо, если это столб, согнётся и так и останется наклонённым. Через некоторое время оно снова встаёт.
Как это работает
Заголовок раздела «Как это работает»Дерево — это эктор ACFBreakableTree. У него одно физическое тело, ствол, и один джоинт, который держит ствол у земли. Джоинт удерживает ствол пружиной привода и, для столба, жёстким упором. Пока автомобиль не подъехал близко, ствол остаётся в спящем состоянии и ничего не стоит: уровень с множеством деревьев дёшев, пока машины далеко.
- Взведение. Автомобиль с компонентом
CF_PropContactвзводит деревья вокруг себя. Ствол начинает симулироваться, и создаётся джоинт. Тело, которое спит и движется медленнее, чемUCFPropContactComponent::TreeArmMinSpeedCmS(по умолчанию 5 см/с), ничего не взводит, поэтому его деревья отдыхают. Невзведённое дерево остаётся кинематической стеной, которая всё равно блокирует автомобиль. - Поддача. Когда ствол наклоняется дальше
UCFTreeConfig::YieldAngleDegrees(по умолчанию 15 градусов), дерево поддаётся. Что будет дальше, зависит от Yield Mode вида:- Fell and Fall (
FellAndFall): джоинт отпускает ствол наReleaseAngleDegrees(65 градусов), и ствол падает свободно. - Bend and Lock (
BendAndLock): ствол останавливается наStopAngleDegrees(45 градусов) и сохраняет наклон. Столб относится к этому виду.
- Fell and Fall (
- Приземление. Отпущенный ствол, который ударяется о землю со скоростью
LandMinDeltaVCmS(80 см/с) или больше, считается приземлившимся. - Успокоение. Ствол замирает и становится статической геометрией там, где лежит.
- Респаун. Через
RespawnDelaySeconds(по умолчанию 300 с) дерево снова встаёт, уходя в землю заRespawnSinkSeconds(3 с). Оно ждёт, пока ни один игрок не окажется ближеRespawnClearRadiusCm(4000 см), на его месте не будет стоять тело изRespawnBlockingObjectTypes, и, если включеноbRespawnOnlyWhenUnseen, ни одна камера на него не смотрит.
Упавший ствол блокирует автомобили на VehiclePassThroughDelaySeconds (1 с), после чего машины проезжают сквозь него, если только не включено bFallenTrunkCollidesWithVehicles. События дерева — удар, поддача, приземление, успокоение и респаун — срабатывают на каждом инстансе по тому, что видит каждый инстанс. Игрок, который подключился позже, не получает уведомления о событии, которое уже произошло.
| Crushform | ||
|---|---|---|
| Tree | ||
| Trunk Mesh | TrunkMesh | |
| Trunk Skinned Mesh | TrunkSkinnedMesh | |
| Trunk Constraint | TrunkConstraint | |
| Tree Config | DA_CF_Tree | |
Ассет данных Tree Config дерева хранит вид. Дерево без конфига, или с конфигом, который не проходит проверки, отказывается взводиться.
Настройка
Заголовок раздела «Настройка»Здесь используются поставляемые деревья на Proving Ground. Чтобы сделать свой вид, см. шаг 3.
- В Content Browser поставляемые деревья лежат в Plugins › Crushform Content › Trees.
- Перетащите
BP_CF_Tree(дерево, которое падает) илиBP_CF_Pole(столб, который гнётся и фиксируется) на свой уровень. Оба — размещённые экторы с Tree Config, заданным на ассет данных своего вида:DA_CF_TreeилиDA_CF_Pole. - Для своего вида в Content Browser выберите Add › Miscellaneous › Data Asset, укажите класс CFTree Config и назовите его. Задайте Mass Kg, Yield Mode и углы, как в таблице основных настроек ниже.
| Crushform | ||
|---|---|---|
| Tree | ||
| Mass Kg | 900.0 | |
| Yield Mode | ||
| Yield | ||
| Yield Angle Degrees | 15.0 | |
| Felling | ||
| Felling Drive Fade Seconds | 0.01 | |
| Felling Damping Strength | 50000000.0 | |
| Release Angle Degrees | 65.0 | |
| Vehicle Pass Through Delay Seconds | 1.0 | |
| Stop Angle Degrees | 45.0 | |
| Bend and Lock Lock Strength Multiplier | 100.0 | |
- Выделите дерево на уровне. В панели Details, в разделе Crushform › Tree, задайте Tree Config равным вашему ассету данных.
- Убедитесь, что у автомобиля, который должен валить дерево, на адаптере включено Breaks Props, — по умолчанию оно включено. Адаптер тогда создаёт компонент
CF_PropContact.
Использование
Заголовок раздела «Использование»В вашем проекте Blueprint может реагировать на дерево. График привязывает обработчик к On Yielded при начале игры для дерева. Обработчик выводит сообщение каждый раз, когда дерево поддаётся.
То же в C++ использует нативные делегаты. У каждого события есть двойник ...Native, на который может подписаться C++-слушатель:
#include "CFBreakableTree.h"
void ListenToTree(ACFBreakableTree* Tree){ if (IsValid(Tree)) { Tree->OnYieldedNative.AddLambda([](ACFBreakableTree& Yielded, bool bPredicted) { UE_LOG(LogTemp, Log, TEXT("%s yielded, predicted: %d"), *Yielded.GetName(), bPredicted); }); }}Блоку C++ нужен модуль CrushformBreakable в вашем Build.cs. Список модулей есть на странице Установка. Заголовок объявляет FCFOnTreeYieldedDelegate OnYieldedNative как ACFBreakableTree& Tree, bool bPredicted. Запросы состояния — IsArmed(), IsYielded(), IsSettled(), GetRespawnCount() и GetDeflectionDegrees(), все const.
Основные настройки
Заголовок раздела «Основные настройки»Настройки вида находятся в UCFTreeConfig. В его панели Details они лежат в группе Crushform › Tree, в подгруппах Yield, Felling, Drive, Vehicles, Events, Feedback и Respawn. Значения по умолчанию — от плагина, поэтому новый конфиг начинается с них.
| Свойство | Что делает | По умолчанию |
|---|---|---|
UCFTreeConfig::MassKg | Масса ствола. Главный рычаг того, как автомобиль ощущается при толчке. | 900 |
UCFTreeConfig::YieldMode | FellAndFall роняет ствол. BendAndLock останавливает его на угле остановки и сохраняет наклон. | FellAndFall |
UCFTreeConfig::YieldAngleDegrees | Наклон в градусах, после которого дерево поддаётся. | 15 |
UCFTreeConfig::ReleaseAngleDegrees | Только для Fell and Fall: наклон, при котором джоинт отпускает ствол. | 65 |
UCFTreeConfig::StopAngleDegrees | Только для Bend and Lock: упор, до которого сгибается столб. | 45 |
UCFTreeConfig::DrivePositionStrength | Пружина, которая держит ствол прямо внутри его конуса. Не должна быть нулевой. | 5.0e8 |
UCFTreeConfig::bFallenTrunkCollidesWithVehicles | Продолжает ли упавший ствол блокировать автомобили. Выключено — пропускает их после задержки прохода. | false |
UCFTreeConfig::VehiclePassThroughDelaySeconds | Только для Fell and Fall: сколько падающий ствол ещё блокирует автомобили. | 1 |
UCFTreeConfig::HitMinDeltaVCmS | Наименьшее изменение скорости в см/с, которое считается ударом. | 30 |
UCFTreeConfig::RespawnDelaySeconds | Сколько срубленное или согнутое дерево остаётся лежать. 0 означает, что оно никогда не вернётся. | 300 |
UCFTreeConfig::RespawnClearRadiusCm | Респаун не происходит, пока игрок ближе этого, в см. | 4000 |
UCFTreeConfig::RespawnBlockingObjectTypes | Тела этих типов объектов на месте дерева не дают ему встать. | ECC_Vehicle, ECC_Pawn, ECC_PhysicsBody |
UCFTreeConfig::bRespawnOnlyWhenUnseen | Респаун не происходит, пока камера игрока смотрит на дерево. | true |
UCFTreeConfig::HitFeedbackTag | Тег удара, который проигрывается при ударе. Пусто — проигрывается Crushform.Impact.Tree.Hit плагина. | пусто |
UCFTreeConfig::YieldFeedbackTag | Тег удара для поддачи. Пусто — проигрывается Crushform.Impact.Tree.Break или Crushform.Impact.Tree.Bend плагина. | пусто |
UCFTreeConfig::LandFeedbackTag | Тег удара для приземления. Пусто — проигрывается Crushform.Impact.Tree.Land плагина. | пусто |
UCFBreakableSettings::TreeCollisionProfile | Профиль коллизии ствола. Автомобили должны его блокировать. | None (используется Destructible) |
UCFBreakableSettings::TreeWheelTraceChannel | Канал, по которому колёса автомобиля трассируют землю. | ECC_WorldDynamic |
UCFBreakableSettings::RespawnCheckIntervalSeconds | Как часто поддавшееся дерево проверяет, может ли оно встать, в секундах. | 5 |
Настройки проекта находятся в Project Settings › Plugins › Crushform Breakable, в группах Trees и Respawn.
Проверка работы
Заголовок раздела «Проверка работы»В любой сборке, кроме Shipping, откройте консоль клавишей тильда.
stat CrushformBreakableпоказывает циклы Breakable Tree Tick и Breakable Tree Trunk Hit. Они двигаются, пока автомобиль рядом с деревом.- Въедьте автомобилем в
BP_CF_Tree. Ствол согнётся, пройдёт угол поддачи и упадёт. Въедьте вBP_CF_Pole: он согнётся и останется наклонённым. - Для быстрой проверки респауна задайте
RespawnDelaySecondsв своём конфиге равным нескольким секундам. Дерево встанет, когда ни один игрок не окажется в его радиусе очистки и ни одна камера его не увидит.
Если дерево остаётся стоять, когда в него врезается автомобиль, см. первую запись ниже, в разделе «Устранение неполадок».
Устранение неполадок
Заголовок раздела «Устранение неполадок»Дерево никогда не гнётся
Заголовок раздела «Дерево никогда не гнётся»Причина. У дерева нет Tree Config, или его конфиг не проходит проверки. Тогда дерево отказывается взводиться и один раз пишет одну строку в лог:
Tree %s has no TreeConfig assigned, refusing to armили, для конфига, который не проходит UCFTreeConfig::ValidateTreeConfig:
Tree %s has an invalid TreeConfig (%s), refusing to armРешение. Задайте Tree Config на дереве на уровне. Если появилась вторая строка, её текст называет неверное значение. Исправьте его в ассете данных и запустите уровень заново.
Автомобиль останавливается у дерева, а дерево никогда не гнётся
Заголовок раздела «Автомобиль останавливается у дерева, а дерево никогда не гнётся»Причина. У автомобиля нет компонента CF_PropContact, потому что Breaks Props выключен на его адаптере. Никто не взводит дерево, поэтому оно остаётся кинематической стеной, которая останавливает машину. Компонент контакта взводит дерево, только пока его тело бодрствует или движется быстрее TreeArmMinSpeedCmS (по умолчанию 5 см/с).
Решение. Включите Breaks Props на адаптере автомобиля. Адаптер тогда создаёт CF_PropContact, который взводит деревья, к которым подъезжает машина.
Упавший ствол блокирует автомобиль, или дерево никогда не возвращается
Заголовок раздела «Упавший ствол блокирует автомобиль, или дерево никогда не возвращается»Причина. Упавший ствол блокирует автомобили, пока включён bFallenTrunkCollidesWithVehicles, и в течение VehiclePassThroughDelaySeconds после поддачи Fell and Fall. Дерево с RespawnDelaySeconds, равным 0, никогда не возвращается. Дерево возвращается, только когда ни один игрок не находится в его радиусе очистки, на его месте не стоит объект из блокирующих типов и, при включённом bRespawnOnlyWhenUnseen, ни одна камера на него не смотрит.
Решение. Выключите bFallenTrunkCollidesWithVehicles, чтобы машины проезжали сквозь ствол после истечения задержки. Для респауна задайте RespawnDelaySeconds больше нуля и уберите игрока или блокирующий объект с места дерева.
Ствол ведёт себя как стена
Заголовок раздела «Ствол ведёт себя как стена»Причина. UCFTreeConfig::DrivePositionStrength слишком жёсткий. Комментарии в конфиге говорят, что слишком сильный привод делает ствол неподвижной стеной, которую ни один автомобиль не сдвинет. DriveVelocityStrength должен оставаться примерно на уровне одной десятой от него.
Решение. Уменьшите DrivePositionStrength и держите DriveVelocityStrength примерно на одной десятой от него. Затем толкните дерево на уровне и проверьте, что оно стоит само по себе.
Другие системы мира описаны на страницах Заборы и объекты и Отклик на удары.