使用 NavigationRegion
NavigationRegion 是 NavigationServer 上導航地圖中「區域」的可視化節點表示。每個 NavigationRegion 節點都儲存一份導航網格資源。
2D 與 3D 版本分別為 NavigationRegion2D 與 NavigationRegion3D。
每個 NavigationRegion 會將其 2D NavigationPolygon 或 3D NavigationMesh 資源資料上傳至 NavigationServer。 它會將這些資訊組合成完整的導航地圖,以供路徑尋找使用。
若要透過場景樹建立導航區域,請在場景中新增 NavigationRegion2D 或 NavigationRegion3D 節點。所有區域都需配置導航網格資源才能運作。詳見 使用導航網格 以瞭解如何建立與套用導航網格。
NavigationRegion 會自動將 global_transform 變更推送到 NavigationServer 上的區域,因此很適合用於移動平台。當各區域相距夠近時,NavigationServer 會嘗試連接這些區域的導航網格。詳情請參考 連接導覽網格。若需跨任意距離連接 NavigationRegion,請參考 使用 NavigationLink 以瞭解如何建立與使用 NavigationLinks。
警告
雖然更動 NavigationRegion 節點的變換會更新 NavigationServer 上區域的位置,但縮放不會。導航網格資源本身不具備縮放屬性,當來源幾何體縮放時,必須完整重新產生網格。
導航區域可以啟用或停用。被停用的區域將不會參與後續的路徑尋找查詢。
備註
當區域被啟用或停用時,現有的路徑不會自動更新。
建立新導航區域
新增的 NavigationRegion 節點會自動註冊到其 2D 或 3D 維度的預設世界導航地圖。
可以透過 NavigationRegion 節點的 get_rid() 取得區域的 RID。
extends NavigationRegion2D
var navigationserver_region_rid: RID = get_rid()
public partial class MyNavigationRegion2D : NavigationRegion2D
{
public override void _Ready()
{
Rid navigationServerRegionRid = GetRid();
}
}
extends NavigationRegion3D
var navigationserver_region_rid: RID = get_rid()
public partial class MyNavigationRegion3D : NavigationRegion3D
{
public override void _Ready()
{
Rid navigationServerRegionRid = GetRid();
}
}
也可用 NavigationServer API 直接建立新區域,並新增到任一現有地圖。
如果直接用 NavigationServer API 建立區域,需要手動指定導航地圖。
extends Node2D
func _ready() -> void:
var new_region_rid: RID = NavigationServer2D.region_create()
var default_map_rid: RID = get_world_2d().get_navigation_map()
NavigationServer2D.region_set_map(new_region_rid, default_map_rid)
public partial class MyNode2D : Node2D
{
public override void _Ready()
{
Rid newRegionRid = NavigationServer2D.RegionCreate();
Rid defaultMapRid = GetWorld2D().NavigationMap;
NavigationServer2D.RegionSetMap(newRegionRid, defaultMapRid);
}
}
extends Node3D
func _ready() -> void:
var new_region_rid: RID = NavigationServer3D.region_create()
var default_map_rid: RID = get_world_3d().get_navigation_map()
NavigationServer3D.region_set_map(new_region_rid, default_map_rid)
public partial class MyNode3D : Node3D
{
public override void _Ready()
{
Rid newRegionRid = NavigationServer3D.RegionCreate();
Rid defaultMapRid = GetWorld3D().NavigationMap;
NavigationServer3D.RegionSetMap(newRegionRid, defaultMapRid);
}
}
備註
導航區域只能分配給一個導航地圖。如果將已存在的區域指派到新地圖,該區域會自動離開舊地圖。