使用 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 建立的導航地圖沒有任何差異。