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

СПРАВОЧНИКПОДСИСТЕМЫ И БИБЛИОТЕКИ

UCFDebrisSubsystem

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

Клиентский пул косметических кусков обломков, разлетающихся при разрушении элементов.

Никогда не создаётся на выделенном сервере: обломки служат только для представления и не реплицируются. Куски сталкиваются с миром, целыми объектами и друг с другом, но никогда с пешками (настройка Debris Collision Profile; без неё кусок только физический, поэтому ни один trace, sweep или overlap его не находит); определение с выключенным bDebrisCollidesWithDebris заставляет свои куски игнорировать собственный тип объекта профиля. Автомобили тоже проезжают сквозь них, если только определение не задаёт bDebrisPushedByVehicles: тогда тело автомобиля толкает кусок в одну сторону, а тело без CCD сохраняет свою скорость, так как кусок не использует CCD (Chaos разрешает CCD вне one-way). Толчок длится DebrisVehicleContactSeconds определения от момента разрушения, после чего автомобили снова проезжают сквозь кусок; кусок, который всё ещё лежит на автомобиле, продолжает получать толчки, пока не сойдёт с него, поэтому он не висит там, где его оставил автомобиль, и не проваливается сквозь него. Толкаемый кусок, который лежит на автомобиле в момент начала своего погружения, уменьшается и исчезает, уезжая вместе с автомобилем, вместо того чтобы провалиться сквозь него. Толкаемый кусок, центр которого остаётся внутри автомобиля (помятый корпус, разрезанный на блоки коллизии, может зажать тонкий кусок, вдавленный в него), перестаёт ощущать автомобили и выпадает наружу. Определение того, что кусок лежит на автомобиле и что он находится внутри него, — это запрос к типу объекта Vehicle вокруг куска, поэтому учитываются только тела автомобилей с query-коллизией. Толкаемый кусок никогда не считается ударом по автомобилю: потребители ударов, например отклик на удар, его пропускают, см. GetPoolActor.

Функции

AUTHORITY · сервер, на каждом инстансеLOCAL · этот инстансPURE · только чтение
UCFDebrisSubsystem* Get(const UObject* WorldContext)
C++ ONLY

Подсистема обломков мира WorldContext; nullptr, если её нет.

bool ShouldSimulateInNetMode(ENetMode NetMode)
C++ ONLY

Симулирует ли мир в NetMode обломки: все режимы, кроме выделенного сервера.

int32 SpawnPieces(const UCFBreakableDefinition& Definition, const FTransform& UnitWorldTransform, const FCFBreakImpact& Impact, uint32 Seed, const UObject* Owner = nullptr, int32 OwnerKey = INDEX_NONE, const FVector& CarrierVelocity = FVector::ZeroVector)
C++ ONLY

Бросает запечённые части Definition из UnitWorldTransform: части рядом с Impact.Location перенимают больше скорости удара, дальние в основном опрокидываются. Seed делает бросок повторяемым. Owner и OwnerKey помечают части для ReleaseOwnedPieces; передавайте их для любого определения, чьи обломки живут до респауна. Возвращает количество созданных частей (0 — если дальше дистанции обломков от локального вида, на выделенном сервере или для определения без запекания). Каждая часть также движется со скоростью CarrierVelocity — скоростью того, что несло элемент.

void ThrowPiece(const UCFBreakableDefinition& Definition, const FVector& PieceLocation, const FCFBreakImpact& Impact, const FVector& CarrierVelocity, FRandomStream& Random, FVector& OutLinearVelocity, FVector& OutAngularVelocityDeg)
C++ ONLY

Скорости, с которыми бросается фрагмент в PieceLocation, от Impact: доля скорости удара и бросок наружу, оба тем слабее, чем дальше фрагмент от Impact.Location, плюс случайный разброс и CarrierVelocity. Вращение — случайная доля самого быстрого в определении, слабеющая так же. Берёт числа из Random в фиксированном порядке, поэтому один поток снова бросает те же фрагменты.

void ReleaseOwnedPieces(const UObject* Owner, int32 OwnerKey)
C++ ONLY

Сразу возвращает части Owner в пул, без погружения: только созданные с OwnerKey или все для INDEX_NONE.

void ReleaseAllPieces()
LOCALC++ ONLY

Каждая живая часть возвращается в пул: принадлежащие, ничьи и постоянные — все. Только на этом инстансе.

int32 GetLivePieceCount() const
PUREC++ ONLY

Сколько частей сейчас живо, включая постоянные.

int32 GetLivePersistentPieceCount() const
PUREC++ ONLY

Живые части определений, чьи обломки живут до респауна; GetLivePieceCount включает их.

int32 GetPendingVehicleContactCount() const
PUREC++ ONLY

Живые части, которые автомобили ещё толкают и толчок которых заканчивается через заданное время.

int32 GetLivePushedPieceCount() const
PUREC++ ONLY

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

void GetLivePieces(TArray<UStaticMeshComponent*>& OutPieces) const
PUREC++ ONLY

Заполняет OutPieces компонентом каждой живой части.

const AActor* GetPoolActor() const
PUREC++ ONLY

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

bool IsWithinSpawnDistance(const FVector& Location) const
PUREC++ ONLY

Лежит ли Location в пределах UCFBreakableSettings::DebrisMaxSpawnDistanceCm от наблюдателя: точки, заданной SetViewerOverride, иначе позиции вида, о которой сообщает host-объект. True, когда нет наблюдателя, от которого мерить, поэтому ничего не отбрасывается.

void SetViewerOverride(const TOptional<FVector>& InLocation)
C++ ONLY

Отсечение по дистанции измеряется от этой точки, а не от локальной камеры, пока она задана.

void SetHost(ICFBreakableHost* InHost)
C++ ONLY

Игровая сторона пула: камера, от которой измеряется отсечение по дистанции, и отклик на удар части. Не принадлежит пулу.

float ComputePieceImpactIntensity(float ImpulseMagnitude, float MassKg, float MinImpulsePerKg, float ImpulsePerKgForFullIntensity)
C++ ONLY

Сила удара по части в диапазоне [0, 1] по её импульсу и массе или -1, если удар слишком слабый для проигрывания.