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

参考组件

UCFGlassUnitsComponent

模块Crushform头文件CFGlassUnitsComponent.h父类UCFBreakableUnitsComponent

Crushform 车身的玻璃:拥有者的每个 UCFGlassComponent 都是一个两级单元(开裂、破碎),按名称编号,以使所有端保持一致。裂纹与等级一同复制;负责绘制的端会将其写入每块玻璃板的 Custom Primitive Data 中,通过隐藏来显示已破碎的玻璃板,并播放开裂与破碎的反馈。

函数

AUTHORITY · 服务器,每个端LOCAL · 本机PURE · 只读
bool ShouldDrawInNetMode(ENetMode NetMode)
C++ ONLY

本机是否绘制玻璃:裂纹、碎片和声音。在专用服务器上为 false。

void InitPanes(UCFDeformComponent& InDeform)
C++ ONLY

InDeform 的 BeginPlay:按名称为拥有者的玻璃板编号,映射跟随件和车门部件,读取它们的包围盒,并写入其数据。

bool HasPanes() const
PUREC++ ONLY

拥有者是否有任何玻璃板。

void ResetForGeneration(uint8 InGeneration)
C++ ONLY

任一端:较新的 Crushform 版本会将每块玻璃板恢复完整,并丢弃旧版本的所有裂纹。

bool ApplyVerdictOnAuthority(int32 UnitIndex, const FCFGlassVerdict& Verdict, uint16 SourceSeq, uint8 ResponseIndex = CFBreakable::NoResponse)
AUTHORITYC++ ONLY

权威端:根据判定结果提高玻璃板的等级,并记录其裂纹。若玻璃板的等级或裂纹发生变化,则为 true。

bool PredictVerdict(int32 UnitIndex, const FCFGlassVerdict& Verdict, uint16 Seq, uint8 ResponseIndex = CFBreakable::NoResponse)
C++ ONLY

撞击源:立即显示判定结果,并等待权威端;Seq 为携带该结果的报告。若有任何变化,则为 true。

void OnReportsRejected(TConstArrayView<uint16> Seqs)
C++ ONLY

权威端拒绝了这些报告:它们预测过的每块玻璃板立即恢复。

void JudgeOnAuthority(const FCFLattice& Lattice, const FCFHitInput* Hit, uint32 ReachedChunks, uint16 SourceSeq, bool bLatticeChanged)
C++ ONLY

权威端在将一次命中应用到晶格之后调用(Hit 为 null 时表示没有接触点的挤压,仅针对框架)。ReachedChunks:命中所及的每个区块对应的位 c(CFGlass::ToChunkMask)。SourceSeq:当前正在判定的报告,权威端自身的命中为 0。bLatticeChanged:命中是否移动了晶格;只有此时才会判定框架,因此旧凹陷永远不会被再次判定。

bool JudgePredicted(const FCFLattice& Lattice, const FCFHitInput& Hit, uint32 ReachedChunks, uint16 Seq, bool bLatticeChanged)
C++ ONLY

撞击源,基于解码后的报告以及随之绘制的晶格。只要任何玻璃板发生变化即为 true:该报告必须丢弃。

UCFGlassComponent* GetPane(int32 UnitIndex) const
PURE

单元的玻璃板组件;对于没有玻璃板的索引,为 null。

分类
Crushform|Glass
int32 FindPane(const UPrimitiveComponent* Primitive) const
PUREC++ ONLY

Primitive 本身所对应的玻璃板,或以 Primitive 为跟随件的玻璃板;否则为 INDEX_NONE。

const CFGlass::FPaneShape* GetPaneShape(int32 UnitIndex) const
PUREC++ ONLY

用于判定命中的玻璃板所在位置;对于没有玻璃板的索引,为 null。

int32 GetPanePart(int32 UnitIndex) const
PUREC++ ONLY

玻璃板所悬挂部件的铰链索引;位于车身上时为 INDEX_NONE。

bool IsPaneJudged(int32 UnitIndex) const
PUREC++ ONLY

