【心得】游戏机制大解密 ||| Surf、Bhop、Kz的最基础操作「Strafe」

前言:

哈啰大家好是KilinWei,自从我开始玩bhop、surf跟kz已经三年了,对于strafe的机制一直都算有个底,但是我没有认识国外懂游戏机制的大老们,所以也都没办法解惑。像是为甚么sv_airaccelerate调到非常高不会让转弯更容易,大概到100以后就没有肉眼可见的影响。或是64、128tick到底是如何影响strafe的。
一直到半年前发现了一个重要的指令以及最近突破一些瓶颈,才把starfe的机制全部搞懂了。所以单纯很开心上来跟大家分享一下。虽然这篇文章看完对你的人生或跟CS:GO技巧一点帮助都没有,但大家还是能看看,当作长点冷知识。

原理简介:

  • 甚么是Strafe?
    Strafe指的是在空中转弯的技巧,要向左转需要按A加上鼠标向左,向右转需要按D加上鼠标向右。也就是康康这部影片中所说的「空中侧跳」。但实际上按WASD全都能转弯,鼠标不管向左向右也通通能转弯,只是视角的差异而已。
  • 为甚么能够Strafe?
    能够Strafe是由于游戏引擎允许玩家在空中进行加速,大家国中物理都学过,只要朝着垂直于速度方向进行加速,就能改变速度的方向。因此当玩家按W往前跳起后按A向左边加速,就能向左转了。
  • 放屁,我起跳后按A还是在往前跳啊!!
    游戏当然不会允许玩家按一个键就能疯狂加速。游戏中有一个限制,当玩家在希望加速的方向的速度超过30unit/s,就不会再加速了。所以当你按W向前跑到向前速度250unit/s后起跳,按了A以后,你便会增加向左的速度30unit/s。
    下面的Gif是我仿真往前跳后按A或D的速度变化,蓝色线条是速度平行玩家正前方的分量,红色线条是速度垂直玩家正前方的分量,而黑色是速度的方向。当视角不变时,起跳后按AD只能旋转约7度 ( arctan(30/250) = 6.843° ),当然看不出来,而且速度越大越看不出来。
  • 所以这样不是还是不能转弯吗?
    没错,所以想要在空中转弯,需要搭配上鼠标的移动。起跳后按A之后,速度在玩家左侧的分量已经达到30unit/s。这时只要将视角向左转,便能减少速度方向与视角的夹角。也就能减小速度在玩家左侧的分量,这时如果我们持续按着A,便能再次将速度向左的分量增加回30unit/s,便能再次旋转一些角度了。经过不停的按着A或D以及鼠标向左或向右,我们就能在空中转弯,并且同时缓慢的增加速度。

服务器指令、环境影响

  • 会影响在空中「Strafe」表现的指令以及环境设置
    有很多指令会影响玩家操作,不过在空中时就少了一些。主要的几个如下
    1. sv_airaccelerate                 影响空中的加速度
    2. sv_air_max_wishspeed      影响朝移动方向加速的最大速度
    3. sv_maxvelocity                   影响空中最大速度
    4. tickrate                                影响服务器更新频率
    以下操作均假设玩家无任何武器(无刀)
  • sv_airaccelerate ( 竞技缺省 12 )
    如同它字面上的意思,就是空中的加速度。设置为1时,加速度为260unit/s^2。
    假设此指令值为1,并且玩家以260的速度向前,那么当玩家按S时,便需要一秒使玩家减速至0。
  • sv_air_max_wishspeed ( 竞技缺省 30 )
    当玩家在希望移动的方向 ( A是左方、W是前方以此类推 ) 的方向大于此值,便不会再加速。
    此值对于玩家在空中转弯以及加速能力至关重要
  • sv_maxvelocity
    限制玩家在空中最大速度
  • tickrate
    游戏更频率。由于游戏并非现实,而是一帧一帧更新。同时因为sv_air_max_wishspeed限制了每帧最大额外增加的速度,tickrate越高则Strafe加速越快,也能以更快速度转弯而不会降速。

