分层寻路
- 在我们的实际开发过程中,往往有很多复杂的情况,如船只能在水面上行驶,不能再陆地上行驶,这时我们就需要进行导航区域的设置,进行分层寻路。
在我们游戏中可以将Navigation划分为几个区域,并定义游戏角色可以在哪些区域进行行走,以达到分成寻路的结果。(总共可以定义32组区域)

- name为层名,这里自定义一个water的层

- Cost为寻路成本:物体从起点到终点需要消耗的行动力(行动力等于距离乘以寻路成本)

当新添加层以后,可以在之前的 Navigation Object面板中Navigation Area中选择新的层。

- 搭建一个场景,分别添加水层(Water)(粉红色),沼泽层(Wetlands)(绿色)

- 接着找到我们的Player,将它NavMeshAgent组件的Area Mask中water取消勾选。

- 并将 Wetlands的寻路成本设置为10。

- 运行游戏,我们发现在Area Mask中取消勾选了Water以后,导航时就会不经过Water。但Wetlands是可以走的。但是寻路路径发生了变化。

-
我们来看一个更关键的问题。
-
图中深棕色的箭头理应是最短路径,但Navigation给我们计算的路径却要绕一圈是为什么?
-
因为我们已经修改了Wetland的寻路成本为10,Navigation自动计算了两条路线的寻路成本,选择了较小的一条进行导航。
此时如果添加了一堵墙阻断了路线。

- Player则只能从选择成本最高也是唯一一条路线去抵达目标点。

通过脚本来对导航区域可行走路线进行更改。
- 首先介绍一下,Unity中是通过int32来对Area的数据类型进行保存的。

- 我们可以通过nav变量来获取AreaMask。

-
通过API可以看到AreaMask为int类型的属性
Paste_Image.png
-
接着通过左移运算符,和NavMesh.GetAreaFromName方法来获取层。

该运算表示将1左移多少位,这里Walkable是0层,也就是左移0位,结果还是1
- 运行游戏前将 Area Mask改为Everything

- 运行游戏可以发现,此时即使在游戏运行前勾选的是everything,本应可以行走的,现在却无法在water层上进行行走,(因为此时Area Mask发生了变化)现在只能在Walkable层上行走。


- 如果此时想让角色也可以在其他层进行行走,可以通过按位运算符进行更改。是它可以通过沼泽地层。

- 此时可以在沼泽地上进行行走。


- 如果在可行走的区域,删除它的行走权限呢?(通过按位与(&)运算符)
- 找到沼泽地层,并将它进行取反~。

- 运行游戏,发现沼泽地无法行走了

网友评论