Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
使用 NavigationMap
NavigationMap 是 NavigationServer 上的抽象導航世界,並以 NavigationServer 的 RID 作為識別。
導航地圖可以容納並連接近乎無限數量的導航區域和導航網格,以構建遊戲世界中可行走的區域,提供路徑尋找功能。
導航地圖可以包含避障代理。碰撞避免會根據地圖中存在的代理進行計算。
備註
不同的導航地圖彼此完全獨立,但導航區域與避障代理可以在不同地圖間切換。切換動作會在 NavigationServer 同步時生效。
預設導航地圖
預設情況下,Godot 會為根視窗的每個 World2D 與 World3D 建立一個導航地圖。
2D 預設導航地圖的 RID 可以透過任何繼承 Node 的 Node2D 使用 get_world_2d().get_navigation_map() 取得。
3D 預設導航地圖的 RID 可以透過任何繼承 Node 的 Node3D 使用 get_world_3d().get_navigation_map() 取得。
extends Node2D
func _ready() -> void:
var default_navigation_map_rid: RID = get_world_2d().get_navigation_map()
public partial class MyNode2D : Node2D
{
public override void _Ready()
{
Rid defaultNavigationMapRid = GetWorld2D().NavigationMap;
}
}
extends Node3D
func _ready() -> void:
var default_navigation_map_rid: RID = get_world_3d().get_navigation_map()
public partial class MyNode3D : Node3D
{
public override void _Ready()
{
Rid defaultNavigationMapRid = GetWorld3D().NavigationMap;
}
}
建立新導航地圖
NavigationServer 可以根據遊戲需求建立及支援任意數量的導航地圖。若需支援不同的避障代理或角色移動類型,可以直接使用 NavigationServer API 來建立與管理額外的導航地圖。
有關不同導航地圖的應用範例,請參閱 支援不同角色型別 及 支援不同角色移動方式。
每個導航地圖會獨立同步其導航區域和避障代理的變更佇列。未發生變更的導航地圖幾乎不會消耗處理時間。導航區域與避障代理僅能隸屬於單一導航地圖,但可隨時切換至其他地圖。
備註
導航地圖的切換僅會在下次 NavigationServer 同步時生效。
extends Node2D
func _ready() -> void:
var new_navigation_map: RID = NavigationServer2D.map_create()
NavigationServer2D.map_set_active(new_navigation_map, true)
public partial class MyNode2D : Node2D
{
public override void _Ready()
{
Rid newNavigationMap = NavigationServer2D.MapCreate();
NavigationServer2D.MapSetActive(newNavigationMap, true);
}
}
extends Node3D
func _ready() -> void:
var new_navigation_map: RID = NavigationServer3D.map_create()
NavigationServer3D.map_set_active(new_navigation_map, true)
public partial class MyNode3D : Node3D
{
public override void _Ready()
{
Rid newNavigationMap = NavigationServer3D.MapCreate();
NavigationServer3D.MapSetActive(newNavigationMap, true);
}
}
備註
使用 NavigationServer2D API 或 NavigationServer3D API 建立的導航地圖沒有任何差異。