本技能是面向 Godot 引擎的 AI 寻路与导航参考,基于 NavigationAgent2D/3D 与 NavigationServer,提供寻路、避障和动态导航网格的实现方式。
用途 适用于塔防、RTS、潜行等需要 AI 移动的游戏类型,用于构建健壮的 AI 移动逻辑。
主要能力 涵盖 2D 导航与 3D 导航的寻路实现。2D 部分说明 NavigationRegion2D 的搭建流程(添加节点、新建 NavigationPolygon、绘制可行走区域、烘焙导航网格),并给出基础 AI 移动脚本。提供 NavigatorAgent 的属性配置,包括路径重算距离(path_desired_distance、target_desired_distance)、避障(radius、avoidance_enabled)与性能相关参数(path_max_distance)。进阶模式包含追击玩家、巡逻点、3D 寻路、动态障碍(NavigationObstacle2D)以及信号处理(velocity_computed、navigation_finished)。此外提供一个脚本 dynamic_nav_manager.gd,用于移动平台等场景的运行时导航网格更新。
使用方式 资料给出了完整的节点结构与代码示例。典型流程为:搭建场景层级(Level 下含 NavigationRegion2D 与带 NavigationAgent2D 的 CharacterBody2D),在 _ready() 中通过 call_deferred 延迟调用初始化函数,并 await get_tree().physics_frame 等待导航就绪后再设置 target_position;在 _physics_process 中检查 is_navigation_finished(),通过 get_next_path_position() 获取下一路径点并据此计算方向、设置 velocity 后调用 move_and_slide()。进阶示例展示了追击玩家(按距离判断是否更新目标)、巡逻点(到点后切换到下一巡逻点)以及通过 velocity_computed 信号获取安全速度的写法。
适用场景 塔防、RTS、潜行等需要 AI 寻路与避障的游戏场景,以及存在移动平台等需要动态更新导航网格的情形。
限制与注意事项 资料以「NEVER Do」形式列出若干常见错误:不要在 _ready() 中、物理帧就绪前设置 target_position(会静默失败,须用 call_deferred 后 await 物理帧);不要在运行时使用 NavigationRegion2D.bake_navigation_polygon()(同步烘焙会冻结游戏 100+ 毫秒,应改用 NavigationServer2D 做动态更新或预先烘焙);不要忘记检查 is_navigation_finished()(否则会沿陈旧路径走到旧位置);不要启用 avoidance_enabled 却不设置半径(默认半径为 0,智能体会彼此穿透,应设置为碰撞形状半径);不要为追击 AI 每帧轮询 target_position(每秒 60 次会引发路径重算泛滥,应使用定时器如 0.2 秒间隔或距离阈值触发更新);不要假设路径一定存在(目标不可达时 get_next_path_position() 返回无效值,应检查 is_target_reachable() 或校验路径长度)。最佳实践包括延迟初始化导航、检查路径是否存在、在人群场景中启用避障并设置 radius 与 max_neighbors。参考文档指向 Godot 官方 Navigation 文档。