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

МИРРАЗРУШАЕМЫЕ ДЕРЕВЬЯ И СТОЛБЫ

Разрушаемые деревья и столбы

Разрушаемое дерево — это ствол, который автомобиль может повалить. Въедьте в дерево, и оно согнётся. Дотолкните его за угол поддачи, и оно либо упадёт и останется лежать там, где приземлилось, либо, если это столб, согнётся и так и останется наклонённым. Через некоторое время оно снова встаёт.

Седан валит дерево: ствол сгибается и падает.
Столб сгибается под седаном и остаётся наклонённым.

Дерево — это эктор ACFBreakableTree. У него одно физическое тело, ствол, и один джоинт, который держит ствол у земли. Джоинт удерживает ствол пружиной привода и, для столба, жёстким упором. Пока автомобиль не подъехал близко, ствол остаётся в спящем состоянии и ничего не стоит: уровень с множеством деревьев дёшев, пока машины далеко.

  • Взведение. Автомобиль с компонентом CF_PropContact взводит деревья вокруг себя. Ствол начинает симулироваться, и создаётся джоинт. Тело, которое спит и движется медленнее, чем UCFPropContactComponent::TreeArmMinSpeedCmS (по умолчанию 5 см/с), ничего не взводит, поэтому его деревья отдыхают. Невзведённое дерево остаётся кинематической стеной, которая всё равно блокирует автомобиль.
  • Поддача. Когда ствол наклоняется дальше UCFTreeConfig::YieldAngleDegrees (по умолчанию 15 градусов), дерево поддаётся. Что будет дальше, зависит от Yield Mode вида:
    • Fell and Fall (FellAndFall): джоинт отпускает ствол на ReleaseAngleDegrees (65 градусов), и ствол падает свободно.
    • Bend and Lock (BendAndLock): ствол останавливается на StopAngleDegrees (45 градусов) и сохраняет наклон. Столб относится к этому виду.
  • Приземление. Отпущенный ствол, который ударяется о землю со скоростью LandMinDeltaVCmS (80 см/с) или больше, считается приземлившимся.
  • Успокоение. Ствол замирает и становится статической геометрией там, где лежит.
  • Респаун. Через RespawnDelaySeconds (по умолчанию 300 с) дерево снова встаёт, уходя в землю за RespawnSinkSeconds (3 с). Оно ждёт, пока ни один игрок не окажется ближе RespawnClearRadiusCm (4000 см), на его месте не будет стоять тело из RespawnBlockingObjectTypes, и, если включено bRespawnOnlyWhenUnseen, ни одна камера на него не смотрит.

Упавший ствол блокирует автомобили на VehiclePassThroughDelaySeconds (1 с), после чего машины проезжают сквозь него, если только не включено bFallenTrunkCollidesWithVehicles. События дерева — удар, поддача, приземление, успокоение и респаун — срабатывают на каждом инстансе по тому, что видит каждый инстанс. Игрок, который подключился позже, не получает уведомления о событии, которое уже произошло.

Crushform
Tree
Trunk MeshTrunkMesh
Trunk Skinned MeshTrunkSkinnedMesh
Trunk ConstraintTrunkConstraint
Tree ConfigDA_CF_Tree
Группа Crushform Tree размещённого дерева, где Tree Config задан как DA_CF_Tree.

Ассет данных Tree Config дерева хранит вид. Дерево без конфига, или с конфигом, который не проходит проверки, отказывается взводиться.

Здесь используются поставляемые деревья на Proving Ground. Чтобы сделать свой вид, см. шаг 3.

  1. В Content Browser поставляемые деревья лежат в Plugins › Crushform Content › Trees.
  2. Перетащите BP_CF_Tree (дерево, которое падает) или BP_CF_Pole (столб, который гнётся и фиксируется) на свой уровень. Оба — размещённые экторы с Tree Config, заданным на ассет данных своего вида: DA_CF_Tree или DA_CF_Pole.
  3. Для своего вида в Content Browser выберите Add › Miscellaneous › Data Asset, укажите класс CFTree Config и назовите его. Задайте Mass Kg, Yield Mode и углы, как в таблице основных настроек ниже.
Crushform
Tree
Mass Kg900.0
Yield ModeFell And Fall
Yield
Yield Angle Degrees15.0
Felling
Felling Drive Fade Seconds0.01
Felling Damping Strength50000000.0
Release Angle Degrees65.0
Vehicle Pass Through Delay Seconds1.0
Stop Angle Degrees45.0
Bend and Lock Lock Strength Multiplier100.0
Группа Tree ассета DA_CF_Tree с раскрытыми группами Yield и Felling.
  1. Выделите дерево на уровне. В панели Details, в разделе Crushform › Tree, задайте Tree Config равным вашему ассету данных.
  2. Убедитесь, что у автомобиля, который должен валить дерево, на адаптере включено Breaks Props, — по умолчанию оно включено. Адаптер тогда создаёт компонент CF_PropContact.

В вашем проекте Blueprint может реагировать на дерево. График привязывает обработчик к On Yielded при начале игры для дерева. Обработчик выводит сообщение каждый раз, когда дерево поддаётся.

График привязывает обработчик к 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::YieldModeFellAndFall роняет ствол. 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 примерно на одной десятой от него. Затем толкните дерево на уровне и проверьте, что оно стоит само по себе.

Другие системы мира описаны на страницах Заборы и объекты и Отклик на удары.