命中判定
Hit = Accuracy * (Distance / Weapon.Range)^2
其中Accuracy为玩家当前的射击精度,Distance为玩家与目标的距离,Weapon.Range为武器的有效射程。最后比较结果与一个随机数,大于则判定为命中。
伤害计算公式
Damage = Weapon.BaseDamage * Random(0.9, 1.1) * HitzoneDamageMultiplier
其中Weapon.BaseDamage为武器的基础伤害值。乘以一个0.9-1.1的随机数添加变化。HitzoneDamageMultiplier为不同身体区域受击的伤害倍率。如头部倍率最大,手脚最小。
被击中玩家剩余生命值
HealthRemaining = HealthBefore - Damage * DistanceFallOff
DistanceFallOff为不同距离的伤害衰减系数。近距离时为1,远距离时逐渐衰减。
延迟补偿
Hit = ShootAt(Position + Velocity * Delay)
ShootAt:客户端的射击打击点Position:目标的位置Velocity:目标的速度向量Delay:客户端到服务器的延迟时间
将目标在延迟时间内所可能移动到的位置,作为最终判定命中的位置
客户端发现目标位置在X,射击点也在X
但是由于100ms的延迟,信息到达服务器时目标可能已经移动到X+V*0.1秒了
所以服务器会将X+V*0.1作为最终射击判定点,而不是X
当完整计算套用以后实际你瞄准射击的部位不会是最终打击的部位 再加上延迟补偿机制服务器可能会将本不会命中的子弹算在命中里面表现就是你在看到对方的时候 对方开火到你死亡感官上可能只有0.1s 实际你的位置补偿可能在你还没看见他的时候 服务器已经将你的位置补偿给了对方, 当你还在墙内往墙外移动时 对方视角里 你已经在墙外了 就会给人一种你直接被秒的错觉 。
换一个思路就是假如你射击者的延迟高于对方,在服务器做计算的时候会反向补偿,及你射击的对象可能在服务器上根本就没有到或者已经过了那个瞄准点了,你看到的只是单纯的服务器脑补补偿给你看见的实际位置还没有发送到服务端,但是你的命中反馈是有的,因为命中反馈是在本地计算触发动画的。
说白了这一切都是 设计者为了保证服务器在并行计算中性能最优解做出的妥协,市面上的大型FPS游戏都是倾向于从射击者角色进行计算 这就会照成延迟高的一方常处于劣势。好处就是减轻服务器计算量、带宽。 同时避免了 个别设计游戏中出现魔法子弹、角色无敌的情况,比如塔科夫,塔科夫就是做了双向验证 导致各种魔法子弹 无敌的问题 同时对双方电脑以及服务器造成高负载的情况 。
Hit = Accuracy * (Distance / Weapon.Range)^2
其中Accuracy为玩家当前的射击精度,Distance为玩家与目标的距离,Weapon.Range为武器的有效射程。最后比较结果与一个随机数,大于则判定为命中。
伤害计算公式
Damage = Weapon.BaseDamage * Random(0.9, 1.1) * HitzoneDamageMultiplier
其中Weapon.BaseDamage为武器的基础伤害值。乘以一个0.9-1.1的随机数添加变化。HitzoneDamageMultiplier为不同身体区域受击的伤害倍率。如头部倍率最大,手脚最小。
被击中玩家剩余生命值
HealthRemaining = HealthBefore - Damage * DistanceFallOff
DistanceFallOff为不同距离的伤害衰减系数。近距离时为1,远距离时逐渐衰减。
延迟补偿
Hit = ShootAt(Position + Velocity * Delay)
ShootAt:客户端的射击打击点Position:目标的位置Velocity:目标的速度向量Delay:客户端到服务器的延迟时间
将目标在延迟时间内所可能移动到的位置,作为最终判定命中的位置
客户端发现目标位置在X,射击点也在X
但是由于100ms的延迟,信息到达服务器时目标可能已经移动到X+V*0.1秒了
所以服务器会将X+V*0.1作为最终射击判定点,而不是X
当完整计算套用以后实际你瞄准射击的部位不会是最终打击的部位 再加上延迟补偿机制服务器可能会将本不会命中的子弹算在命中里面表现就是你在看到对方的时候 对方开火到你死亡感官上可能只有0.1s 实际你的位置补偿可能在你还没看见他的时候 服务器已经将你的位置补偿给了对方, 当你还在墙内往墙外移动时 对方视角里 你已经在墙外了 就会给人一种你直接被秒的错觉 。
换一个思路就是假如你射击者的延迟高于对方,在服务器做计算的时候会反向补偿,及你射击的对象可能在服务器上根本就没有到或者已经过了那个瞄准点了,你看到的只是单纯的服务器脑补补偿给你看见的实际位置还没有发送到服务端,但是你的命中反馈是有的,因为命中反馈是在本地计算触发动画的。
说白了这一切都是 设计者为了保证服务器在并行计算中性能最优解做出的妥协,市面上的大型FPS游戏都是倾向于从射击者角色进行计算 这就会照成延迟高的一方常处于劣势。好处就是减轻服务器计算量、带宽。 同时避免了 个别设计游戏中出现魔法子弹、角色无敌的情况,比如塔科夫,塔科夫就是做了双向验证 导致各种魔法子弹 无敌的问题 同时对双方电脑以及服务器造成高负载的情况 。