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

参考子系统与库

UCFDebrisSubsystem

模块CrushformBreakable头文件CFDebrisSubsystem.h父类UTickableWorldSubsystem

由破坏单元抛出的装饰性碎片所组成的客户端对象池。

绝不会在专用服务器上创建:碎片仅用于表现,不会被复制。碎片会与世界、完整的道具以及彼此发生碰撞,但绝不会与 pawn 碰撞(由 Debris Collision Profile 设置决定;若未设置任何配置,碎片仅参与物理模拟,因此任何 trace、sweep 或 overlap 都找不到它)。若定义中的 bDebrisCollidesWithDebris 处于关闭状态,则其碎片改为忽略配置文件自身的对象类型。除非定义中设置了 bDebrisPushedByVehicles,否则车辆也会穿过它们:此时车身会对碎片进行单向推动;未启用 CCD 的车身会保持其速度,因为碎片不使用 CCD(Chaos 在单向推动之外解析 CCD)。推动从破坏时开始,持续定义中 DebrisVehicleContactSeconds 指定的时长,此后车辆会再次穿过碎片;仍停留在车辆上的碎片则会继续被推动,直到离开车辆,因此它既不会悬挂在车辆离开时的位置,也不会穿过车辆下落。被推动且在其开始下沉时位于车辆上的碎片,会随车辆一起缩小消失,而不是穿过车辆下沉。被推动的碎片若中心仍位于车辆内部(被切分为碰撞块的凹陷车身,可能会卡住压入其中的薄碎片),便不再感知车辆,并从中掉落出来。判断碎片位于车辆上或车辆内,都是围绕该碎片对 Vehicle 对象类型进行的查询,因此只有启用了查询碰撞的车身才会计入。被推动的碎片绝不会被视为对车辆的一次命中:撞击反馈等命中消费方会跳过它,参见 GetPoolActor。

函数

AUTHORITY · 服务器,每个端LOCAL · 本机PURE · 只读
UCFDebrisSubsystem* Get(const UObject* WorldContext)
C++ ONLY

WorldContext 所属世界的碎片子系统;若没有则为 nullptr。

bool ShouldSimulateInNetMode(ENetMode NetMode)
C++ ONLY

以 NetMode 运行的世界是否模拟碎片:除专用服务器外的所有模式都模拟。

int32 SpawnPieces(const UCFBreakableDefinition& Definition, const FTransform& UnitWorldTransform, const FCFBreakImpact& Impact, uint32 Seed, const UObject* Owner = nullptr, int32 OwnerKey = INDEX_NONE, const FVector& CarrierVelocity = FVector::ZeroVector)
C++ ONLY

依据 UnitWorldTransform 抛出 Definition 烘焙好的碎块:靠近 Impact.Location 的碎块继承更多撞击速度,远离的碎块大多只是翻倒。Seed 使抛出结果可重复。Owner 和 OwnerKey 为碎块加上标记,供 ReleaseOwnedPieces 使用;对于碎片存在至重生为止的定义,需传入这两个参数。返回生成的碎块数量(超出本地视角的碎片距离、在专用服务器上,或定义未烘焙时为 0)。每个碎块还会随 CarrierVelocity 一同移动,即承载该单元之物的速度。

void ThrowPiece(const UCFBreakableDefinition& Definition, const FVector& PieceLocation, const FCFBreakImpact& Impact, const FVector& CarrierVelocity, FRandomStream& Random, FVector& OutLinearVelocity, FVector& OutAngularVelocityDeg)
C++ ONLY

位于 PieceLocation 的碎片被抛出时的速度,来自 Impact:撞击速度的一部分,加上向外的抛出量,二者都随碎片距 Impact.Location 越远而越弱,再加上随机散布和 CarrierVelocity。自旋是定义中最快自旋的一个随机比例,同样随距离变弱。按固定顺序从 Random 中取值,因此同一个随机流会再次抛出相同的碎片。

void ReleaseOwnedPieces(const UObject* Owner, int32 OwnerKey)
C++ ONLY

立即将 Owner 的碎块退回对象池,不做下沉:仅退回以 OwnerKey 生成的碎块;若为 INDEX_NONE,则退回全部碎块。

void ReleaseAllPieces()
LOCALC++ ONLY

所有存活的碎块都会退回对象池,无论是否有拥有者,也无论是否持久存在。仅作用于本端。

int32 GetLivePieceCount() const
PUREC++ ONLY

当前存活的碎块数量,包括持久存在的碎块。

int32 GetLivePersistentPieceCount() const
PUREC++ ONLY

碎片存在至重生为止的定义所对应的存活碎块;GetLivePieceCount 包含这些碎块。

int32 GetPendingVehicleContactCount() const
PUREC++ ONLY

车辆仍在推动的存活碎块,其推动在设定时间后结束。

int32 GetLivePushedPieceCount() const
PUREC++ ONLY

车辆当前正在推动的存活碎块,无论其推动在设定时间后结束,还是在碎块停留期间持续。

void GetLivePieces(TArray<UStaticMeshComponent*>& OutPieces) const
PUREC++ ONLY

用每个存活碎块的组件填充 OutPieces。

const AActor* GetPoolActor() const
PUREC++ ONLY

拥有所有池化碎块的临时 Actor;在生成第一个碎块之前为 nullptr。不应对碎片做出反应的命中消费者会忽略它。

bool IsWithinSpawnDistance(const FVector& Location) const
PUREC++ ONLY

Location 是否位于观察者的 UCFBreakableSettings::DebrisMaxSpawnDistanceCm 范围内:观察者即 SetViewerOverride 设置的点,否则为宿主报告的视点位置。没有可供测量的观察者时为 True,因此不会剔除任何东西。

void SetViewerOverride(const TOptional<FVector>& InLocation)
C++ ONLY

设置后,距离剔除将以此点而非本地摄像机为基准进行测量。

void SetHost(ICFBreakableHost* InHost)
C++ ONLY

对象池的游戏侧:距离剔除所依据的摄像机,以及碎块被击中时的反馈。不归对象池所有。

float ComputePieceImpactIntensity(float ImpulseMagnitude, float MassKg, float MinImpulsePerKg, float ImpulsePerKgForFullIntensity)
C++ ONLY

根据碎块的冲量和质量得出的碎块命中强度,范围为 [0, 1];若命中过轻而无法播放,则为 -1。