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

参考组件

UCFBreakableInstancesComponent

模块CrushformBreakable头文件CFBreakableInstancesComponent.h父类UCFBreakableUnitsComponent

基于 Crushform 单元核心的可破坏单元,由拥有者布置:用于显示它们的 ISM 实例、它们所处的布局、服务器端重生,以及对于要求此功能的定义,由任意刚体引发的破坏。组件不关心拥有者沿什么布置它们。拥有者布置单元,并在每一端上以完全相同的数据交给 SetUnits;单元的索引即其身份,在拥有者的整个生命周期内始终不变。传给 SetInstanceSlots 的 ISMs 必须以单位变换附着于此组件:FindForPrimitive 会从被重叠的 ISM 沿附着父级向上查找。单元有两个等级,完好(0)和已破坏(1);基础组件负责复制、预测并播放它们。

任意刚体:仅在权威端,若单元的定义设置了 bBreaksFromAnyBody,则会被自身没有接触组件的物理刚体或行走中的 Pawn 破坏(CFBreakable::IsContactBody)。循环计时器(UCFBreakableSettings::AnyBodyCheckIntervalSeconds)每次在仍立着的已标记单元周围的包围盒中查找一次刚体;当其中某个刚体足够重且足够快时,组件会在物理之后开始 tick,并将每个此类刚体在该帧内的运动路径与单元的边界进行测试;若某一帧没有此类刚体,则关闭 tick。若没有已标记的定义、在客户端上,以及在非游戏世界中,组件不持有计时器,也从不 tick。

函数

AUTHORITY · 服务器,每个端LOCAL · 本机PURE · 只读
UCFBreakableInstancesComponent* FindForPrimitive(const UPrimitiveComponent* Primitive)
C++ ONLY

拥有 Primitive 实例的实例组件,若无则为 nullptr。

void SetInstanceSlots(const TArray<UCFBreakablePropDefinition*>& InDefinitions, const TArray<UInstancedStaticMeshComponent*>& InInstances)
C++ ONLY

每个定义槽位对应一个 ISM(FCFBreakableUnit::DefinitionIndex 同时索引这两个数组);设置每个 ISM 的网格体。

void SetUnits(const TArray<FCFBreakableUnit>& InUnits)
C++ ONLY

替换单元列表,并显示复制状态中未标记为已破坏的每个单元。

bool IsUnitConfirmedBroken(int32 UnitIndex) const
PUREC++ ONLY

权威端的视图,即复制后的状态。

FBox GetUnitWorldBounds(int32 UnitIndex) const
PUREC++ ONLY

单元完好网格体的世界包围盒。

int32 FindUnitForOverlap(const UPrimitiveComponent* Component, int32 ItemIndex) const
PUREC++ ONLY

此组件的 ISMs 之一上的重叠结果所指向的单元;若不属于本组件,则为 INDEX_NONE。

bool TryBreakLocal(int32 UnitIndex, const FCFBreakImpact& Impact)
LOCALC++ ONLY

立即在本端破坏该单元(将其隐藏、抛散碎片、播放反馈),并等待权威端确认;未确认的破坏将在 PredictionConfirmTimeoutSeconds 之后撤销。若此处已破坏,则返回 false。该单元中仍完好的 FCFBreakableUnit::LinkedUnits 会随之破坏,且各自作为独立的破坏处理。

void BreakOnAuthority(int32 UnitIndex, const FCFBreakImpact& Impact)
AUTHORITYC++ ONLY

仅限权威端:记录并复制该破坏,并安排重生。对已破坏的单元不执行任何操作。该单元中仍完好的 FCFBreakableUnit::LinkedUnits 会随之破坏,且各自作为独立的破坏处理。

int32 RespawnAllOnAuthority()
AUTHORITYC++ ONLY

权威端:无论 CanRespawnUnit 返回什么,所有已破坏的单元都会立即全部重生。返回重生的数量。

bool IsWatchingAnyBody() const
PUREC++ ONLY

任意刚体检查是否已就绪:该组件位于游戏世界的权威端,并且有某个单元的定义可被任意刚体破坏。

bool IsAnyBodyTickOn() const
PUREC++ ONLY

组件当前是否执行 tick。只有在上一次检查发现有刚体能够破坏单元时,它才会执行 tick。

函数

  • 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。

事件