实时导航(3D)

前言

很多游戏中 3D 环境的寻路都是非常重要的,常见的就是非直接控制的角色或者实体会在环境中找到去路。Godot 为此提供了若干节点:

地图与导航地区

“地图”是导航的完整世界,类似于物理引擎的“空间”。它由导航地区组成,这些地区定义的是世界中导航代理能够到达的部分。

要创建导航地区,请在 3D 场景中添加 NavigationMeshInstance 节点。然后,请在检查其中为这个网格创建或者添加一个 NavigationMesh。导航网格包含了烘焙时应该如何将其生成的选项。几何体选项控制的是在烘焙网格的过程中会用到哪些节点、哪些类型的节点。各个设置项的完整描述与工作原理可以在 NavigationMesh 类参考中找到。

正确设置好之后,请在点击检查器顶部的“烘焙导航网格”按钮来生成网格。

../../_images/bake_navmesh.png

备注

也可以在运行时使用导航网格的 bake_navigation_region() 方法来生成。

网格生成完后,你应该就能在场景中可以进行导航的位置上方看到半透明的导航网格了。

../../_images/baked_navmesh.png

请注意,导航网格显示的是实体中心点所能到达的位置。例如,如果你将代理半径设为 0.5,那么你的导航网格与台阶或者墙壁之间就会有 0.5 的距离,防止穿进墙壁或从边缘掉下。

如果地区之间是紧挨着的,导航代理就可以从一个地区移动到另一个。另外烘焙出的导航网格可以在运行时移动,代理仍然可以从其他地区导航到它上面。例如,导航到停止的移动平台是可行的。

RVO 处理

RVO 即“相互速度障碍(Reciprocal Velocity Obstacle)”。RVO 处理是一种寻路方法,会考虑其他代理以及同时在移动的物理实体。

使用方法是和平时一样设置目标,然后代理需要获取它导航路径上的下一个位置,计算前往该位置所需的速度。这个值不用来移动,而是通过 set_velocity 将它设为代理的速度。然后就会生成一个考虑了其他代理和障碍物的新速度,通过 velocity_computed 信号发出。

不过代理只会考虑固定数量的周边代理,即代理的最大相邻数属性,是可调的。这并不是对同时使用导航地区的代理数量的限制。

生成路径(旧方法)

这是生成导航路径的旧方法,会在 Godot 4 中移除。首先在场景中添加一个导航节点,然后再添加一个导航网格实例作为其子节点,并设置导航网格。

要在地图上获取两个区域之间的路径,你可以使用导航节点的 get_simple_path() 方法。第一个参数是表示起始位置的 Vector3,接下来是表示结束位置的 Vector3。最后一个参数是一个布尔值,表示是否需要在生成路径时考虑 agent 属性。

该方法返回的是一个 PoolVector3Array,由路径上的点组成。如果无法导航至结束位置,该方法会返回一个空 PoolVector3Array