Unity3d主城玩家位置同步

敬畏之心發表於2018-05-10

    由於不是戰鬥裡面的同步,所以主需要大概流暢的在其他端能看到玩家在跑動就行。我們使用的是狀態同步方案,客服端只傳送當前玩家的位置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和朝向,不知道還有沒有其他方法能很好的做到其他端流暢移動。

相關文章