区别
虽然也是HitScane,但其可以对多个角色或者多个部位造成伤害
更改
首先是之前在FFramePackage结构体中,需要增添一个成员变量,用来表示该结构体中的BoxCollision属于哪个敌人。
而之前使用的ConfirmHit返回的校验击中头部和身体的结构体,需要为ShotGun创建类似的,其内有两个TMap类型的成员变量
TMap<Character*, int> HeadHits;
TMap<Character*, int> BodyHits;
针对ShotGun的服务器上检测
由于ShotGun是可能攻击的多个角色,具有多个HitLocation的,所以对于ShotGun的ServerRewind主函数,接受的参数也发生了变化
FShotGunServerSideRewindResult ShotGunServerSideRewind(const TArray<AXCharacter*>& HitCharacters, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations, float HitTime)
FShotGunServerSideRewindResult这个结构体就是上面提到的ConfirmHit需要返回的结果。
而对于ShotGunServerSideRewind这个函数,处理是和普通的一样的,对于HitCharacters,根据HitTime寻找关键帧的位置,然后进行存储,最后再调用ConfirmHit函数对于该关键帧进行校验
只不过由于是多个Character,所以需要存储在一个数组中,数组每个索引位置接受一个HitCharacters在HitTime上的FramePackage
TArray<FFramePackage> FramesToCheck;
for (AXCharacter* HitCharacter : HitCharacters)
{
//获取ShotGun的击中检测Box信息
FramesToCheck.Add(GetFrameToCheck(HitCharacter, HitTime));
}
ShotGun ConfirmHit
还是因为多敌人的问题,所以参数发生了相应的变化
FShotGunServerSideRewindResult ShotGunConfirmHit(const TArray<FFramePackage>& FramePackages, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations)
FramePackages
就是在ShotGunServerSideRewind函数
中获得的存储了每个角色在HitTime下的FramePackage
但是整体逻辑和ConfirmHit一致
- 首先定义一个FShotGunServerSideRewindResult结构体变量ShotGunResult,之后针对每个FramePackage中的检测结果都可以存入到该结构体变量中
- 针对每个FramePackage里面的HitCharacter存储当前帧,用于检测完成之后返回,然后回退到当前关键帧的FramePackage,关闭碰撞体之类的
- 开启HeadBox碰撞,开始检测,遍历HitLocations数组,根据每个HitLocation检测是否有Hit,如果有,那么将
ShotGunResult
里面HeadHits
对应的Character命中次数+1 - 开启身体的碰撞,开始检测,也是遍历HitLocations数组,如果有Hit,那么将
ShotGunResult
里面BodyHits
对应的Character命中次数+1 - 进行Box的返回,开启关闭碰撞等等,最后返回ShotGunResult
ShotGun 的 执行伤害逻辑
该函数就是和普通的一样放在Weapon类中执行的
void ServerShotGunScoreRequest_Implementation(const TArray<AXCharacter*>& HitCharacters, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations, float HitTime)
- 可以通过
ShotGunServerSideRewind
获得所有攻击的命中结果FShotGunServerSideRewindResult结构体变量Confirm
- 然后遍历HitCharacters,通过
Confirm
中的两个Map计算应当造成的伤害值,注意到这里是没有传入武器的,因为目前是通过该组件类中获取到的所属成员,然后通过所属成员获取其持有的武器来获得基础伤害 - 最后利用ApplaDamage对HitCharater造成伤害