使用导航区块
NavigationRegion 即导航区块,是对 NavigationServer 的导航地图中某个区块的可视化 Node 表示。每个 NavigationRegion 节点中都存放着导航网格数据资源。
2D 和 3D 版本分别为 NavigationRegion2D 和 NavigationRegion3D。
各个导航区域将其二维导航多边形或三维导航网格资源数据上传到导航服务器。导航服务器地图会将这些信息转化为用于寻路的组合导航地图。
要使用场景树创建导航区块,请在场景中添加一个 NavigationRegion2D
或 NavigationRegion3D
节点。所有区块都需要导航网格资源才能正常工作。导航网格的创建和应用见 使用导航网格。
NavigationRegion 会自动将 global_transform
的变化推送到导航服务器上的对应区块,因此可用于移动的平台。当各个区块的导航网格足够接近时,NavigationServer 就会尝试将它们连接起来,详见 连接导航网格。NavigationLink 可以连接任意距离的 NavigationRegion,如何创建和使用见 使用 NavigationLink。
警告
虽然修改 NavigationRegion 节点的变换能够更新 NavigationServer 中对应区块的位置,但是修改缩放却不会。导航网格资源不具备缩放,所以来源几何体的缩放发生改变时需要进行完整的更新。
区块可以启用/禁用,如果禁用,则不会参与寻路查询。
备注
启用/禁用区块时,现有路径不会自动更新。
新建导航区块
新的导航区块节点会在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();
}
}
还可以使用导航服务器接口创建新区块,并将其添加到任何现有地图中。
如果直接使用导航服务器接口创建区块,则需要手动为其分配导航地图。
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);
}
}
备注
导航区块只能分配给一个导航地图。如果将现有区块分配到新的导航地图,它就不属于旧地图了。