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

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

UCFHingeComponent

МОДУЛЬCrushformЗАГОЛОВОКCFHingeComponent.hРОДИТЕЛЬUSceneComponent

Шарнир навесной детали кузова: двери, капота, крышки багажника, бампера. Его Location — это штифт шарнира, а его ось Z — направление штифта, если только у него нет Mounts: тогда деталь висит на одном из них, том, что осталось целым после аварии (бампер на том креплении, которое ещё держит). Деталь — это один статический меш, прикреплённый непосредственно под ним; всё, что идёт с деталью (стекло, ручка), висит под деталью.

UCFDeformComponent решает по вмятинам вокруг детали и в её штифте, когда она начинает раскачиваться и когда отрывается; шарнир выполняет это на том инстансе, где он запущен. Локально для этого инстанса: ничто в шарнире не реплицируется.

Функции

AUTHORITY · сервер, на каждом инстансеLOCAL · этот инстансPURE · только чтение
bool InitPart()
C++ ONLY

Находит деталь (FindPart) и записывает её положение. False с предупреждением, если детали нет или их больше одной.

UStaticMeshComponent* FindPart() const
PUREC++ ONLY

Единственный статический меш, прикреплённый непосредственно под шарниром, или null, если их нет или больше одного. InitPart берёт его.

int32 GetNumPins() const
PUREC++ ONLY

Mounts.Num() или 1 для самого шарнира, если креплений нет.

FTransform GetPinTransform(int32 PinIndex) const
PUREC++ ONLY

Штифт PinIndex в мировом пространстве: трансформ крепления относительно шарнира, либо собственный трансформ шарнира. Штифт — это его ось Z. Индекс вне диапазона читает штифт 0.

float GetPinOpenAngle(int32 PinIndex) const
PUREC++ ONLY

Ход штифта PinIndex, градусы: Open Angle крепления или шарнира. Индекс вне диапазона читает штифт 0.

int32 GetActivePin() const
PUREC++ ONLY

Штифт, на котором качается деталь: тот, что передал StartSwinging; 0, пока деталь прикреплена.

float GetSwingTravel() const
PUREC++ ONLY

Сумма поворотов качания с момента StartSwinging, градусы; учитываются только повороты быстрее CFHinge::ShakeMinSpeed.

bool StartSwinging(bool bBreakable = false, int32 PinIndex = 0)
C++ ONLY

Подвешивает деталь на джоинт к телу владельца вокруг штифта PinIndex (GetNumPins; индекс вне диапазона — штифт 0). bBreakable: джоинт рвётся под Break Force или Break Torque (OnTorn), как только его взводит SetBreakable; запрашивает это только тот инстанс, который решает об отрыве. False, если деталь не прикреплена, у владельца нет симулируемого физического тела или на месте детали что-то стоит (IsPartBlocked).

void SetBreakable(bool bBreakable)
C++ ONLY

Начиная с этого момента джоинт качающейся детали рвётся под Break Force или Break Torque, либо перестаёт рваться. Джоинт взводится, когда нёс не больше UCFSettings::ArmLoadShare любой из них в течение CFHinge::ArmQuietTime (до этого IsJointArmPending). Не действует, если деталь не качается на джоинте.

void SetImpactSourceHere(const bool bSourceHere)
C++ ONLY

Сообщает шарниру, является ли этот инстанс источником удара владельца, то есть тем, который симулирует тело; компонент деформации передаёт это на каждом тике (UCFDeformComponent::SyncHingeBreakable). Только там качающаяся деталь получает толчок Bump Response: там, где тело проигрывается, его сетевые коррекции читались бы как рывки. Пока не сообщено, False.

void Detach(bool bHideAtOnce)
LOCALC++ ONLY

Позволяет детали упасть и запускает её время жизни. Локально для этого инстанса. bHideAtOnce скрывает её вместо этого: она оторвалась раньше, чем этот инстанс увидел кузов. Деталь, всё ещё стоящая на своём месте, остаётся там оторванной, пока другой автомобиль близко к месту или что-то стоит в нём (IsPartCrowded), или пока не ляжет её вырез (SetAwaitingCut), и падает, когда это отошло.

void Reattach()
C++ ONLY

Возвращает деталь туда, куда её поставил Blueprint: без джоинта, без физики, без коллизии, видимой.