Crushform 是否可以判定该玻璃板:它有定义且形状有效,并且其所属部件未脱落(UCFDeformComponent::IsPartOffOrReportedOff)。

FTransform GetPaneWorldTransform(int32 UnitIndex) const
PUREC++ ONLY

玻璃板当前所在的位置:车身的读取姿态,或其部件的读取姿态(UCFHingeComponent::GetPartReadPose)。

TArray<FCFGlassCrack, TInlineAllocator<CFGlass::MaxCracksPerPane>> GetDrawnCracks(int32 UnitIndex) const
PUREC++ ONLY

本机在玻璃板上绘制的裂纹:本版本权威端的裂纹,每条都会被距其 1 cm 以内的自身预测替换(预测的扩展,且不小于权威端的裂纹),然后是其他预测;至多 MaxCracksPerPane 条。

bool BuildShardSpawn(int32 UnitIndex, const UCFGlassDefinition& Definition, const FCFBreakImpact& WorldImpact, uint32 Seed, float Scale, FCFGlassShardSpawn& OutSpawn) const
PUREC++ ONLY

一块碎裂的玻璃板抛出的碎片,按碎片系统接收的形式给出:定义中的碎片铺在玻璃板最靠近撞击点的平面上形成分块,每个碎片处于其所在分块中的位姿,并按碎片池抛出碎片的方式被抛出,抛出时玻璃板以其被绘制的样子为准。Scale 是保留的碎片比例,范围 0 到 1,从最先的碎片开始取。没有可抛出的东西时返回 false,OutSpawn 中没有碎片。

void OnShardsHit(int32 UnitIndex, TConstArrayView<FBasicParticleData> Data, const FVector& SimulationPositionOffset)
C++ ONLY

根据碎片系统导出的粒子数据,为这块玻璃板播放碎片系统的撞击:最快碎片的速度决定强度,玻璃板每隔 UCFBreakableSettings::DebrisImpactCooldownSeconds 最多发声一次。没有碎裂的玻璃板不播放任何内容。

函数

  • FindUnitsForPrimitivePrimitive 所属单元的单元组件,以及该单元的索引:先通过基元上的 ICFBreakableUnitPart 查找,否则取第一个认识该基元的附着父级。若都找不到,则返回 nullptr。
  • ApplyHitResultOnAuthority权威端:将作用于某基元的外部命中应用到其所属的单元。
  • PredictHitResult任一端:ApplyHitResultOnAuthority 的预测对应函数。
  • ApplyHitOnAuthority权威端:将单元提升到其定义为此次命中给出的等级(HitResponses),复制该结果并播放。
  • PredictHit任一端:立即显示此次命中的等级,并等待权威端确认;在 PredictionConfirmTimeoutSeconds 之后撤销。
  • GetUnitCount拥有者布置的单元数量。
  • GetMaxLevel单元可达到的最高等级,即传给 InitUnits 的值;单元在等级 0 时完好。
  • GetUnitLevel本端显示的等级:权威端的等级,或领先于权威端的预测等级。
  • GetConfirmedUnitLevel权威端在当前世代中确认的等级。
  • IsUnitIntact对于有效索引且显示等级为 0 的情况返回 true;对于无效索引返回 false。
  • PredictUnitLevel立即显示 StoredImpact 的等级(领先于权威端),同时显示 GatherUnitsRaisedWith 添加的单元。
  • RaiseUnitLevelOnAuthority权威端:为该单元及 GatherUnitsRaisedWith 添加的单元确认 Level,复制该结果,在此端播放,并通知 OnUnitsRaisedOnAuthority。
  • CancelPrediction将单元的预测回滚到已确认的等级,同时回滚 GatherUnitsRaisedWith 添加的单元的预测。
  • ApplyGeneration任一端:本组件学到的第一个世代(无论来自本端还是复制的等级)都会被接受,无论其值为何;此后,更新的世代会立即将本端所有单元恢复为完好状态,相同或更旧的世代则被忽略。
  • FindUnitForPrimitive基元(及其实例,即 ItemIndex)所代表的单元;若无则为 INDEX_NONE。

事件