跳转到内容
CRUSHFORMV1.1.0
在 Fab 上获取

参考组件

UCFHingeComponent

模块Crushform头文件CFHingeComponent.h父类USceneComponent

车身某部件的铰链:车门、引擎盖、尾门、保险杠。其位置为铰链销轴,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,或铰链的 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:一旦经 SetBreakable 激活,关节便会在 Break Force 或 Break Torque 作用下撕裂(OnTorn);只有决定脱落的那一端才会请求此项。若部件未附着、拥有者没有参与模拟的物理刚体,或部件原位置被其他物体占据(IsPartBlocked),则返回 false。

void SetBreakable(bool bBreakable)
C++ ONLY

此后,摆动部件的关节将在 Break Force 或 Break Torque 作用下撕裂,或者不再撕裂。关节承受的任一载荷都不超过 UCFSettings::ArmLoadShare 的比例,并持续 CFHinge::ArmQuietTime 时长后,关节即被激活(在此之前处于 IsJointArmPending 状态)。除非部件通过关节摆动,否则此设置无效。

void SetImpactSourceHere(const bool bSourceHere)
C++ ONLY

告知铰链本机是否为其拥有者的撞击源(即模拟车身的那一端);形变组件每个 tick 都会传递此信息(UCFDeformComponent::SyncHingeBreakable)。只有在撞击源上,摆动部件才会获得 Bump Response 的推动:在回放车身的端上,其网络修正会被感知为颠簸。在被告知之前为 false。

void Detach(bool bHideAtOnce)
LOCALC++ ONLY

让部件掉落,并开始计算它的存活时间。仅作用于本机。bHideAtOnce 则改为将其隐藏:它在本机看到车身之前就已脱落。仍在原位的部件会保持在那里,处于脱落状态,只要有另一辆车靠近该位置,或有东西位于其中(IsPartCrowded),或直到它的切割落地(SetAwaitingCut),待这些都消除后再掉落。

void Reattach()
C++ ONLY

将部件放回蓝图放置它的位置:无关节、无物理、无碰撞,且可见。

float GetOpenAngle() const
PUREC++ ONLY

部件相对于蓝图放置位置、绕当前激活销的角度,单位为度;打开过程中其符号与该销的 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

该铰链所移动的静态网格体;在 InitPart 找到它之前为 null。

分类
Crushform|Hinge
UPhysicsConstraintComponent* GetJoint() const
PUREC++ ONLY

摆动部件所挂靠的物理约束;除非部件正在摆动,否则为 null。

bool IsPartHidden() const
PUREC++ ONLY

部件下沉后是否已被隐藏。

FTransform GetPartReadPose() const
PUREC++ ONLY

部件在当前拥有者车身上读取到的姿态,并被映射到车身上(CFDeform::GetBodyRootTransform):骨骼根节点只在其自身的 EndPhysics tick 中跟随其刚体,在物理命中中则会落后一帧的位移,凹陷正是在此时使部件摆动并脱落。已附着时,取自根节点所持有的组件。刚放置时,取自 PlacedOnBody:在命中中,物理引擎刚把组件移动到车身上次设定的姿态,并领先一步,而 RideUnread 只在物理计算之后才将其拉回。若部件已跟随其自身的刚体,则取其组件自身的姿态。

const UPrimitiveComponent* GetPartReadBody() const
PUREC++ ONLY

GetPartReadPose 所跟随运动的刚体:拥有者的刚体;若部件已跟随其自身的刚体,则为部件自身的刚体;两者都没有的部件,为 null。

bool IsJointBreakable() const
PUREC++ ONLY

关节当前是否已激活,可以撕裂。没有关节时为 false;在 SetBreakable 请求的激活等待载荷下降期间,同样为 false。

bool IsJointArmPending() const
PUREC++ ONLY

关节是否已被请求激活并处于等待中:它尚未在足够长的时间内承受足够小的载荷(SetBreakable)。

bool IsImpactSourceHere() const
PUREC++ ONLY

本机是否为拥有者的撞击源,取最近一次被告知的结果(SetImpactSourceHere)。

属性

float OpenAngle = 70.0f

从蓝图放置部件的位置(闭合)到完全打开的行程,单位为度,绕铰链的 Z 轴。其符号决定部件向哪一侧打开。使用 Mounts 时,采用每个安装点自身的 Open Angle;此项仅作为 Add Mount 的初始值。

默认值
70.0f
分类
Hinge
float PartMass = 20.0f

部件在摆动或处于松脱状态时的质量,单位 kg。

默认值
20.0f
分类
Hinge
bool bOverrideDentedPartCollision = false

覆盖该部件的配置文件中的 Dented Part Collision 设置。

