针对ShotGun的ServerRewind

区别

虽然也是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一致

  1. 首先定义一个FShotGunServerSideRewindResult结构体变量ShotGunResult,之后针对每个FramePackage中的检测结果都可以存入到该结构体变量中
  2. 针对每个FramePackage里面的HitCharacter存储当前帧,用于检测完成之后返回,然后回退到当前关键帧的FramePackage,关闭碰撞体之类的
  3. 开启HeadBox碰撞,开始检测,遍历HitLocations数组,根据每个HitLocation检测是否有Hit,如果有,那么将ShotGunResult里面HeadHits对应的Character命中次数+1
  4. 开启身体的碰撞,开始检测,也是遍历HitLocations数组,如果有Hit,那么将ShotGunResult里面BodyHits对应的Character命中次数+1
  5. 进行Box的返回,开启关闭碰撞等等,最后返回ShotGunResult

ShotGun 的 执行伤害逻辑

该函数就是和普通的一样放在Weapon类中执行的

void ServerShotGunScoreRequest_Implementation(const TArray<AXCharacter*>& HitCharacters, const FVector_NetQuantize& TraceStart, const TArray<FVector_NetQuantize>& HitLocations, float HitTime)
  1. 可以通过ShotGunServerSideRewind获得所有攻击的命中结果FShotGunServerSideRewindResult结构体变量Confirm
  2. 然后遍历HitCharacters,通过Confirm中的两个Map计算应当造成的伤害值,注意到这里是没有传入武器的,因为目前是通过该组件类中获取到的所属成员,然后通过所属成员获取其持有的武器来获得基础伤害
  3. 最后利用ApplaDamage对HitCharater造成伤害

作者:XTG111

出处:https://www.cnblogs.com/XTG111/p/18369921

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   XTG111  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示