概述
- 要求控制的單位移動到一個指定位置,該單位移動結束後在多個平臺上獲取位置能得到相同的位置數據,即(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小兵和英雄