游戏更新流程

  • 讲这么多,我还是不知道到底游戏怎么算出这些的
    没错,好像是有点复杂,我就直接一步一步算给你看,我们假设玩家以速度300unit/s向前跳,并以指令+right视角不停向右转并且按着D。
    游戏设置以滑水普遍设置进行。
    sv_airaccelerate 150
    sv_air_max_wishspeed 30
    sv_maxvelocity 3500
    tickrate 64
    同时各种矢量以玩家自身视角前方为y轴正向,右方为x轴正向。
    所以此时玩家速度为 ( 260*cos( 90 ), 260*sin( 90 ) ),也就是( 0, 260 )
  1. 首先游戏更新玩家视角
    +right指令每秒旋转210°,除以每秒更新64次的64tick设置。
    下一次更新会将玩家视角向右移动210/64度,也就是3.28125°
  2. 检查加速条件
    此时因为玩家向右转了一点,速度对于玩家来说朝左前方。
    此时的速度矢量为 ( 260*cos( 93.28125 ), 260*sin( 93.28125 ) ) = ( -14.882, 259.574 )
    我们可以看到,我们现在正按着D,也就是朝着x+加速。而目前x方向速度是负的,并未大于sv_air_max_wishspeed 所设置的30,因此可以朝右方加速。
  3. 更新速度
    sv_airaccelerate 值为150,所以实际加速度为260*150 = 39000unit/s^2。
    我们将期除以64,得到每tick加速度为609.375unit/tick。
    我们以此更新x+方向的速度。
    -14.882 + 609.375 = 594.493
    发现其大于30,所以直接将其降至30。
    这边可以发现,sv_airaccelerate太高其实在控制最大不减速转弯速度没什么用处。
    但是其实sv_airaccelerate更高对于会减速的转弯还是有帮助的。
    但再讲就有点太复杂,而且应该也没人有兴趣XD。
    更新后速度为 ( 30, 259.574 ),且其大小为 261.302。
    可以发现我们的速度增加且方向从左前方变为右前方,也就是向右转了。
  4. 更新位置
    位置的更新就是速度/tickrate并加回原本的位置就是新位置了,这边不多做赘述。
  5. 重复上述动作
    更新完毕后就再回到步骤一进行下一次更新。同样是获得新视角 -> 计算新速度 -> 计算新位置
    非常简单

仿真游戏更新

  • 实际仿真游戏更新并观察
    我用上述的方法简易的仿真更新,并在CSGO中做出一些稳定可量化的操作。
    并在我的仿真中重复一遍一模一样的操作,观察是否有相同的结果。
    稳定可量化的操作方法如下。
    1. 固定tickrate 128
    2. 以+left指令进行视角转动
    3. 以+moveleft代替手指按移动
    4. 我们让玩家开始进行旋转
    初始位置 = ( 1340.53, -4982.77 )
    初始速度 = ( -29.99, 2.73 )
    初始角度 = 89.70337
  • 仿真结果
    250次更新后(约2秒):
    玩家位置 = ( 23.000,  37.2370) 玩家速度 = ( -177.176, 110.149)  玩家角度 = 139.8645
    仿真位置 = ( 23.000, 37.2370 ) 仿真速度 = ( -177.167,  110.159) 仿真角度 = 139.8596
  • 2500次更新后(约20秒):
    玩家位置 = ( -297.094,  200.290) 玩家速度 = ( -817.739, -1067.573)  玩家角度 = 231.2732
    仿真位置 = ( -297.086, 200.321 ) 仿真速度 = ( -817.822,  -1067.509) 仿真角度 = 231.2659
  • 10000次更新后(约80秒):
    玩家位置 = ( -498.949,  -277.104) 玩家速度 = ( 928.913, -1839.559)  玩家角度 = 295.961
    仿真位置 = ( -498.988, -277.057 ) 仿真速度 = ( 928.762,  -1839.634) 仿真角度 = 295.953
  • 20000次更新后(约160秒):
    玩家位置 = ( 336.416,  445.1919) 玩家速度 = ( -1673.723, 1289.849)  玩家角度 = 295.961
    仿真位置 = ( 336.434, 445.141 )   仿真速度 = ( -1673.576,  1260.035) 仿真角度 = 142.203
  • 结论
    仿真结果非常不错,实际游戏移动距离已经快到百万unit,而误差仍然能够控制在小数点后第二位。所以我猜测并仿真的游戏引擎运作应该是对的。
    我做这些单纯是兴趣而已,能真的搞出来还蛮爽的。
    后面可能会去弄弄看Surf原理跟最大可能的LJ距离吧。
本文来自网络,不代表3楼猫立场,转载请注明出处:https://www.3loumao.org/11088.html
返回顶部