網頁版
https://yekdniwue.blogspot.com/2020/11/NavMeshExperience.html
UE4的Navigation Mesh 如果照著網路上的教學做,大概都可以建的出來。
A.I.角色也都能夠在上面正常行走。
不過應用稍微有點變化的時候就會碰上一些問題,在這邊先介紹過去遇過的項目
名詞與縮寫說明
NavMesh: Navigation Mesh
NBV: Navigation Bounds Volume,用來定義navigation mesh的範圍。
P-Level: Persistent Level。 主地圖。
Sublevel: 放置於主地圖下的子地圖。
如何調整NavMesh的大小
雖然一般都會調整NBV的scale,不過並不建議這麼做。
Volume類型的個人都建議調整Brush內的大小,不要改Actor的scale。
NavMesh到底存在哪邊?
NavMesh實際上存在於有NBV的場景的umap內。
不是場景的BuiltData,也不一定是主地圖。
舉例來說
主地圖 (1個NBV)
sublevel1 (0個NBV)
sublevel2 (0個NBV)
sublevel3 (2個NBV)
當Build完NavMesh之後,主地圖與sublevel3都需要存檔。
我可以在Build的時候排除sublevel嗎?
可以,在Build之前把sublevel設隱藏的話,就可以排除掉,如下圖所示
sublevel隱藏的時候Build Path,就不會排除方塊(圖1.)。
sublevel顯示的時候Build Path,會排除方塊(圖2.)。
[圖]
圖1. 隱藏Sublevel build path
[圖]
圖2. Sublevel1內的方塊被考慮進去並視為不可行走。
有Nav Mesh刪不掉
有的時候會看到場景裡面有不該存在的Nav Mesh,而且不管怎麼重Build都刪不掉。
我找到了重現步驟如下:
1. 開啟一個新的Level File->NewLevel->Default
2. 放置Nav Mesh Bounds Volume (NBV) 於場景內,並與地板有交疊。
[圖]
3. Build->Build Paths (或是引擎自己會auto build navigation)
4. 確認Nav Mesh有出現
5. 直接刪除步驟2的NBV
6. Build->Build Paths (或是引擎自己會auto build navigation)
7. Bug發生,Nav Mesh不會因為NBV刪掉而消失
解決上面的問題的步驟
1. 放置Nav Mesh Bounds Volume (NBV) 於場景內,並與地板無交疊。
[圖]
2. Build->Build Paths (或是引擎自己會auto build navigation)
3. 確認Nav Mesh消失
4. 刪除步驟1的NBV
5. 完成
這個問題看起來只要確認,在刪地圖內最後一個NBV之前,
有確保NavMesh有清除,再刪掉NBV就好。
但是實際上有很多問題
如果有很多sublevel,這個確認就會變得非常浪費時間。
總共要做下面幾件事:
對所有sublevel
如果sublevel沒有NBV
放置NBV於不會產生NavMesh的地方
Build Paths
sublevel存檔
NavMesh能不能存放在streaming的sublevel
非Always loaded的sublevel,例如Blueprint可控制的sublevel,
或是World Composition模式的sublevel。
都必須遵照以下的步驟設定,中間步驟有少或是出錯都會有問題。
後果有以下幾種現象,我都遇過
NavMesh直接消失
Editor看的到,執行Play in Editor看不到NavMesh
關掉Editor重開後就看不到NavMesh
每次執行NavMesh都不一樣,有時位置錯,有時有些區域沒出來。
正確設定Streaming sublevel的NavMesh
1. 放置一個NBV在P-Level中,可以不需要跟任何東西交集。
之後都不可刪掉此NBV。
2. 選擇P-Level內自動產生的RecastNavMesh Actor。
3. Runtime Generation 設為Static。
4. Fixed Tile Pool size設為true。
5. Tile Pool size有可能需要隨著地形大小調大。
6. 在子地圖放置NBV。
注意事項
你也不能單獨打開子地圖,對任何子地圖Build Path後存檔。
一旦這麼做,在讀主地圖的時候就會產生兩個以上的
RecastNavMesh Actor(主地圖+子地圖)
然後就會錯亂,NavMesh就不正常了。
因為這個原因,個人極度不建議在這種使用情境打開
auto build navigation的功能,
只要有人單獨編輯子地圖,觸發Build Path並存檔,
這樣那個子地圖的NavMesh就會壞了。