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

СПРАВОЧНИКЭКТОРЫ

ACFBreakableTree

МОДУЛЬCrushformBreakableЗАГОЛОВОКCFBreakableTree.hРОДИТЕЛЬAActor

Одно физическое тело ствола на всё время его существования: стоит, гнётся, падает или согнут и зафиксирован, а в конце превращается в статическую геометрию.

Стоящий ствол — это кинематическое тело без джоинта, которое спит с BeginPlay: лес, расставленный на уровне, ничего не стоит, пока UCFPropContactComponent его не взведёт. Момент поддачи определяется углом: авторити пересекает YieldAngleDegrees и фиксирует решение, а клиент предсказывает то же пересечение и начинает падение локально, без задержки: гашение пружины привода — обычное обратимое изменение джоинта, в отличие от разорванного джоинта или перенесённой пластической цели привода. Клиент освобождает джоинт (жёсткое завершение FellAndFall) только после того, как bYielded на авторити действительно подтвердит предсказание; неподтверждённое предсказание откатывается.

Дерево также может отрисовываться скинированным мешем, который анимирует Dynamic Wind (TrunkSkinnedMesh). Это чисто визуальная часть, привязанная к тому же телу ствола: если у неё есть меш при создании или в BeginPlay, TrunkMesh скрывается и остаётся только как физическое тело и прокси коллизии, поэтому все перечисленные правила по-прежнему работают только с TrunkMesh.

Функции

AUTHORITY · сервер, на каждом инстансеLOCAL · этот инстансPURE · только чтение
UStaticMeshComponent* GetTrunkMesh() const
PUREC++ ONLY

Физическое тело ствола и прокси коллизии. Скрывается, когда TrunkSkinnedMesh рисует дерево.

UInstancedSkinnedMeshComponent* GetTrunkSkinnedMesh() const
PUREC++ ONLY

Необязательный скиннированный меш, который рисует дерево вместо TrunkMesh. Может не иметь назначенного меша.

UCFTreeConfig* GetTreeConfig() const
PUREC++ ONLY

Ассет настроек для вида дерева. Null, если не назначен.

UPhysicsConstraintComponent* GetTrunkConstraint() const
PUREC++ ONLY

Джоинт, который держит ствол в мире, пока дерево взведено.

bool IsArmed() const
LOCAL

Взвёл ли дерево ближайший автомобиль (джоинт существует и дерево симулирует физику). Локально для этого инстанса: взведение не реплицируется.

Категория
Crushform|Tree
bool IsYielded() const
PURE

Поддалось ли дерево: срубленный ствол начал падать или согнутый столб достиг упора. Реплицируется с авторити.

Категория
Crushform|Tree
bool IsSettled() const
PURE

Превратился ли ствол в статическую геометрию. Реплицируется с авторити.

Категория
Crushform|Tree
int32 GetRespawnCount() const
PURE

Количество респаунов на данный момент, с переходом через 256. Это счётчик, а не флаг, поэтому второй респаун по-прежнему является изменением, которое видят клиенты.

Категория
Crushform|Tree
bool RespawnNowOnAuthority()
AUTHORITYC++ ONLY

Только на авторити. Немедленно ставит поддавшееся дерево (упавшее, валящееся или зафиксированный столб) обратно, по пути таймера, независимо от условий респауна. Возвращает false для стоящего дерева или при вызове на инстансе, который не является авторити.

bool IsStateChangeFresh() const
PUREC++ ONLY

Достаточно ли недавнее последнее реплицированное изменение состояния (поддача или успокоение), чтобы его можно было увидеть вживую. Всегда true на авторити.

float GetDeflectionDegrees() const
PURE

Текущий угол изгиба в градусах, измеряемый по собственному живому повороту ствола — никогда не отслеживаемое отдельно значение.

Категория
Crushform|Tree
void Arm()
LOCALC++ ONLY

Локально для этого инстанса. Создаёт джоинт и начинает симулировать физику или, если уже взведено, просто отменяет ожидающий RequestDisarm(). Идемпотентен и достаточно дёшев, чтобы вызывать каждый тик для каждого дерева рядом с автомобилем. Не выполняется (один раз пишет в лог), если TreeConfig отсутствует или не проходит UCFTreeConfig::ValidateTreeConfig, и молча, пока дерево вне игры (до BeginPlay или после EndPlay из выгруженной ячейки).

