幀同步moba遊戲的尋路

概述

  • 要求控制的單位移動到一個指定位置,該單位移動結束後在多個平臺上獲取位置能得到相同的位置數據,即(x,z)
  • 忽略y的原因是控制的單位都是地面運動,不會上天,並且當前版本忽略地圖高度

過程

  • 指定位置,玩家通過操作發出一個指令,確定目標位置
  • 移動,不同平臺的相同uid的英雄收到指令,移動到目標位置
  • 終止判斷,判斷是否抵達目標位置

關鍵點

  • 相同的幀必須讓相同uid的英雄在相同的位置
  • 尋路的移動要具有跨平臺計算一致性,所以不能用unity的navmesh

方案

  • 使用支持幀同步的基於navigation mesh的astar進行尋路
  • 導出navmesh爲mesh文件獲得導航網格數據
    • 需要合併頂點,因爲根據我的實驗,unity的導航網格頂點有重複,視覺上鄰接的三角形不共邊
  • 對導航網格數據進行加工,獲得適用於nav mesh astar的數據

基於navmesh的astar算法

  • 類似於基於grid的astar算法,使用導航網格時鄰接的格子變成了鄰接點

關鍵操作

  • astar算法的流程
  • 查詢鄰接頂點
  • 查詢某個點落在哪個三角形

預處理導航數據

  • 根據導航網格構造一個無向圖,用來查詢某個頂點的鄰接頂點,需要預處理
  • 4叉樹序列化,用來查詢點在哪個三角形,或者運行時創建4叉樹,看需要

查詢點在哪個三角形

  • 加載預處理的4叉樹或者動態生成
  • 4叉樹定位某個三角形子集A
  • 遍歷子集A查詢三角形

查詢鄰接點

  • 根據導航網格構造一個無向圖,用來查詢某個頂點的鄰接頂點,需要預處理
  • 從圖中查詢給出頂點的鄰接頂點

後續

  • 整理出預處理的導航數據編輯器代碼和尋路代碼,包括
    • 把unity的navmesh轉成導航幀同步用的navmesh,保存到文件
    • 從導航數據導出4叉樹數據
    • 從導航數據導出頂點鄰接圖數據
    • 從文件反序列化導出的數據到內存對象
    • 調用基於navmesh的astar算法
  • 加入規避動態的障礙,即規避npc小兵和英雄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章