float GetOpenAngle() const
PUREC++ ONLY

Угол детали вокруг активного штифта относительно места, куда её поставил Blueprint, в градусах; при открывании имеет знак Open Angle этого штифта.

bool IsPartBlocked() const
PUREC++ ONLY

Стоит ли в закрытом месте детали что-то, кроме владельца: автомобиль, всё ещё давящий на вмятину, которую он сделал, или стена. Тело, созданное для детали там, выталкивалось бы через собственное тело владельца (джоинт не даёт им касаться) и отбрасывалось бы, как только деталь оторвётся; вместо этого деталь остаётся неподвижной.

bool IsPartCrowded() const
PUREC++ ONLY

Находится ли другой автомобиль, не владелец, в пределах UCFSettings::TornPartHoldMargin от закрытого места детали или приближается ли он достаточно быстро, чтобы оказаться там в пределах TornPartHoldLookahead, либо стоит ли что-то на этом месте (IsPartBlocked): это автомобиль, который оторвал деталь и всё ещё въезжает. Деталь, отпущенная в этот момент, оказывается между двумя телами, бесконечно тяжёлыми для неё (односторонне, LoosenPart), и её выбрасывает или заклинивает в собственном кузове.

bool IsPartHeld() const
PUREC++ ONLY

Ждёт ли оторвавшаяся деталь в своём закрытом месте, чтобы упасть (Detach): пока коллизия кузова будет вырезана из этого места (SetAwaitingCut) или пока рядом с ним автомобиль (IsPartCrowded).

void SetAwaitingCut(bool bInAwaitingCut)
C++ ONLY

Удерживает оторвавшуюся деталь в закрытом месте, пока не ляжет её вырез: коллизия кузова сначала вынимает это место из кузова, поэтому деталь никогда не падает в кузов, от которого оторвалась. False позволяет ей упасть сразу, если рядом с местом нет автомобиля (IsPartCrowded).

bool IsAwaitingCut() const
PUREC++ ONLY

Ждёт ли деталь, пока ляжет её вырез (SetAwaitingCut).

void BeginDetachAfterCut()
C++ ONLY

Позволяет качающейся детали оторваться, когда ляжет её вырез: до тех пор она продолжает качаться на своём джоинте, а джоинт, порвавшийся за это время, обратно не ставится. Принимает это только качающаяся деталь; когда ляжет вырез, деталь падает с джоинта.

bool IsDetachPending() const
PUREC++ ONLY

Сохраняет ли качающаяся деталь свой джоинт, пока не ляжет её вырез (BeginDetachAfterCut).

ECFHingeState GetState() const
PURE

Где деталь находится в своём жизненном цикле: прикреплена, качается на джоинте или отделена.

Категория
Crushform|Hinge
UStaticMeshComponent* GetPart() const
PURE

Статический меш, который двигает этот шарнир; null, пока InitPart его не найдёт.

Категория
Crushform|Hinge
UPhysicsConstraintComponent* GetJoint() const
PUREC++ ONLY

Физическое ограничение, на котором висит качающаяся деталь; null, если деталь не качается.

bool IsPartHidden() const
PUREC++ ONLY

Скрыта ли деталь после того, как утонула.

FTransform GetPartReadPose() const
PUREC++ ONLY

Поза детали там, где тело владельца считывается сейчас, перенесённая на тело (CFDeform::GetBodyRootTransform): скелетный корень следует за своим телом только в собственном тике EndPhysics, а при физическом ударе отстаёт на ход кадра, и именно там вмятина раскачивает и отделяет детали. Прикреплённая деталь — из компонента, который держит корень владельца. Только что поставленная — из PlacedOnBody: при ударе движок только что переместил компонент в позу его тела, как она была задана последней, с опережением, а RideUnread возвращает её только после физики. Её собственная поза компонента, когда он следует за своим телом.

const UPrimitiveComponent* GetPartReadBody() const
PUREC++ ONLY

Тело, движение которого следует за GetPartReadPose: тело владельца или собственное тело детали, когда она следует за своим; null для детали без того и другого.

bool IsJointBreakable() const
PUREC++ ONLY

Взведён ли сейчас джоинт на разрыв. False без джоинта, а также пока взведение, запрошенное SetBreakable, ждёт, когда упадёт нагрузка.

bool IsJointArmPending() const
PUREC++ ONLY

