开火频率如果只是在Tick中简单实现会有诸多问题这里可以使用定时器函数来调用开火,定时器已在之前文章中讲到这里不赘述。
首先声明一些我们需要的变量:
float LastFireTime; //记录之前开火的时间
float RateOfFire = 400.0f; //每分钟的开火速率
float TimeBetweenShots = 60/RateOfFire; //获取到开火时间间隔
其中LastFireTime应当在武器开火函数结束后获取当前时间进行赋值:
LastFireTime = GetWorld()->TimeSeconds;
之后我们要得到首次开火的延时时间FirstDelay(要解决的是玩家快速点击鼠标时忽略开火时间间隔的问题),通过之前的开火时间加上开火时间间隔减去当前时间即可得出,其中 FMath::Max函数是为了避免得出负数,此函数会返回两个值中最大的值(算法多看几遍即可理解):
float FirstDelay = FMath::Max(LastFireTime + TimeBetweenShots - GetWorld()->TimeSeconds , 0.0f);
然后设置定时器调用开火函数的频率和首次开火的延时即可:
GetWorldTimerManager().SetTimer(Hand,this,&XXX::Fire, TimeBetweenShots, true ,FirstDelay);
最后可以在停火时调用清理定时器即可:
GetWorldTimerManager().ClearTimer(Hand);