Unity3D客戶端實時同步

   在玩網絡遊戲的時候,多人在線,多人組隊,多對多PK等等,這些我們經常可以互相看到對方在移動,我們通常稱這個爲實時同步,有時,我們會看到對方忽然有被拉回的感覺,這個稱謂延時操作,就是說客戶端和服務器端時間不一致或者是網絡不順暢造成的,接下來我給大家介紹一下在客戶端如何實現實時同步。

  首先我們要知道玩家周圍的其他玩家或者怪物,NPC是如何刷出來的,在這裏涉及到服務器的實現,服務器會模擬客戶端的場景,也在服務器的GameServer裏面生成一個跟客戶端同樣大小的地圖,它裏面有個九屏的概念,什麼是九屏,九屏是服務器已玩家爲中心生成的九個格子,每個格子都有一定的大小,凡是位於玩家的九屏之內的對象都會被服務器刷出來,如圖所示:

wKioL1SiwCOimkj5AACNDQosjI8175.jpg

服務其中的九屏如上圖所示,每個玩家都有自己的九屏,這個九屏是隨着玩家移動的,在九屏之外就不會被刷出,玩家是看不到的,這也是爲什麼有時在客戶端把可視距離設大了還是看不到,就是這個道理。還是以服務器的爲準。所以我們在客戶端實現的時候就分如下幾步:

第一步是刷玩家自己

第二步是刷玩家九屏的對象

第三步是要隨時刷走進玩家九屏或者遠離玩家九屏的對象

實現代碼如下:

wKioL1SiwkaisLWlAAOgYpbRGNg543.jpg

玩家九屏之內的對象刷出來之後,我們接下來就要實現實時同步,實時同步有好多方式,我給大家介紹的方式是目前比較流行的,就是根據玩家的狀態進行同步,那狀態是什麼意思?舉個例子,就是玩家從站狀態到走狀態,狀態發生改變要告訴服務器,而服務器會把這個狀態改變告訴在玩家九屏之內的對象,玩家開始走了,如果玩家一直走,客戶端與服務器是不同信的,而客戶端是在一定的時間間隔內存到堆棧裏,同時可以發送給服務器,但是服務器是不轉發的,他只是在服務器裏模擬。一旦狀態發生改變立刻取出發給服務器,服務器再羣發九屏消息,爲了使玩家出現的不突兀,客戶端會採用差值的方式,差值是根據時間進行的,這個時間的計算就包括客戶端發送給服務器的,以及服務器返回的時間,以及在客戶端行走的時間都需要計算的。代碼如下:

wKiom1Siw-OScyiiAAGAX__qEbw396.jpg

以上是狀態改變的時候發送消息,狀態不改變的處理方式如下:

wKiom1SixT-wC8IaAAGg-wj_I3E867.jpg

wKioL1SixMXhdZKvAAGiTZ_NjIs200.jpg

在這裏還有一個問題,不知道大家注意了沒?就是說如果遇到碰撞體該如何解決?

在這裏我們也要做特殊處理,就是說如果碰到阻擋物的話,我們也認爲其狀態發生了改變,需要發送消息,代碼如下:

wKiom1SixOej_XTnAAGVOjd1BsU555.jpg


最後注意一下,客戶端爲了跟服務器時間上能同步,需要客戶端不定時的Ping一下服務器,根據Ping的時間差決定差值。代碼如下:

wKioL1SixviQQtwtAAEn7jSqU1E489.jpg

以上整個客戶端實時同步就完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章