Запрошено ли взведение джоинта и ждёт ли оно: он ещё не нёс достаточно малую нагрузку достаточно долго (SetBreakable).

bool IsImpactSourceHere() const
PUREC++ ONLY

Является ли этот инстанс источником удара владельца, как ему сообщено в последний раз (SetImpactSourceHere).

Свойства

float OpenAngle = 70.0f

Ход от места, куда Blueprint поставил деталь (закрыта), до полного открытия, в градусах вокруг оси Z шарнира. Знак задаёт сторону, в которую деталь открывается. При Mounts используется собственный Open Angle каждого крепления; этот задаёт только начальное значение для Add Mount.

По умолчанию
70.0f
Категория
Hinge
float PartMass = 20.0f

Масса детали, пока она качается или лежит свободно, кг.

По умолчанию
20.0f
Категория
Hinge
bool bOverrideDentedPartCollision = false

Переопределяет Dented Part Collision профиля для этой детали.

По умолчанию
false
Категория
Hinge
bool bDentedPartCollision = false

Сталкивается ли эта деталь, отделившись, как один выпуклый корпус своей вмятой коллизии вместо Dented Part Collision профиля. Выключено: деталь сохраняет простую коллизию своего статического меша ровно такой, как её задал ассет, без вмятины, как того требует вогнутая деталь вроде бампера. Читается при начале игры: изменение у работающего автомобиля вступает в силу, когда он появится заново.

По умолчанию
false
Категория
Hinge
float SwingThreshold = 8.0f

Самая глубокая вмятина вокруг детали, см, при которой она начинает качаться. Держите её ниже Detach Pin Threshold и не выше Detach Mean Threshold.

По умолчанию
8.0f
Категория
Hinge
float DetachMeanThreshold = 20.0f

Средняя вмятина по детали, см, которая её отрывает: деталь смята целиком, а не одной глубокой вмятиной в углу. Достижение Detach Pin Threshold вместо этого тоже её отрывает.

По умолчанию
20.0f
Категория
Hinge
float DetachPinThreshold = 30.0f

Самая глубокая вмятина в пределах Pin Radius от штифта, см, которая отрывает деталь: то, что её держит, смято. Достижение Detach Mean Threshold вместо этого тоже её отрывает. Удерживайте меньшее из двух значений ниже Max Displacement профиля и ниже Max Depth зон жёсткости вокруг детали, иначе вмятина её никогда не оторвёт (компонент пишет предупреждение в лог).

По умолчанию
30.0f
Категория
Hinge
float PinRadius = 40.0f

На каком расстоянии от штифта, см, вмятина считается вмятиной у штифта.

По умолчанию
40.0f
Категория
Hinge
float BreakForce = 9200.0f

Сила на штифт, Н, которая отрывает качающуюся деталь: автомобиль, въехавший в открытую дверь. 0 — не отрывает никогда. По умолчанию это вдвое больше измеренного значения: при 4600 Н тело 1500 кг на скорости 1 м/с оставляет тестовую дверь на месте, а при 20 км/ч отрывает её; детали настроены держаться крепче этого. Только на инстансе, который решает об отделении (у водителя или на сервере для тела без водителя); в остальных местах джоинт держит, а деталь отделяется через отрыв, который получает каждый игрок.

По умолчанию
9200.0f
Категория
Hinge
float BreakTorque = 5200.0f

Крутящий момент на штифт, Н*м, который отрывает качающуюся деталь; 0 — не отрывает никогда. Как Break Force: вдвое больше измеренных 2600 Н*м.

По умолчанию
5200.0f
Категория
Hinge
TArray<FCFHingeMount> Mounts

Точки, на которых деталь может висеть, отделившись, в пространстве шарнира: два конца бампера. Когда деталь начинает качаться, она висит на том креплении, чьё окружение вмято меньше всего (первое из равных), и качается вокруг оси Z этого крепления; вмятина у крепления, на котором она не висит, никогда её не отрывает. Если пусто: деталь качается вокруг оси Z самого шарнира на Open Angle.

Категория
Hinge
bool bOverrideSwingDamping = false

Переопределяет Swing Damping проекта для этой детали.

По умолчанию
false
Категория
Hinge
float SwingDamping = 1.0f

Затухание качания этой детали вместо Swing Damping проекта (Project Settings > Plugins > Crushform).

