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

参考组件

UCFBreakableUnitsComponent

模块CrushformBreakable头文件CFBreakableUnitsComponent.h父类USceneComponent

一组可破坏单元的复制核心,每个单元依次经历从 0(完好)到 MaxLevel(彻底破坏)的各个等级。拥有者布置单元,并在每一端上以完全相同的数据调用 InitUnits;单元的索引即其身份,在所有端上一致。权威端确认等级(RaiseUnitLevelOnAuthority),并通过最近事件的环形缓冲区进行复制;客户端会预测领先于权威端的等级(PredictUnitLevel),而追踪器记录每一端所显示的内容。子类负责定义单元的外观以及它所处的位置;它从不直接触碰复制状态本身。

函数

AUTHORITY · 服务器,每个端LOCAL · 本机PURE · 只读
UCFBreakableUnitsComponent* FindUnitsForPrimitive(const UPrimitiveComponent* Primitive, int32 ItemIndex, int32& OutUnitIndex)

Primitive 所属单元的单元组件,以及该单元的索引:先通过基元上的 ICFBreakableUnitPart 查找,否则取第一个认识该基元的附着父级。若都找不到,则返回 nullptr。

分类
Crushform|Breakable
bool ApplyHitResultOnAuthority(const FHitResult& HitResult, float Strength, FName HitKind)
AUTHORITY

权威端:将作用于某基元的外部命中应用到其所属的单元。撞击点为命中位置,方向取射线的方向(对于零长度射线,取表面法线的反方向)。

分类
Crushform|Breakable
bool PredictHitResult(const FHitResult& HitResult, float Strength, FName HitKind)

任一端:ApplyHitResultOnAuthority 的预测对应函数。

分类
Crushform|Breakable
bool ApplyHitOnAuthority(int32 UnitIndex, const FCFBreakableHit& Hit)
AUTHORITY

权威端:将单元提升到其定义为此次命中给出的等级(HitResponses),复制该结果并播放。若无任何变化,则返回 false。为虚函数:需要自行判定命中的子类(例如玻璃板的裂纹)应重写此函数。

分类
Crushform|Breakable
bool PredictHit(int32 UnitIndex, const FCFBreakableHit& Hit)

任一端:立即显示此次命中的等级,并等待权威端确认;在 PredictionConfirmTimeoutSeconds 之后撤销。调用方需自行提供通往服务器的途径。

分类
Crushform|Breakable
int32 GetUnitCount() const
PURE

拥有者布置的单元数量。

分类
Crushform|Breakable
int32 GetMaxLevel() const
PURE

单元可达到的最高等级,即传给 InitUnits 的值;单元在等级 0 时完好。

分类
Crushform|Breakable
int32 GetUnitLevel(int32 UnitIndex) const
PURE

本端显示的等级:权威端的等级,或领先于权威端的预测等级。

分类
Crushform|Breakable
int32 GetConfirmedUnitLevel(int32 UnitIndex) const
PURE

权威端在当前世代中确认的等级。

分类
Crushform|Breakable
bool IsUnitIntact(int32 UnitIndex) const
PURE

对于有效索引且显示等级为 0 的情况返回 true;对于无效索引返回 false。

分类
Crushform|Breakable
bool PredictUnitLevel(int32 UnitIndex, uint8 Level, const FCFBreakImpact& StoredImpact, uint8 ResponseIndex = CFBreakable::NoResponse)
C++ ONLY

立即显示 StoredImpact 的等级(领先于权威端),同时显示 GatherUnitsRaisedWith 添加的单元。索引或等级无效,或单元已显示该等级或更高等级时,返回 false。

bool RaiseUnitLevelOnAuthority(int32 UnitIndex, uint8 Level, const FCFBreakImpact& StoredImpact, uint8 ResponseIndex = CFBreakable::NoResponse)
AUTHORITYC++ ONLY

权威端:为该单元及 GatherUnitsRaisedWith 添加的单元确认 Level,复制该结果,在此端播放,并通知 OnUnitsRaisedOnAuthority。非权威端、索引或等级无效,或单元已处于该等级或更高等级时,返回 false。

bool CancelPrediction(int32 UnitIndex)
C++ ONLY

将单元的预测回滚到已确认的等级,同时回滚 GatherUnitsRaisedWith 添加的单元的预测。索引无效或单元没有预测时,返回 false。

void ApplyGeneration(uint8 InGeneration)
C++ ONLY

任一端:本组件学到的第一个世代(无论来自本端还是复制的等级)都会被接受,无论其值为何;此后,更新的世代会立即将本端所有单元恢复为完好状态,相同或更旧的世代则被忽略。权威端还会清空复制的等级和事件环。

int32 FindUnitForPrimitive(const UPrimitiveComponent* Primitive, int32 ItemIndex) const
PUREC++ ONLY

基元(及其实例,即 ItemIndex)所代表的单元;若无则为 INDEX_NONE。对挂载在本组件之下的基元调用。

事件

FCFOnUnitLevelChangedDelegate OnUnitLevelChangedNative
C++ ONLY
(UCFBreakableUnitsComponent&, int32, uint8, uint8)

每当单元的显示等级发生变化时,两者都会在每一端触发。中途加入的玩家进行追赶时(先以 0 初始化,再应用复制的等级),会为所有已提升的单元触发它们,因此不应在此处放置一次性特效。处理函数可以提升、预测或取消其他单元,并应用某个世代。

FCFOnUnitLevelChangedDynamicDelegate OnUnitLevelChanged
(UCFBreakableUnitsComponent* Units, int32 UnitIndex, int32 Level, int32 PreviousLevel)
分类
Crushform|Breakable