Unity3d主城玩家位置同步
由於不是戰鬥裡面的同步,所以主需要大概流暢的在其他端能看到玩家在跑動就行。我們使用的是狀態同步方案,客服端只傳送當前玩家的位置pos和朝向,這個朝向其實就是角色模型rotation的y值。因為大廳不需要戰鬥時候那麼高的同步性,所以我把頻率定為0.1秒同步一次玩家當前位置,寫個定時器就行,當前同步的條件是玩家位置發生了移動。
其他端收到到傳送過來同步座標,首先當然根據服務端傳過來的玩家id獲取到需要更新位置的物件,難點還是在獲取到之後移動玩家。我用了以下幾套方案:
1.烘焙場景,使用NavmeshAgent的SetDestination直接讓導航走到目的點。這種方法位置最後肯定同步,能走到目的點,就是過程比較不理想,具體不好用語言表達,要實現看效果才行。
2.首先儲存好同步的位置,然後在update裡面使用Vector.Lerp來實現插值過渡到座標點pos,這個方法比較流暢,但是由於Lerp這個方法是按照百分比來移動的,所以方法裡面的t需要拿捏好,這裡我也沒有什麼好辦法。
比如我主角從(0, 0 , 0)移動到(0, 0, 1) , 我同步間隔是0.1秒,0.1秒後,我把(0, 0, 1)這個座標同步給其他端,其他端收到後,就從(0, 0 , 0)移動到(0, 0, 1) ,用Vector.Lerp((0, 0 , 0),(0, 0 , 1),0.1f) ,這個0.1f其實是百分比,意思是一次移動剩下距離的10%,注意是剩下的10%,所以Lerp的過程其實是慢慢減速的過程,最後無限趨近於目標點, 1米的距離,需要執行10次以上的update才能大致走到目的點。假如目的點是a,當前位置是b,我判斷停下的條件就是(a-b).magnitude < 0.1f, magnitude 就是向量的長度,如果兩個向量相減後的長度達到0.1,說明基本走到目的地了,這個時候我就直接讓把目的地座標賦值給玩家座標,然後播放待機動畫,就不繼續執行lerp了。
第二個方法也是勉強符合需求,如果只根據玩家的位置pos和朝向,不知道還有沒有其他方法能很好的做到其他端流暢移動。
相關文章
- Unity3D中實現幀同步 - Part 2Unity3D
- 新的透鏡:以玩家風格、位置與角色看遊戲遊戲
- 《龍與家園》上線steam頁面 實現主城自建與交易自由
- FPS遊戲原理漫談:玩家延時與伺服器同步遊戲伺服器
- Unity3d 入門(一) 瞭解Unity3dUnity3D
- Unity3d 初探Unity3D
- unity3d碰撞Unity3D
- unity3d sqliteUnity3DSQLite
- 在FPS遊戲中,玩家對音畫同步感知的量化與評估遊戲
- unity3D進階Unity3D
- Unity3d 陀螺儀Unity3D
- Unity3D入門Unity3D
- 幹掉Unity3DUnity3D
- Unity3D 單例模式Unity3D單例模式
- Unity3d的安裝Unity3D
- Unity3D 8叉樹Unity3D
- 【Unity3D】UI Toolkit容器Unity3DUI
- 【Unity3D】資源管理Unity3D
- 【Unity3D】常用快捷鍵Unity3D
- Unity3d 協程 StartCoroutineUnity3D
- unity3d攝像機Unity3D
- Unity3D遊戲實戰Unity3D遊戲
- Unity3d花屏處理Unity3D
- unity3d 事件說明Unity3D事件
- Unity3D 外掛大全Unity3D
- 《死亡擱淺》採用的非同步聯機玩法,幾個世紀前就在造福玩家非同步
- Unity3d FingerGestures 使用 例子Unity3D
- Unity3D相關面試題Unity3D面試題
- Unity3D 錄屏、GIF、PNGUnity3D
- unity3d外掛之 DoTweenUnity3D
- Unity3d 人物的跳躍Unity3D
- Unity3D ARKit 參考文章Unity3D
- Unity3D執行報DllNotFoundExceptionUnity3DException
- Unity3D整合到iOS工程Unity3DiOS
- unity3d xml序列化Unity3DXML
- Unity3D指令碼屬性Unity3D指令碼
- 在unity3D中使用xmlUnity3DXML
- unity3d縮放物體Unity3D