По умолчанию
1.0f
Категория
Hinge
bool bOverrideSwingSpring = false

Переопределяет Swing Spring проекта для этой детали.

По умолчанию
false
Категория
Hinge
float SwingSpring = 0.0f

Пружина, возвращающая эту деталь в закрытое положение, вместо Swing Spring проекта (Project Settings > Plugins > Crushform). Бамперу, висящему на одном креплении, она не нужна.

По умолчанию
0.0f
Категория
Hinge
bool bOverrideStopBounce = false

Переопределяет Stop Bounce проекта для этой детали.

По умолчанию
false
Категория
Hinge
float StopBounce = 0.0f

Отскок этой детали от концов хода вместо Stop Bounce проекта (Project Settings > Plugins > Crushform).

По умолчанию
0.0f
Категория
Hinge
bool bOverrideBumpResponse = false

Переопределяет Bump Response проекта для этой детали.

По умолчанию
false
Категория
Hinge
float BumpResponse = 0.0f

Дополнительный толчок, который эта деталь получает от рывков своего тела, вместо Bump Response проекта (Project Settings > Plugins > Crushform).

По умолчанию
0.0f
Категория
Hinge
float ShakeOffTravel = 0.0f

Сколько градусов деталь должна суммарно качнуться, чтобы её стряхнуло: бампер, висящий на одном креплении, падает на плохой дороге. Считается с начала качания, поэтому собственное открытие детали и последующие качания тоже учитываются: держите значение заметно выше Open Angle её штифтов (в два–три раза), иначе деталь отвалится на ровной дороге, как только покачается за время успокоения. Учитывается только после времени успокоения; повороты, слишком медленные для тряски (деталь, дрожащая в покое), не считаются. 0: никогда не стряхивается.

По умолчанию
0.0f
Категория
Hinge

События

FCFOnHingeTornDelegate OnTorn
C++ ONLY
(UCFHingeComponent*)

На тике после того, как джоинт качающейся детали порвался. UCFDeformComponent снимает деталь для всех.

FCFOnHingeStopHitDelegate OnStopHit
C++ ONLY
(UCFHingeComponent*, const FCFHingeStopHit&)

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

FCFOnHingeStopHitDynamicDelegate OnStopHitDynamic
(UCFHingeComponent* Hinge, const FCFHingeStopHit& Hit)

OnStopHit для Blueprint, с тем же ударом, передаётся на следующем тике таймера мира (см. On Started Swinging).

Категория
Crushform|Hinge
FCFOnHingeChangedDynamicDelegate OnStartedSwinging
(UCFHingeComponent* Hinge)

Деталь оторвалась и начинает качаться на шарнире. Срабатывает на каждом инстансе, который ведёт физику шарнира (каждый инстанс, который отрисовывает картинку, но не выделенный сервер), по тому, что сам инстанс видит; ничего из этого не реплицируется. Деталь, которую смяло и сразу отделило от места, отрывается без предварительного качания. Передаётся на следующем тике таймера мира, как On Damage Changed компонента деформации, а не внутри вызова, изменившего деталь: обработчик может починить или уничтожить автомобиль. Get State читает состояние сейчас, а позже оно может измениться.

Категория
Crushform|Hinge
FCFOnHingeDetachedDynamicDelegate OnDetached
(UCFHingeComponent* Hinge, bool bHiddenAtOnce)

Деталь оторвалась от кузова, один раз на деталь до ремонта. Где, от чего и когда, как у On Started Swinging. bHiddenAtOnce: деталь уже была оторвана, когда этот инстанс впервые увидел автомобиль (игрок, подключившийся позже, или автомобиль, который реплицируется на этот инстанс), поэтому её прячут вместо того, чтобы показывать падение: обновите то, что показывает игра, без эффекта. Это событие передаётся на первом тике таймера после BeginPlay автомобиля, поэтому Event BeginPlay может его привязать.

Категория
Crushform|Hinge
FCFOnHingeChangedDynamicDelegate OnReattached
(UCFHingeComponent* Hinge)

Качающаяся или отделённая деталь возвращается туда, куда её поставил Blueprint: ремонт, или качание, у которого на инстансе, уже не решающем отрыв, порвался джоинт (деталь остаётся на месте для всех игроков). Где, от чего и когда, как у On Started Swinging.

Категория
Crushform|Hinge