A*插件关于生成导航网格的简单配置及一些参数的干货

生成寻路网格的配置(场景自行搭建)

以下为我搭建的场景(地面10*10,障碍物均为5*5,楼梯每阶高0.3)

scene

创建一个空物体,命名为A*,然后添加上Pathfinder组件

1

2

3

点击Graph,会出现好几种生成寻路网格的方式,这里我会讲我之前在做寻路测试用的两种Grid Graph和Recast Graph。

4

首先先看一下Grid Graph生成导航网格的方法

The Grid Graph is the most straight forward graph. As the name implies it generates nodes in a grid pattern.

It works great for most scenes and is especially good when you need to update the graph during runtime (such as in an RTS or a Tower Defence game).

It is not particularly good from a performance and memory point of view at handling large worlds with large open spaces however as it represents all regions with the same node density regardless of if they need that detail or not'.

网格图是最直接的正向图。顾名思义,它在网格模式中生成节点。

它在大多数场景中都很好用,当你需要在运行时(例如在RTS或塔防游戏中)更新图形时尤其好用。

但从性能和内存的角度来看,它在处理具有大开放空间的大型世界方面并不是特别好,因为它代表了具有相同节点密度的所有区域,而不管它们是否需要这些细节。

 

接下来为具体的使用方法:

当我们点击GridGraph以后,场景中出现一小块导航网格,接下来我们需要是导航网格覆盖整个需要场景,同时和地面贴合,为了方便操作,我们首先把显示方式改成wireframe,然后使用改变大小的工具拉升网格四边,直至恰好覆盖场景。

5

6

7

 

接下来调节参数

8

一般使用GridGraph时需要调节的关键参数是红色框里面的,主要为

Max Climb:角色能爬的最大高度

MaxSlope:角色可走的最大坡度

 

Collision testing,一般只需要调节Mask位置,这里表示的是不可走的区域,一般选择障碍物所在的层。

Height testing,高度检测,检测与地面的距离,所以这里选择可走区域所在的层。

详细的参数信息请见 https://arongranberg.com/astar/docs/gridgraph.html

(Obstacles和Ground层需要提前创建好,不会创建的小伙伴看文章末尾)

 

为场景中的物体设置好层

9

10

11

 

配置

12

 

然后点击scan就可以生成导航网格了

13

 

显示方式:(组合方式自由)

14

15

16

17

18

19

20

21

(注意Diameter参数越大,不可走区域也会扩大,对比如下:)

23

22

25

26

 

接下来为RecastGraph生成导航网格的方法

The Recast Graph type is by far the most advanced graph generator in this system. It is based on Recast, an open source navmesh and navigation system in C++ which I have translated a part of to C# to run it natively in Unity.

The recast graph generator will voxelize the world (sort of rasterize it to a lot of cubes) and then build a navigation mesh of it which can be used similar to the Navmesh Graph.

It can generate a stable mesh in seconds what could take hours using manual mesh building.

 

Recast Graph类型是迄今为止该系统中最先进的图形生成器。 它基于Recast,一个用c++开发的开源导航网格和导航系统,我将其中的一部分翻译成C#,在Unity中本地运行。

重铸图形生成器将对世界进行体素化(将其栅格化为大量立方体),然后构建它的导航网格,可以使用类似于Navmesh Graph的导航网格。

它可以在几秒钟内生成稳定的网格,使用手动网格构建可能需要数小时。

26

首先来看一下RecastGraph中的参数   https://arongranberg.com/astar/docs/recastgraph.html

cell size:较低的值将产生较高质量的导航,但是图形扫描较慢。

characterRadius:将遍历导航网格的agent的半径。导航网格将以此半径进行侵蚀。

colliderDetail:控制球体和胶囊碰撞器光栅化的细节。它控制生成的网格上的行数和列数。 较高的值不一定会提高网格的质量,但较低的值通常会加快网格的质量。您应该尽量保持此值尽可能低而不影响网格质量,因为这将产生最快的扫描时间。

