Unity3D客戶端實時同步

2021-06-28 18:02:52 字數 1432 閱讀 7481

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

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

第一步是刷玩家自己

第二步是刷玩家九屏的物件

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

實現**如下:

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

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

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

在這裡我們也要做特殊處理,就是說如果碰到阻擋物的話,我們也認為其狀態發生了改變,需要傳送訊息,**如下:

最後注意一下,客戶端為了跟伺服器時間上能同步,需要客戶端不定時的ping一下伺服器,根據ping的時間差決定差值。**如下:

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

本文出自 「海遊移動」 部落格,請務必保留此出處

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

非同步客戶端和同步客戶端

先寫下我的理解,方便後邊閱讀資料校驗。一 同步客戶端 比如乙個連線有兩個請求,請求1 和 請求2,請求1 先發起請求,請求2後發起請求,則請求2 要等待請求1 響應完成才能接收到響應。舉個棗子,httpclient 傳送get請求,執行緒會一致阻塞,直到有響應結果。二 非同步客戶端 比如乙個連線有兩...

時間同步客戶端

網路程式設計課上的第乙個小實驗。客戶端傳送命令 gettime 到伺服器,伺服器獲取本地時間併發送回客戶端。就是這麼簡單。不多說了直接上 時間同步客戶端.cpp 定義控制台應用程式的入口點。include stdafx.h include include include pragma comment...