void RequestDisarm()
LOCALC++ ONLY

Локально для этого инстанса. Планирует Disarm() через DisarmDelaySeconds, если что-то раньше не вызовет Arm() снова. Ничего не делает после поддачи — упавший или зафиксированный ствол никогда не превращается обратно в кинематическое тело — и вне игры, как Arm().

void UpdateBendVisual()
C++ ONLY

Записывает текущее отклонение джоинта в Custom Primitive Data каждого меша ствола для материала изгиба WPO (см. BendAmountCpdIndex и т. д.). Дёшево ничего не делает, пока не взведено.

float ComputeArmRadiusCm(float SpeedCmS, float DeltaSeconds)
C++ ONLY

Радиус в см, в пределах которого автомобиль взводит деревья вокруг себя: ArmMinRadiusCm или расстояние, которое тело проходит за DeltaSeconds (ограниченное 0.1-0.35 с) с запасом 3x, в зависимости от того, что больше. Взведение должно произойти раньше столкновения, так как невзведённое дерево — кинематическая стена.

Свойства

TObjectPtr<UStaticMeshComponent> TrunkMesh

Физическое тело ствола и прокси коллизии.

Категория
Crushform|Tree
TObjectPtr<UInstancedSkinnedMeshComponent> TrunkSkinnedMesh
Категория
Crushform|Tree
TObjectPtr<UPhysicsConstraintComponent> TrunkConstraint

Джоинт, который держит ствол в мире, пока дерево взведено.

Категория
Crushform|Tree
TObjectPtr<UCFTreeConfig> TreeConfig
Категория
Crushform|Tree
bool bYielded = false

Задаётся на авторити, когда дерево поддаётся (срубленный ствол начинает падать или согнутый столб достигает упора); реплицируется.

По умолчанию
false
Категория
Crushform|Tree
bool bSettled = false

Задаётся на авторити, когда ствол замораживается в статическую геометрию; реплицируется.

По умолчанию
false
Категория
Crushform|Tree

События

FCFOnTreeHitDynamicDelegate OnHit
(ACFBreakableTree* Tree, AActor* OtherActor, FVector Location, float DeltaVCmS)

Каждое событие срабатывает на каждом инстансе по тому, что видит сам этот инстанс, и не доставляется игроку, который подключился позже.

Категория
Crushform|Tree
FCFOnTreeHitDelegate OnHitNative
C++ ONLY
(ACFBreakableTree&, AActor*, const FVector&, float)

Нативный аналог OnHit.

FCFOnTreeYieldedDynamicDelegate OnYielded
(ACFBreakableTree* Tree, bool bPredicted)
Категория
Crushform|Tree
FCFOnTreeYieldedDelegate OnYieldedNative
C++ ONLY
(ACFBreakableTree&, bool)

Нативный аналог OnYielded.

FCFOnTreeEventDynamicDelegate OnLanded
(ACFBreakableTree* Tree)
Категория
Crushform|Tree
FCFOnTreeEventDelegate OnLandedNative
C++ ONLY
(ACFBreakableTree&)

Нативный аналог OnLanded.

FCFOnTreeEventDynamicDelegate OnSettled
(ACFBreakableTree* Tree)
Категория
Crushform|Tree
FCFOnTreeEventDelegate OnSettledNative
C++ ONLY
(ACFBreakableTree&)

Нативный аналог OnSettled.

FCFOnTreeEventDynamicDelegate OnRespawned
(ACFBreakableTree* Tree)
Категория
Crushform|Tree
FCFOnTreeEventDelegate OnRespawnedNative
C++ ONLY
(ACFBreakableTree&)

Нативный аналог OnRespawned.

FCFOnTreeEventDynamicDelegate OnYieldRolledBack
(ACFBreakableTree* Tree)
Категория
Crushform|Tree
FCFOnTreeEventDelegate OnYieldRolledBackNative
C++ ONLY
(ACFBreakableTree&)

Нативный аналог OnYieldRolledBack.