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 由服务器计算寻路,然后同步给客户端
其他玩家 由他自己的客户端计算寻路,发给服务器,服务器再同步给客户端

主角静态寻路

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

Unity. Navigation和寻路的更多相关文章

  1. 【Unity笔记】寻路导航Navigation中的区域Areas与消耗Cost

    Navigation寻路导航界面下,Areas分页下是在给导航区域分类(相当于分层),以及为每个分类设置不同的消费Cost,意义在于,导航算法中会计算出的是累加起来消耗最低的路径(不一定是视觉上最短可 ...

  2. unity自带寻路Navmesh入门教程(三)

    继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果:   第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...

  3. unity自带寻路Navmesh入门教程(二)

    上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标:   由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分 ...

  4. unity自带寻路Navmesh入门教程(一)

    说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加 ...

  5. 【转】unity自带寻路Navmesh入门教程(二)

    http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一 ...

  6. 【转】unity自带寻路Navmesh入门教程(三)

    http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下 ...

  7. 【转】unity自带寻路Navmesh入门教程(一)

    http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后 ...

  8. Unity Navigation自动寻路

    NavMesh(导航网格) 是3D游戏世界中主动寻路的一种技术,如果你想让游戏人物能自动绕开障碍物到达目的地.那你就来学习下 Navigation导航技术吧O(∩_∩)O~ 首先创建一个项目创建Pan ...

  9. Unity导航 (寻路系统Nav Mesh Agent)

    第一种 简单寻路 地面接触到的.到达目标点不用跳跃能够一直走路到达.场景视图中简单搭设几个物体.胶囊体为寻路者,黄球为目标点 红地板,绿色障碍物.现将地板以及障碍物选中 在检视面板设置静态为Navig ...

随机推荐

  1. linux命令存放 bash: xxx command not found

    参考资料:http://blog.sina.com.cn/s/blog_688077cf01013qrk.html 提示:bash: xxx command not found 首先就要考虑root ...

  2. exec方法

    如果 exec 方法没有找到匹配,将返回 null.如果找到匹配项,则 exec 方法返回一个数组,并将更新全局 RegExp 对象的属性以反映匹配结果.数组元素 0 包含了完整的匹配项,而元素 1 ...

  3. 有关PHP的字符串知识

    字符串是由一系列字符组成,在PHP中,字符和字节一样,也就是说,一共有256种不同字符的可能性. 字符串型可以用三种方法定义:单引号形式.双引号形式和Heredoc结构形式. 1.每条指令可要记得使用 ...

  4. HID高级攻击姿势:利用PowerShell脚本进行文件窃取

    0×01 引言 又到了期中考试了,我又要去偷答案了,一直发现远程下载运行exe的方式不太好,容易报毒所以这里打算用ps脚本. 0×02 关于HID HID是Human Interface Device ...

  5. 监听Android CTS测试项解决方案(二)

    二,监听当前测试项是否是Accelerometer Measurement Test测试项 通过第一种方式介绍的,我们可以得到当前处于活动状态的Activity类似监听CTS测试当前的测试项.但是由于 ...

  6. 【Tsinghua OJ】隧道(Tunel)问题

    描述 现有一条单向单车道隧道,每一辆车从隧道的一端驶入,另一端驶出,不允许超车 该隧道对车辆的高度有一定限制,在任意时刻,管理员希望知道此时隧道中最高车辆的高度是多少 现在请你维护这条隧道的车辆进出记 ...

  7. 【LeetCode】172. Factorial Trailing Zeroes

    Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your ...

  8. 解决div里插入img下边缝隙问题

    <html>   <head>   <title> new document </title>   <meta name="author ...

  9. 【转】oracle job相关内容

    每天凌晨2点执行是这样的 dbms_job.submit(v_job,'lv;',TRUNC(sysdate+1)+2/24,'TRUNC(sysdate+1)+2/24'); 还有定义JOB最好是这 ...

  10. LeetCode Majority Element(简单题)

    题意: 给一个数组,其中有一个元素的出现次数已经超过数组的一半大小,请找出这个元素? 思路: 可以扫一遍数组,将这个出现次数过多的元素抵消其他的元素,最后必定留下1个以上的元素,就是它自己了. pyt ...