Godot 4.3(beta3)中TileMapLayer障碍物与NavigationAgent2D避障问题
方案1:给障碍物Tile添加局部导航障碍(推荐,可视化操作)
直接在TileSet编辑器中为带物理碰撞的Tile设置对应区域的导航障碍,无需修改现有Island层的导航:
- 打开TileSet编辑器,选中Obstacle层里的树Tile。
- 右侧面板切换到Navigation选项卡,选择"Obstacle"模式。
- 用多边形工具绘制和物理碰撞区域完全匹配的导航障碍(比如树的下半部分)。
- 确保Obstacle层的Navigation Layer与Island层一致,NavigationAgent2D的
navigation_layer_mask也包含该层。 - 运行游戏后,NavigationAgent2D会自动避开障碍区域,保留Tile上半部分的导航路径。
方案2:用脚本动态生成导航排除区域
如果不想修改TileSet,可通过脚本给每个物理碰撞Tile生成局部导航排除区域:
extends TileMapLayer func _ready(): # 遍历所有带物理碰撞的Tile for cell_pos in get_used_cells(): var tile_data = get_cell_tile_data(cell_pos) if tile_data and tile_data.get_collision_polygons_count() > 0: # 创建导航区域节点 var nav_region = NavigationRegion2D.new() add_child(nav_region) # 定位到Tile的世界中心 nav_region.global_position = get_cell_center_world_position(cell_pos) # 复制物理碰撞多边形作为导航排除形状 var collision_poly = tile_data.get_collision_polygon(0) var nav_poly = NavigationPolygon.new() nav_poly.add_outline(collision_poly.get_polygon()) nav_region.navigation_polygon = nav_poly # 设置为排除模式,从全局导航网格中挖掉该区域 nav_region.override_mode = NavigationRegion2D.OVERRIDE_MODE_EXCLUDE nav_region.enabled = true
将该脚本挂在Obstacle层上,运行时会自动为每个带碰撞的Tile生成对应导航排除区域,Island层的导航网格会保留非碰撞部分。
方案3:调整NavigationAgent2D回避参数(临时快速解决)
靠动态回避绕过物理碰撞,适合对导航精度要求不高的场景:
- 选中敌人的NavigationAgent2D节点,开启Avoidance模块。
- 设置
radius为敌人的碰撞半径,调整max_speed和max_force让转向更平滑。 - 确保敌人的CollisionShape2D与Obstacle层的物理层开启碰撞检测。
新手注意事项
- 所有涉及导航的图层,需保证NavigationLayer设置统一,NavigationAgent2D的
navigation_layer_mask要包含这些图层。 - Godot 4.3 beta版本已支持Tile级别的多边形导航障碍,方案1是最直观且无代码的最优解。
内容的提问来源于stack exchange,提问作者Cyrille
相关产品推荐
相关产品推荐

