手把手教你實現物理碰撞的網絡同步

現現在,網絡同步的技術在各類遊戲裏被普遍應用和發展,那麼,如何在Unity中搭建網絡模塊?如何使服務器和客戶端之間通訊?如何作到網絡同步?本文做者爛筆頭-27將從自身經驗出發,爲你們一一解答這些疑問。

系列回顧:手把手教你實現Unity網絡同步

8、物理碰撞的網絡同步

寫完上一篇文章以後,在Q羣有一位朋友提了一個問題,在這個網絡框架下,沒法正常處理物體與物體之間的碰撞,通過測試之後,發現確實會出現這樣的狀況,如圖:

html

<ignore_js_op>


能夠看到,在客戶端物體(藍色立方體)移動,而後碰撞到服務器物體(紅色立方體)時,因爲服務器端的物體在客戶端是滯後的,而客戶端物體是本地預測的,當發生碰撞時,不能及時地產生碰撞反饋,因此致使碰撞的結果兩端不一致,而後客戶端就預測失敗,產生很強烈的抖動和拉扯。這顯然不是咱們想要的結果。

那麼如何來解決這樣的問題呢?

1.思路

緣由已經找到了,由於在客戶端,客戶端的物體是本地預測的,而服務器的物體是根據收到的狀態包進行插值,二者在當前時刻,物理狀態有差別,因此致使的碰撞異常,既然是由於服務端和客戶端的物體,模擬的步調不一致致使的,那麼可不能夠在客戶端去預測服務端的物體,使二者可以保持相同的模擬步調呢?

在GDC2018演講 《火箭聯盟》的物理與網絡細節(須要***)這個視頻中,從37分22秒開始,演講者演示了在《火箭聯盟》中是如何作到在客戶端對服務器的球的物理狀態進行預測。

所以,在「巨人的肩膀上」,在以前的網絡同步架構之下,作一點拓展,使在客戶端預測服務端物體的物理狀態。

2.模仿《火箭聯盟》製做汽車(Car)和球(Ball)

新建一個預設Car,樣子大概這樣:

服務器

<ignore_js_op>


新建一個預設Ball,樣子是這樣:

網絡

<ignore_js_op>


爲了讓球(Ball)更像真實的球,給它添加帶彈性的物理材質:

架構

<ignore_js_op>


3.爲汽車(Car)和球(Ball)添加控制邏輯,以及須要同步的網絡狀態。

汽車的控制代碼:

框架

<ignore_js_op>


球(Ball)不接收按鍵輸入,只有須要同步的物理狀態,物理狀態跟汽車(Car)是相同的。

測試

<ignore_js_op>


就這樣,汽車(Car)和球(Ball)都建立好了,能夠進行基本的碰撞同步檢測了,效果如圖:

spa

<ignore_js_op>


能夠看到,在汽車(Car)衝撞到球(Ball)以後,球發生了劇烈的抖動,接下來,就要解決這個問題了。

4.在客戶端爲服務器物體進行物理狀態預測

在目前的同步框架下,服務器的物體在客戶端是基於狀態進行插值變化的。因此是滯後了,爲了能在客戶端預測它,咱們能夠建立一個假的球(DummyBall),而後把真正的球(ServerBall)隱藏(PS:僅僅是隱藏,同步邏輯仍是同樣的),這樣,就能夠作到

>汽車(ClientCar)不和ServerBall發生物理碰撞,只和DummyBall發生碰撞。

>能夠在客戶端對DummyBall進行物理預測,而不是影響ServerBall。

這可能有點繞,簡而言之,就是爲了在客戶端預測服務器的物體,客戶端建立了一個假的」欺騙」玩家,但不是真的欺騙,DummyBall在預測以前的物理狀態必須是服務器下發的最新狀態,DummyBall的代碼以下:

3d

<ignore_js_op>


而後客戶端爲本身(ClientCar)作預測的同時,也爲DummyBall作預測,代碼:

視頻

<ignore_js_op>


在汽車(Car)的執行操做指令的邏輯中,由於Physics.Simulate()是全局的,因此客戶端預測執行一次,DummyBall也預測模擬了一次。

htm

<ignore_js_op>


看看效果吧(藍色車是客戶端控制,紫色球是假球DummyBall,都是客戶端作預測的):

<ignore_js_op>


能夠看到,在客戶端的預測下,汽車(Car)碰撞到球(Ball)時,產生了很及時的碰撞反饋,此方案可行。

再把真實的球(ServerBall)給顯示出來對比一下(藍色車是客戶端控制,紫色球是假球DummyBall,都是客戶端作預測的,紅色球是ServerBall,是由服務器下發的狀態包來作插值):

<ignore_js_op>


5.小結

經過建立DummyBall在客戶端實現對服務器物體的物理預測,雖然感受像是玩家在踢」假球」,可是能夠換個說法,玩家是在踢」將來的球」,這樣聽起來就很Amazing了~

在不肯定性的物理模擬和較高的網絡波動環境下,這樣的作法總會發生偏差,爲了減小偏差帶來的遊戲體驗,在帶寬容許的條件下,能夠儘量的增長網絡傳輸的頻率,好比:20個包/秒,還有對數據流量進行壓縮也頗有必要。

來源:騰訊遊戲學院
原地址:https://mp.weixin.qq.com/s/y7oa6eGkclI1NkcOOwplXA

相關文章
相關標籤/搜索