【心得】遊戲機制大解密 ||| 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?variant=zh-tw
返回頂部