rasterizeColliders:使用碰撞器计算导航网格。

rasterizeMeshes:使用场景网格计算导航网格。

rasterizeTerrian:在场景中包含地形。

rasterizeTrees:在地形上栅格化树木碰撞器。

如果树预置有一个碰撞器,那个碰撞器就会被光栅化。否则,将使用一个简单的box collider,脚本将尝试根据树的大小调整它,但它可能做得不是很好,所以最好使用一个附加的collider。

注意

似乎Unity只会在游戏启动时在运行时生成tree colliders。 因此,在播放模式之外扫描时,此图形不会拾取树碰撞器,但如果在游戏开始时扫描图形,它将拾取它们。 如果它仍然没有拾取它们,请确保树实际上已经连接了碰撞器并且树预制件位于正确的层中(该层应该包含在layermask中)。

Max Edge Error:从简化边到实边的最大距离。

该值以体素为单位。 因此,默认值为2意味着最终的导航网格轮廓最多可以是2个体素(即2次cellSize),远离在对世界进行体素化时计算的边界。 较高的值将产生更简化和更清晰的导航网格,而较低的值可以捕获更多细节。 但是,太低的值会导致单个体素可见(参见下图)。

TileSize:单个瓷砖的体素大小。这是瓷砖的宽度。

较大的tile大小可以更快地进行初始扫描(但是如果您尝试在大的世界中使用过大的tile,请注意内存不足问题),较小的tile大小可以更快地进行更新。

不同的瓦片大小会影响路径的质量。将巨大的开放区域分割成几块瓦片以获得更好的质量路径通常是好的,但是太小的瓦片也会导致看起来像隐形障碍的效果。有关这方面的更多信息,请参阅有关navmesh图的说明。通常最好是进行实验,看看什么最适合你的游戏。

当扫描一个重铸的图形时,可以并行计算单个块,这可以使扫描大型世界的速度快得多。当您想要重新计算重铸图的一部分时,这只能在逐个图块的基础上完成,这意味着如果您经常尝试更新重绘图的区域远小于图块大小,那么您将做了很多不必要的计算。如果你另一方面更新重绘图的区域比块大小大得多,那么它可能比需要的慢,因为有很多tiles而不是几个更大的tiles会带来一些开销(虽然不是很多)。

建议值介于64和256之间,但这些都是非常软的限制。可以使用更大和更小的值。

LayerMask:过滤要包含的对象

MaxBorderEdgeLength:较长的边将被细分。

减少这个值有时可以提高路径质量,因为大小相似的三角形比大小相近的三角形产生更好的路径。然而,它也会增加更多的节点,这将使寻路变慢。有关这方面的更多信息,请参阅有关navmeshgraph的说明。

MaxSlope:角色可以通过的最大倾斜角度。

MinRegionSize:最小区域的大小。

小区域将从navmesh中移除。以正方形的世界单位(大多数比赛的平方米)来衡量。

如果一个区域与一个tile的边界相邻,即使它很小,也不会被移除,因为相邻的tile可能会把它连起来形成一个更大的区域。

terrianSampleSize:控制地形的样本大小。

值越高,扫描速度越快,但准确度越低

walkableClimb:角色可以攀爬的高度

walkableHeight:角色高度

现在开始生成导航网格:

具体参数调节可参照上面的,根据自身项目需求进行调节,常规的主要需要调节一下几个参数

当我们选择RecastGraph时,场景中出现了立方体,我们需要使用

来使场景刚好包裹在立方体内

接下来点击scan,寻路网格就生成啦

 


创建层:

Inspector → Layer → AddLayer

在空白区域添加你需要添加的层的名字,比如说Vehicle

现在在Hierarchy面板选中物体,给它设置所在层

本文主要是参考官方文档,所以部分图片以及文字来自官方文档。

参考A* Pathfinding Project官网:https://arongranberg.com/astar/docs/

猜你喜欢

转载自blog.csdn.net/Kathy_unity/article/details/81583968