Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

2D 导航概述

Godot 提供了多种对象、类和服务器,可帮助 2D 和 3D 游戏实现基于栅格(Grid)或网格(Mesh)的导航和寻路。下文将对 Godot 中与 2D 场景导航相关的对象及其主要用途进行概述。

Godot 为 2D 导航提供了如下对象和类:

  • Astar2D

    Astar2D 对象能够在由具有权重的构成的图中查找最短路径。

    AStar2D 类最适合的是基于单元格的 2D 游戏,角色不需要到达区域中的任意位置,只需要能够到达一些预先指定的独立位置。

  • NavigationServer2D

    NavigationServer2D provides a powerful server API to find the shortest path between two positions on an area defined by a navigation mesh.

    NavigationServer 最适合的是要求角色能够到达区域中任意位置的 2D 实时游戏,区域由导航网格定义。基于网格的导航能够轻松扩展到大型游戏世界,因为大型区域通常能够使用单一多边形定义,如果换成栅格则会需要定义许许多多的单元格。

    NavigationServer 中存放了不同的导航地图,每一张地图都由若干区块组成,区块中存放的是导航网格数据。在地图上放置代理就能够进行避障计算。与服务器通信时,使用 RID 来引用内部的地图、区块和代理。

    NavigationServer 中可用的 RID 类型如下。
    • 导航地图 RID

      引用指定的导航地图,地图中存放的是区块和代理。地图会尝试将区块中的导航网格根据距离进行合并。每一个物理帧,地图都会同步区块和代理。

    • 导航区块 RID

      引用指定的导航区块,区块中存放的是导航网格数据。使用导航层位掩码可以对区块进行启用/禁用,限制其使用。

    • 导航链接 RID

      引用指定的导航链接,能够将两个导航网格上的位置进行连接,无视距离。

    • 导航代理 RID

      引用指定的避障代理。避障使用半径值指定。

    • 导航障碍物 RID

      引用指定的避障障碍物,会对代理的避障速度产生影响和约束。

下列场景树节点可以辅助对 NavigationServer2D API 的使用。

  • NavigationRegion2D 节点

    存放 NavigationPolygon 资源的节点,该资源定义的是 NavigationServer2D 中的导航网格。

    • 区块可以启用/禁用。

    • 通过 navigation_layers 掩码,可以对其在寻路中的使用做进一步的限制。

    • NavigationServer2D 会根据距离将不同区块中的导航网格合并成一个导航网格。