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 | 由服务器计算寻路,然后同步给客户端 |
其他玩家 | 由他自己的客户端计算寻路,发给服务器,服务器再同步给客户端 |
主角静态寻路
主角动态寻路:进行静态寻路的过程中,如果被怪物或其他玩家阻挡,则必须要重新计算路径。不可以‘推动’怪物或其他玩家。
Unity. Navigation和寻路的更多相关文章
- 【Unity笔记】寻路导航Navigation中的区域Areas与消耗Cost
Navigation寻路导航界面下,Areas分页下是在给导航区域分类(相当于分层),以及为每个分类设置不同的消费Cost,意义在于,导航算法中会计算出的是累加起来消耗最低的路径(不一定是视觉上最短可 ...
- unity自带寻路Navmesh入门教程(三)
继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路 ...
- unity自带寻路Navmesh入门教程(二)
上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标: 由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分 ...
- unity自带寻路Navmesh入门教程(一)
说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加 ...
- 【转】unity自带寻路Navmesh入门教程(二)
http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一 ...
- 【转】unity自带寻路Navmesh入门教程(三)
http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下 ...
- 【转】unity自带寻路Navmesh入门教程(一)
http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后 ...
- Unity Navigation自动寻路
NavMesh(导航网格) 是3D游戏世界中主动寻路的一种技术,如果你想让游戏人物能自动绕开障碍物到达目的地.那你就来学习下 Navigation导航技术吧O(∩_∩)O~ 首先创建一个项目创建Pan ...
- Unity导航 (寻路系统Nav Mesh Agent)
第一种 简单寻路 地面接触到的.到达目标点不用跳跃能够一直走路到达.场景视图中简单搭设几个物体.胶囊体为寻路者,黄球为目标点 红地板,绿色障碍物.现将地板以及障碍物选中 在检视面板设置静态为Navig ...
随机推荐
- NTP服务器的配置
安装cloudera Manager的时候,必须要求集群的主机之间时间同步,搭建一个NTP服务器的思路是,首先通过一台主机master与外网进行时间同步,然后其他的slaver主机与主机master进 ...
- CSS引入方式的区别详解
在web前端开发中,CSS是一种用来表现HTML或XML等文件样式的语言.很多处于web前端初学阶段的朋友,很多人都不知道CSS引入方式存在三种方法,css引入方式分别为标签内联书写.页面头部书写.外 ...
- 功率与dbm的对照表
功率与dbm的对照表 分类: 嵌入式 功率与dbm的对照表 对于无线工程师来说更常用分贝dBm这个单位,dBm单位表示相对于1毫瓦的分贝数,dBm和W之间的关系是:dBm=10*lg(mW)1w的功 ...
- selectors实现高并发
1. 下面的例子,客户端给服务端发送消息,服务端把消息返回 server #!/usr/bin/env python import selectors import socket import tim ...
- Python运算符与表达式
Python运算符包括赋值运算符.算术运算符.关系运算符.逻辑运算符.位运算符.成员运算符和身份运算符. 表达式是将不同类型的数据(常亮.变量.函数)用运算符按照一定得规则连接起来的式子. 算术运算符 ...
- HDU 4054
http://acm.hdu.edu.cn/showproblem.php?pid=4054 模拟题,对一个字符串的每个字符输出16进制表示的数字,每行处理16个字符,后面再把这16个字符输出,大小写 ...
- 不错的nginx文章,找个时间好好看下。
http://blog.csdn.net/chosen0ne/article/category/915324
- 织梦dedecms 用交叉栏目时arclist标签调用不出内容文章的问题(纯转载)
本文转自:http://www.cnblogs.com/cnteam/articles/4056702.html 最近用了交叉栏目发现当为手动指定交叉栏目ID时用arclist标签不能调出相关文章最后 ...
- 148. Sort List
Sort a linked list in O(n log n) time using constant space complexity. 代码如下: /** * Definition for si ...
- clipToBounds
最近在开发H5平台的iOS移动侧,遇到些问题,随手记录下来. 1 UIView的clipToBounds 窗口裁剪,默认是NO,表示如果父窗口的大小已经不足以显示子窗口,也不进行裁剪,而是显示,但这时 ...