Unity. Navigation和寻路

Navigation Static:不会移动。可以用于计算可行走区域。例如:地板。墙。静态障碍物。

将一个物体选为Navigation Static:Navigation窗口-> 勾选项

 

 

Scene Filter 选中 All:表示 Hierarchy 视图中显示全部的 GameObject

Scene Filter 选中 Mesh Renderers:表示 Hierarchy 视图中只显示有 Mesh Renderer 的 GameObject

选中 Navigation Static:表示 Bake 时会将这个物体考虑进去

 

可以参考以下文章:

http://blog.csdn.net/janeky/article/details/17492531

 

《Top-Down RPG Starter Kit》示例程序

他是 Asset Store 的一个 demo,实现了点击路面走路,但是他并没有寻路,点击路面后,他只能直线走,遇到障碍就停下来了。

他使用的是 CharacterController。这个组件可以帮你处理 Collider,让你不会和障碍物相交。

 

关于导航网格的一些疑问:

http://forum.unity3d.com/threads/navmesh-heightmesh-questions.117083/

 

静态障碍物

是在 Bake 时指定的。方法:场景中选中某个物件 -> Navigation Window 的 Object 标签页 -> 勾选 Navigation Static -> Navigation Layer 选择 Not Walkable

可以看到物体所在的区域在 Bake 之后被排除掉了:

动态障碍物

不是在 Bake 时指定的。而是通过给物体加一个 Nav Mesh Obstacle 组件生成的。

动态障碍物可分为2种:

一种是没有勾选 Carve。寻路时计算路径并不会考虑到他。是到他周围了才会去绕过他。

一种是勾选 Carve。会重新导航网格的区域。计算路径时就会把他考虑进去,计算出来的路径就不会和他冲突。会有性能损失

关于这2种可以在以下链接找到详细描述:

http://docs.unity3d.com/ScriptReference/NavMeshObstacle.html

 

例子:

球:要移动的物体

立方体:障碍物,Carve没有打勾 (可以看到导航网格并没有绕过他,而是包含他)

圆柱体:球要移动到这个位置

绿色箭头:如果没有障碍物的情况下球应该走的路线

移动结果:

 

关于 NavMeshPathStatus

PathComplete    The path terminates at the destination.

使用 NavMesh.CaculatePath 函数时,如果目标点与导航网格的距离在合适的范围内(这个还要研究一下),并且能找到一条路径到达目标点时,就会是这个状态;
PathPartial    The path cannot reach the destination.

使用 NavMesh.CaculatePath 函数时,如果目标点与导航网格的距离在合适的范围内(这个还要研究一下),但是目标点无法到达时,会是这个状态;
PathInvalid    The path is invalid.

使用 NavMesh.CaculatePath 函数时,如果目标点与导航网格的距离不在合适的范围内(这个还要研究一下),那么就是这个状态;

寻路方案选择!!!

 

  (1) (2) (3) (4)
Navigation Static

×

×

Default

×

×

×

Not Walkable

×

×

×

Nav Mesh Obstacle (Carve = false)

×

×

×

每种情况的效果:

情况(1):物件在生成导航网格时完全被忽略。agent寻路时也完全忽略他,直接从他身上穿过去。

情况(2):将参与导航网格生成。如果是一个形状类似于Cube的东西,而高度 > Step Height,那么他跟 Not Walkable 是差不多的。如果是一个类似于Cube的东西,而高度 < Step Height,会形成一个坡,从他上面跨过去。但如果不是像 Cube,而是一个任意形状,你又希望他会成为障碍物,那么就算他很高也不要选择使用 (2)。

情况(3):生成障碍区域,生成导航网格时会抠掉这些区域。

情况(4):就是一个障碍物,注意这里Carve是设置为false。agent 寻路时会自动绕过他(寻路时是不会考虑他的,也就是说寻路后的路线可能穿过他,在靠近他的时候会动态地绕开他)。

 

方案:

情况(1):完全不在导航范围内的物体使用这个。比如远处的山,山上可能有树啥的,都使用这种。这个跟地图分块有关。

情况(2):在导航范围内的,角色能够到达的区域使用这个。比如地板。

情况(3):在导航范围内的静态障碍物使用这个。

情况(4):用于其他玩家及NPC(包括怪物)。属于动态障碍物。他们的 NavMeshObstacle 组件是放在 Prefab 中的,提前就设定好的。

主角:使用情况(1)。身上绑定一个 NavMeshAgent。他在寻路的过程中,自然就会绕过其他玩家和NPC。只有主角使用应该不会很耗吧?

 

这篇文章说明了 Unity 的 Nav Mesh 遇到障碍时并不会智能地绕过(障碍没有勾选 Carve,或者是绕过其他 agent 时):

但是他推荐了另一个可以用的库(方案好像就是跟勾选 Carve 一样的):

http://answers.unity3d.com/questions/396867/getting-navmeshagents-to-avoid-obstacles-effective.html

agent既会绕过其他agent,avoidance priority 越低表示优先级越高,优先级越高的会‘推’优先级越低的。这个‘推’表现不太好,也没有解决方案。

如果说除了主角以外,其他玩家和NPC都用 Obstacle ,首先 Obstacle Carve 不能是 true,(猜的),因为会很卡。

如果 Carve = false,那么实际上不能动态寻路。agent在查找路线的时候是不会考虑这些  Carve=false的 Obstacle 的,导致他碰到这些障碍物时,根本不会绕弯,很容易卡住。

asset store 上面有一款 <Dynamic Navigation> ,不知道能不能解决问题。

 或者是 <A* Pathfinding Project Pro>

 

 寻路需求:

   
主角 客户端计算寻路
功能NPC 通常不动
怪物和寻路NPC 由服务器计算寻路,然后同步给客户端
其他玩家 由他自己的客户端计算寻路,发给服务器,服务器再同步给客户端

 

主角静态寻路

主角动态寻路:进行静态寻路的过程中,如果被怪物或其他玩家阻挡,则必须要重新计算路径。不可以‘推动’怪物或其他玩家。

posted on 2014-06-29 11:56  AnswerWinner  阅读(6775)  评论(0编辑  收藏  举报

导航