参考组件
UCFDeformComponent
根组件为其模拟刚体的单个 Actor 的凹陷与漆面磨损。没有配置文件时它不做任何事,但 OnWheelSurfaceChanged 与 GetWheelSurface 既不需要配置文件,也不需要污垢网格。晶格在游戏开始时,于根组件空间中覆盖该刚体的碰撞体。
服务器持有真实晶格,并以 4x4x4 的块发布。模拟该刚体的客户端将其撞击上报给服务器,并立即作为预测绘制;其他每个客户端则绘制它所接收到的块。
函数
由谁响应此组件的 ICFDeformHost;为 null 时,取注册表中该拥有者的宿主,否则取拥有者本身。须在 BeginPlay 之前调用:组件只会从宿主读取一次其网格体和玻璃。
显式指定的宿主;否则为 UCFHostRegistry::FindHost(Owner, UCFDeformHost);若都没有,则为 null。
使本组件的两个 tick 都等待 Host 的 tick:主 tick 以及读取车轮表面的 tick。适用于在自身 tick 中构建本帧车轮接触的宿主,使本组件永远不会读取上一帧的数据。
仅限权威端:在每一端清除所有凹陷和划痕。污垢会保留,由 Wash 清除。
- 分类
- Crushform
仅限权威端:在每一端清洗掉车身上所有污垢通道(灰尘、泥浆、积雪和湿润)的污垢。凹陷会保留,由 Repair 清除。
- 分类
- Crushform
当长距离行驶留下污垢时,将车身的污垢提升至每个通道不低于这些数值(0..1)。测量方式与行驶时相同,以车轮下方的地面为基准:在地面线处最厚,并按配置文件中每个通道的形状向上逐渐变薄;溅射通道则在每个车轴周围重新变满。悬空的刚体从其底部开始测量。仅作用于本端:污垢不会通过网络传输。这是一种调试辅助手段;车轮仍会照常继续附着和脱落污垢。若此处不绘制污垢,则返回 false。它本身不发送 OnDirtChanged:下一次污垢更新会报告该变化。
在世界空间某点周围为每个通道添加 Amount 数量的污垢:在该点最厚,在 Radius(厘米)处消失。仅作用于本端:需要看到效果的每一端都应调用它。若此处不绘制污垢,则不执行任何操作。
- 分类
- Crushform|Dirt
清除世界空间某点周围所有通道的污垢:在该点清除最多,在 Radius(厘米)处完全不清除;若清除了任何污垢,则以 bPartial 触发 OnWashed。仅作用于本端:需要看到效果的每一端都应调用它。Wash 则是对整个车身进行的网络清洗。
- 分类
- Crushform|Dirt
本端车身上某世界空间点处每个通道的污垢量,范围 0..1。若此处不绘制污垢,则全部为 0。
- 分类
- Crushform|Dirt
车身每一侧上各通道的平均污垢量,与 OnDirtChanged 报告的一致。若此处不绘制污垢,则全部为 0。
- 分类
- Crushform|Dirt
车身每一侧的凹陷程度(侧面即 Get Dirt Zones 的各侧):每侧包括最深节点,以及其节点的平均值;节点位移与配置文件的 Max Displacement 之比,范围 0..1。读取自服务器已确认的损伤,因此每一端读取的结果相同:本端尚未确认的命中不计入。在车身没有晶格时,全部为 0。
- 分类
- Crushform|Damage
Box 内某点所取自的晶格节点上的损伤:Max 为这些节点中最深者与配置文件 Max Displacement 之比,Mean 为它们的平均位移与之比,两者均限制为不超过 1。Box 位于拥有者根组件的空间中,与玻璃板的 Crush Link Box 相同。在车身没有晶格、Box 未覆盖它或 Box 未设置时,全部为 0。两个角点颠倒的 Box 读取的是其两个角点所界定的盒体。
- 分类
- Crushform|Damage
调用时从宿主读取的、该 WheelIndex 对应车轮当前所接触的表面。若宿主未报告该车轮,结果中的 WheelIndex 为 INDEX_NONE。无论是否绘制污垢,均可使用。
- 分类
- Crushform|Dirt
应用以晶格空间给出的命中,如同物理在此处上报一样:在权威端作用于晶格;在模拟该刚体的客户端上,则作为预测加以上报。当本端不得对拥有者应用命中,或配置文件不允许凹陷时,返回 false。
由玩法而非物理以世界空间给出的命中,例如刚体在未直接接触的情况下破坏的道具。WorldPoint 位于车身上或其附近;WorldNormal 的指向可以是任一方向;DeltaV 单位为 m/s。适用与 ApplyLatticeHit 相同的端规则;此外,当该点位于晶格之外、命中过轻而无法形成凹陷,或配置文件不允许凹陷时,同样返回 false。
可破坏单元在 Body 之下让开了位置(Body 从不与单元发生物理接触):在车身上距 UnitPoint 最近的位置造成凹陷,力度相当于刚体朝单元方向速度的 SpeedFraction 比例。在不模拟该刚体的端上不执行任何操作(IsImpactSourceHere),此时由模拟端自身的上报携带凹陷。Body 不声明为 const,因为追踪组件本身并不是 const 操作。
仅限权威端:将一块平板压入车身,其表面经过 WorldPoint,沿 WorldDirection 方向推进(FCFLattice::ApplyPlaneCrush;Softness 单位为 cm,Bulge 为推力的比例)。不做预测:客户端会随数据块的到达看到其效果。在本端对晶格没有权威时、配置文件不允许凹陷时,以及没有任何位移发生时,返回 false。
当 OtherComp 受到撞击时会让开的质量,单位为 kg:被撞刚体及其所推动的部分、其焊接的部件、骨架的其余部分,以及它所附着的 Actor 的模拟刚体(例如车辆带关节的吊臂)。对于不会移动的刚体,即静态、运动学或未模拟的刚体,则为 0。
从刚体自身在命中中的速度变化,换算为撞向吸收相同能量的固定墙体时的速度:sqrt(1 + OwnMass / GivingWayMass),比值上限为 CF::MaxGivingWayMassRatio。没有任何物体让开时为 1。
速度变化量(cm/s)。法线 Z 分量为此值的接触,每个物理步都会给静止在其上的刚体一个仅用于支撑它的速度变化:它构成每次命中冲量的一部分,静止刚体的冲量则全部来自于此。命中每个求解器步一次,因此当物理异步 tick 时,步长为异步固定步长;否则为引擎限制后的帧步长。
Profile 为 Owner 给出的晶格:哪些网格体会形变、覆盖车身碰撞体的包围盒,以及该包围盒上的网格。当拥有者没有根组件,或没有网格体会形变时,返回 false。向 Host 请求(调用方将其绑定到拥有者的策略),因此它在 BeginPlay 之前即可工作,对于蓝图的预览 Actor 同样适用。
刚体在本端是否具有晶格,从而能够产生凹陷。没有配置文件时返回 false。
本端车身上的污垢(灰尘、泥浆、积雪和湿润);在无任何绘制的地方不进行初始化。
根部的碰撞会跟随可见晶格变化;若配置文件未改动碰撞,则不进行初始化。
此刚体被清洗的次数;会进行复制,因此客户端的计数与服务器保持一致。
晶格节点 (0, 0, 0) 在根组件空间中的位置,单位为 cm。
拥有者根空间中,覆盖形变网格体的包围盒,不含晶格的边距;在晶格构建完成之前无效。
此组件所使用的配置文件;未设置时为 null。
Crushform.Stats 为此组件打印的计数器。
本端最近应用的命中,按从旧到新排列;仅在具有调试叠加层的构建中记录。
此客户端已发送、但服务器尚未确认或拒绝的命中。
此刚体被修复的次数;会进行复制。其他世代的报告和数据块不会被应用。
此组件驱动的铰链,按部件索引排列:按名称排序,以确保每一端的编号一致。
拥有者的玻璃单元(ICFDeformHost::GetCrushformGlass),在 BeginPlay 中设置;若没有任何玻璃单元,则为 null。
本端所绘制晶格中,铰接部件周围最深的凹陷,单位为 cm;索引超出范围时为 0。
本端所绘制晶格中,铰接部件凹陷的三项度量;索引超出范围时全部为 0。
权威端在当前世代中是否已将该部件关闭。
拥有者根空间中的位置(单位 cm):部件脱落后,车身碰撞体会在此处让出空间。它是部件简单碰撞在闭合姿态下的盒体(没有简单碰撞时用其网格体的包围盒),与其玻璃板的盒体合并,再按 Collision Block Tolerance 外扩。每一端都相同,无论部件当前是否已脱落;只有在 Deform Collision 开启时,车身碰撞体才会在此处被切割。部件索引超出范围时返回无效的盒体。
撞击源是否已在当前修复代数中让该部件摆动:其消息已经复制到达,或由本机发出。
就针对其进行的判定而言,该部件是否处于关闭状态:权威端的掩码中包含它,或本端作为撞击源已将其报告为关闭。服务器会在读取报告之后发送的任何内容之前设置掩码,因此此后的命中在两端的判定结果一致。
散件的刚体是否以其凹陷碰撞的凸包代替自身形状(UpdatePartCollision);索引超出范围时为 false。
在传送拥有者之后立即调用,并传入传送前的根组件变换。摆动中的部件本身是一个独立的刚体,传送会把它留在原地,而它的关节会对所有人都把它扯下来:本函数会让每个这样的部件随刚体一起移动,并使用根组件的新速度,因此不会残留关节误差。
将晶格空间转换为世界空间,用于调试绘制。
属性
需在开始游玩之前设置:可以在类默认值中设置,也可以在 SpawnActorDeferred 与 FinishSpawning 之间设置。
- 分类
- Crushform
事件
本机的污垢发生了移动:报告车身各侧的平均值,每个 Dirt Event Interval 最多报告一次,并且仅当某一侧的变化超过 Dirt Event Threshold 时才报告。在不绘制污垢的端上从不触发。AddDirt、WashAt、Wash 和 FillDirt 造成的变化,由下一次污垢更新报告。
- 分类
- Crushform|Dirt
本机的污垢被冲掉:对于 WashAt 为 bPartial,对于整车清洗则不是。在不绘制污垢的端上从不触发。
- 分类
- Crushform|Dirt
车轮的 PhysicalMaterial 或接地状态自上次报告以来发生了变化,以及车轮首次出现时触发:在非专用服务器的端上每帧检查,无论是否绘制污垢。仅 SurfaceSpeed 变化不会触发,事件携带的是当前的 SurfaceSpeed。空中车轮报告的 PhysicalMaterial 为 null,因此车轮在空中时材质变化不会触发任何事件。仅针对宿主指定的车轮(FCFWheelContact::WheelIndex)。
- 分类
- Crushform|Dirt
本机的损伤发生了变化:Get Damage Zones 的结果与最近一次事件携带的内容不同。每帧最多读取一次,且在晶格变化之后读取,所有端(包括专用服务器)都是如此,读取的是服务器确认过的损伤:本机预测的命中在服务器确认之前不会触发任何事件。修复时以全零数据触发该事件;中途加入的玩家会在复制的区块构建出晶格后收到该事件。世界暂停时,会等到第一个未暂停的帧再读取。第一个事件之前的状态,请通过 Get Damage Zones 读取。
- 分类
- Crushform|Damage
供 C++ 使用的 OnDamageChanged:会在它之前立即广播,并携带相同的区域。