Godot 4.3中NavigationServer2D基于障碍物寻路返回空路径求助
Godot 4.3导航路径为空的解决方法
你的代码输出空路径的核心问题有两个:可遍历区域的轮廓方向错误,以及导航区域未同步坐标变换。以下是具体修正方案:
1. 修正可遍历区域的轮廓方向
Godot要求导航网格的可遍历区域轮廓必须为逆时针方向,障碍物轮廓则为顺时针方向。你当前的可遍历区域是顺时针绘制的,导致烘焙出的导航网格无效。
将可遍历区域的顶点顺序从:
Vector2(0, 0), Vector2(0, 50), Vector2(50, 50), Vector2(50, 0)
改为逆时针顺序:
Vector2(0, 0), Vector2(50, 0), Vector2(50, 50), Vector2(0, 50)
2. 同步导航区域的坐标变换
你创建的导航区域未关联节点的变换信息,导致导航网格的坐标与场景坐标不匹配。在custom_setup函数中添加以下代码,将导航区域的变换与节点全局变换同步:
NavigationServer2D.region_set_transform(region, get_global_transform())
3. 可选:验证烘焙结果
在on_geo_baked回调中添加打印,确认导航多边形是否成功生成:
func on_geo_baked(): NavigationServer2D.region_set_navigation_polygon(region, poly) print("导航多边形烘焙完成:", poly.get_polygons()) # 查看是否有有效多边形数据
修改后的完整代码
extends Node2D var map: RID var region: RID var poly = NavigationPolygon.new() var geometry = NavigationMeshSourceGeometryData2D.new() func _ready(): call_deferred("custom_setup") func custom_setup(): # 创建并激活导航地图 map = NavigationServer2D.map_create() NavigationServer2D.map_set_active(map, true) # 创建导航区域并关联到地图 region = NavigationServer2D.region_create() NavigationServer2D.region_set_map(region, map) NavigationServer2D.region_set_enabled(region, true) # 同步导航区域的坐标变换 NavigationServer2D.region_set_transform(region, get_global_transform()) # 设置导航多边形参数 poly.cell_size = NavigationServer2D.map_get_cell_size(map) # 添加顺时针方向的障碍物轮廓 geometry.add_obstruction_outline(PackedVector2Array([ Vector2(15, 20), Vector2(50, 20), Vector2(50,30), Vector2(15, 30) ])) # 添加逆时针方向的可遍历区域轮廓 geometry.add_traversable_outline(PackedVector2Array([ Vector2(0, 0), Vector2(50, 0), Vector2(50, 50), Vector2(0, 50) ])) # 异步烘焙导航网格 NavigationServer2D.bake_from_source_geometry_data(poly, geometry, on_geo_baked) func on_geo_baked(): NavigationServer2D.region_set_navigation_polygon(region, poly) print("导航多边形烘焙完成:", poly.get_polygons()) # 验证烘焙结果 func _physics_process(delta: float) -> void: var start_position: Vector2 = Vector2(10, 10) var target_position: Vector2 = Vector2(40, 40) var optimize_path: bool = false var path: PackedVector2Array = NavigationServer2D.map_get_path( map, start_position, target_position, optimize_path ) print("找到路径:", path)
修改后,导航网格会正确生成可遍历区域,起点和终点均处于有效区域内,即可输出绕开障碍物的可行路径。
内容的提问来源于stack exchange,提问作者Riki137
相关产品推荐
相关产品推荐

