You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:43:18