unity自带寻路Navmesh入门教程
来源:互联网 发布:红警网络进不去 编辑:程序博客网 时间:2024/04/25 05:10
http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/
unity自从3.5版本之后,增加了NavMesh寻路的功能。在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能。阿赵我也使用过A*寻路插件,A*的原理并不复杂,有兴趣的朋友可以自己百度一下。不过由于不是自带的功能,所以在设定网格和烘焙的过程难免会出现很多不便。NavMesh作为unity自带的功能,用法和之前的LightMapping烘焙或者遮挡剔除Occlusion Culling有很多相似之处。
这个功能有很多有趣的地方,而且用起来也很方便,我打算分开几篇日志来逐一介绍。这次的目的只是简单的认识一下NavMesh的基本用法,所以暂时不详细的翻译组件每一个参数和功能的意思。
先来看看怎么在unity打开NavMesh功能的窗口吧:
在window下拉列表中可以看到Navgation,点击:
上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标:
由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分是爬楼梯,第二部分是横向跳跃和往下跳落
不管是爬楼梯,还是跳跃,NavMesh都是通过了OffMeshLink来做的。创建OffMeshLink的方法有两种,接下来会通过制作上面的例子来进行说明:
按照上一节所讲的,plane和F1——F5台阶在Navigation面板勾选Navigation Static选项,然后Bake,观察Scene视窗,会发现已经生成了我们所要的NavMesh网格,现在我们可以像上一节那样在plane上面给人物做寻路和移动了,但人物是不会爬楼梯的。
这时候,我们找到L1楼梯,在楼梯的开始和结束的位置放置两个点,这两个点只需要拾取它的位移的,你可以用empty Gameobject来做,我这里为了便于观察,就拿了cube来做。开始点命名为startPoint,结束点命名为endPoint。
注意:startPoint和endPoint的位置要稍微比所在的平面高一点点。
接下来介绍第一种生成OffMeshLink的方法。选择L1楼梯,然后在Component下拉选项中选择Navigation——Off Mesh Link。
选择后,OffMeshLink组件已经添加到了L1的身上,我们可以在Inspector面板看到:
我们把刚才放置在场景里面的startPoint和endPoint指定到OffmeshLink组件的Start和End位置,其他选项默认不改变
再次Bake
现在我们发现,在scene面板里面,在startPoint和endPoint之间生成了一条线,而方向是从startPoint指向endPoint的。
这时候,你应该可以通过移动目标点让角色开始爬楼梯了。但爬上去之后角色暂时不能跳下来,如果把目标点移动到plane上,角色会顺着楼梯爬下来。
我们使用同样的方法对L2进行生成OffMeshLink。这时候,角色应该可以爬两层楼梯了。到此第一个目标完成了。
接下来我们进行第二个目标的制作,首先先来分析一下我们的场景:
我们希望人物能从2.5M的高度往下跳,超过2.5M人物就不能跳了,太高会有危险。然后横向我们希望人物能跳过2米的沟。
根据这个设定,我们的场景会是这样的情况:L1和L2只能通过爬楼梯,L2和L3之间可以跳跃,L3——L5是可以往下跳的。
于是,我们在Navigation面板里面找到Bake栏,Drop Height(掉落高度)填2.5,Jump Distance(跳跃距离)填2,单位都是米
接下来介绍第二种生成OffMeshLink的方法:
我们把L1——L5的物体选中,在Navigation面板的Object栏里面把OffMeshLink Generation选项打上勾
再次Bake,回到scene视窗:
这时候,场景里面会出现很多心的OffMeshLink,这是unity通过计算,把可以跳跃或者下落的地方自动生成了OffMeshLink了。
这时候,你应该已经可以通过移动目标点,让角色进行跳跃和下落了。
进行到这里,我们的第二个目标也完成了。
不过有些朋友可能会提出疑问,在做的过程中,假如没有这个大兵的模型,而是用一个胶囊体来代替人物的话,它爬楼梯和跳跃的时候好像是在一瞬间完成的,没有大兵那个爬楼梯和跳跃动作的过程。如这样:
假如各位需要对越过OffMeshLink时候进行自己的控制,是需要另外写脚本的。我这里简单的介绍一下方法,有兴趣的朋友可以自己试试。
首先各位最好有用状态来控制角色的概念。比如人物可以分为站立、走路、跑步、上下楼梯、横向跳跃和往下掉落几种状态,针对NavMesh来说,人物简单的可以分为站立、正常的NavMesh寻路,和通过OffMeshLink移动几种状态。
先把 Auto Traverse Off Mesh Link选项取消。
然后,当人物在通过OffMeshLink移动的状态(可以用NavMeshAgent.isOnOffMeshLink来判断),获取到当前通过的OffMeshLink:
OffMeshLinkData link = NavMeshAgent.currentOffMeshLinkData;
这样你就能获取到link的开始点和结束点的坐标(link.startPos和link.endPos),这时候你的人物就可以用最简单的Vector3.Lerp来进行移动,当人物的位移到达了结束点的坐标,人物的OffMeshLink移动状态就可以结束,又重新变回正常寻路或者站立的状态了。在这个Vector3.Lerp的过程中,你可以随意的控制人物的爬行或者跳跃的动作。
到这里,第二节的内容结束了。到现在,各位应该已经可以基本掌握了NavMesh寻路的全部正常操作了。接下来,我会在第三节里面简单讲解一下NavMesh的稍微复杂的控制方法,希望大家继续支持阿赵。
顺带一提,可能很多朋友希望我把工程文件提供下载。不过我觉得这样并不是一件好事,因为这几个例子都是很简单的操作,如果各位有耐心跟着阿赵一步步的做下来,应该可以得到你想要的结果。而如果没有耐心一步步的看下来,直接看工程文件,可能会忽略了很多重要的步骤的。
继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果:
第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路线进攻。
第二个例子是动态的控制道路的开关。当吊桥打开时,道路不通,当吊桥放下时,道路可以通行。
先来说说第一个例子吧,第一个例子其实很简单,只需要在之前两节的基础上修改一下层的设置就可以了。
先来分析一下我们的地形,为了做这个例子,我准备了两个plane分别作为我方基地和地方基地,然后用plane简单的拼了三条线路。
在我方基地,准备了红绿蓝各三个的小兵(用胶囊代替)。当然小兵身上带着NavMesh Agent组件
如果把两个plane和三条线路都打上Navigation static的话,就和普通的寻路没有区别,三条路都能走。接下来我们进行层的设置。
还记得第一节里面讲过的怎么设置NavMeshLayer吧?
现在我们需要设置Red、Blue和Green三个层,如上图所示。
现在,我们可以选择路线一,然后在Navigation Layer里面选择Red层了。相应的,路线二选择Blue层,路线三选择Green层
Bake出来后,会是上面的效果。
道路已经设置好了接下来我们对小兵身上的NavMesh Agent组件进行设置
选择蓝色的小兵,然后找到NavMesh Agent组件里面的NavMesh Walkable选项,这里就是人物能通过的层的选择了。按照刚才层的设计,蓝色的小兵需要勾选Blue层 ,把Red层和Green层取消选择。
同理,把红色小兵和绿色小兵的NavMesh Walkable层处理一下。
现在,我们可以运行了,移动目标点到敌方基地,三种不同颜色的小兵就会根据不同的路线寻路进攻了。
private NavMeshAgent agent;
agent = gameObject.GetComponent<NavMeshAgent>();
- unity自带寻路Navmesh入门教程
- unity自带寻路Navmesh入门教程
- unity自带寻路Navmesh入门教程
- unity自带寻路Navmesh入门教程
- unity自带寻路Navmesh入门教程
- unity自带寻路Navmesh入门教程(一)
- unity自带寻路Navmesh入门教程(二)
- unity自带寻路Navmesh入门教程(三)
- unity自带寻路Navmesh入门教程(一)
- unity自带寻路Navmesh入门教程(二)
- unity自带寻路Navmesh入门教程(三)
- unity自带寻路Navmesh入门教程(二)
- unity自带寻路Navmesh入门教程(一)
- unity自带寻路Navmesh入门教程(一)
- unity自带寻路Navmesh入门教程(二)
- Unity自带寻路Navmesh入门教程(三)
- unity自带寻路Navmesh入门教程(二)
- unity自带寻路Navmesh入门教程(一)
- 黑马程序员-IOS基础之C语言流程控制
- 使用wireshark的tshark工具把pcap导出csv格式
- 创业12年后,我为什么创立ZMO企业自媒体联盟
- YT06-背包-1002—Piggy-Bank -(6.27日-烟台大学ACM预备队解题报告)
- List使用linq来查询数据,返回读取var
- unity自带寻路Navmesh入门教程
- 返回类型和return语句
- zend studio 11 创建WDSL文件
- jQuery插件开发模式
- 实现一个string类,包括构造、析构、拷贝构造及operator= 函数
- [Elasticsearch] 部分匹配 (四) - 索引期间优化ngrams及索引期间的即时搜索
- 10分钟详细解读android scrollview
- 使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
- Oracle数据库备份与恢复 - RMAN恢复