默认值
false
分类
Hinge
bool bDentedPartCollision = false

部件松脱后,是否以其凹陷碰撞体中的一个凸包进行碰撞,以代替配置文件中的 Dented Part Collision。关闭时,部件保留静态网格体资产中原有的简单碰撞,不做凹陷处理,这正是保险杠等凹形部件所需要的。在开始游玩时读取:对正在运行的车辆所做的更改,要等其再次生成后才会生效。

默认值
false
分类
Hinge
float SwingThreshold = 8.0f

部件周围最深的凹陷深度(cm),达到此深度时部件开始摆动。应保持低于 Detach Pin Threshold,且不超过 Detach Mean Threshold。

默认值
8.0f
分类
Hinge
float DetachMeanThreshold = 20.0f

使部件脱落的部件平均凹陷深度(cm):即部件作为整体被压坏,而非某个角落的单个深凹陷。达到 Detach Pin Threshold 同样会使其脱落。

默认值
20.0f
分类
Hinge
float DetachPinThreshold = 30.0f

在销的 Pin Radius 范围内最深的凹陷深度(cm),会使部件脱落:即固定部件的结构被压坏。达到 Detach Mean Threshold 同样会使其脱落。两者中较小的值应保持低于配置文件中的 Max Displacement,并低于部件周围刚度区域的 Max Depth,否则凹陷永远无法使部件脱落(组件会输出警告)。

默认值
30.0f
分类
Hinge
float PinRadius = 40.0f

凹陷距离销多远(cm)时,才算作销处的凹陷。

默认值
40.0f
分类
Hinge
float BreakForce = 9200.0f

作用在销上、会撕脱摆动部件的力,单位 N:例如车辆撞上敞开的车门。为 0 时永不撕脱。默认值为实测值的两倍:在 4600 N 的力下,质量 1500 kg、以 1 m/s 速度撞击的车身仍会让测试车门保持附着,而以 20 km/h 的速度撞击则会将其撕下;部件的调校使其能承受比这更大的力。仅在决定脱落的端上生效(驾驶者的端,或无人驾驶车身的服务器);在其他端上,关节保持不变,部件则通过每位玩家都会收到的脱落过程而脱落。

默认值
9200.0f
分类
Hinge
float BreakTorque = 5200.0f

作用在销上、会撕脱摆动部件的力矩,单位 N*m;为 0 时永不撕脱。同 Break Force:为实测 2600 N*m 的两倍。

默认值
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*)

在摆动部件的关节撕裂之后的下一个 tick 触发。UCFDeformComponent 会为所有人使该部件脱落。

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

在摆动部件被观察到撞上行程末端的那个 tick 触发:即关节的止动件,位于部件与其自身车身相接的闭合端(关节使二者不会接触,因此不会有接触事件报告它)。仅作用于本机:在运行该铰链物理的每一端上都会根据其各自的摆动而触发,且其中任何内容都不会被复制。

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

面向蓝图的 OnStopHit,同一次撞击,在世界的下一个计时器 tick 时发出(见 On Started Swinging)。

分类
Crushform|Hinge
FCFOnHingeChangedDynamicDelegate OnStartedSwinging
(UCFHingeComponent* Hinge)

部件松脱,开始在铰链上摆动。在每台运行铰链物理的端上触发(即每台会绘制画面的端,专用服务器除外),依据该端自身看到的情况,任何内容都不复制。被直接压碎并从原位脱落的部件,不经摆动就直接脱落。与 On Damage Changed 相同,在世界的下一个计时器 tick 时发出,而不在改变部件的调用内发出:处理函数可能会修复或摧毁车辆。Get State 读取的是当前状态,之后的改动可能已经变化。

分类
Crushform|Hinge
FCFOnHingeDetachedDynamicDelegate OnDetached
(UCFHingeComponent* Hinge, bool bHiddenAtOnce)

部件从车身上脱落,每个部件在修复前只触发一次。位置、来源和时机同 On Started Swinging。bHiddenAtOnce:该端第一次看到这辆车时,部件已经脱落(中途加入的玩家,或正在复制到本端的车辆),因此直接隐藏,而不是看到它下落:更新游戏中的显示即可,不播放特效。这一事件会在车辆 BeginPlay 之后的第一个计时器 tick 时发出,因此 Event BeginPlay 可以绑定它。

分类
Crushform|Hinge
FCFOnHingeChangedDynamicDelegate OnReattached
(UCFHingeComponent* Hinge)

正在摆动或已脱落的部件回到蓝图放置的位置:修复,或摆动的关节在不再决定脱落的端上断开(部件对所有玩家都保持在位)。位置、来源和时机同 On Started Swinging。

分类
Crushform|Hinge