转载:http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/
上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标:
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img1.ph.126.net/15j8JX2KUzfd54pWLjTKOQ==/1273674269633495861.gif)
由于博客相册上传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面板看到:
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img5.ph.126.net/q93dGUSSAPBK9Zs5COTPWA==/2694278477092071585.jpg)
我们把刚才放置在场景里面的startPoint和endPoint指定到OffmeshLink组件的Start和End位置,其他选项默认不改变
再次Bake
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img5.ph.126.net/5M85G6l4x4J0wxHdU3LYvw==/1012465491245994685.jpg)
现在我们发现,在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,单位都是米
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img9.ph.126.net/VAg1gIWv0_1a02qUzzJ-1w==/3092847044114458749.jpg)
接下来介绍第二种生成OffMeshLink的方法:
我们把L1——L5的物体选中,在Navigation面板的Object栏里面把OffMeshLink Generation选项打上勾
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img2.ph.126.net/8I51icjkCqNSxjoG7N62Wg==/2603362059614624152.jpg)
再次Bake,回到scene视窗:
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img7.ph.126.net/SKYUrOPs5Jqcmj7HvxaLcA==/2753106747224599537.jpg)
这时候,场景里面会出现很多心的OffMeshLink,这是unity通过计算,把可以跳跃或者下落的地方自动生成了OffMeshLink了。
这时候,你应该已经可以通过移动目标点,让角色进行跳跃和下落了。
进行到这里,我们的第二个目标也完成了。
不过有些朋友可能会提出疑问,在做的过程中,假如没有这个大兵的模型,而是用一个胶囊体来代替人物的话,它爬楼梯和跳跃的时候好像是在一瞬间完成的,没有大兵那个爬楼梯和跳跃动作的过程。如这样:
![unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵](http://img7.ph.126.net/-ztsNoQbmVub1rhcTefOGQ==/2658249680073208127.jpg)
假如各位需要对越过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的稍微复杂的控制方法,希望大家继续支持阿赵。
顺带一提,可能很多朋友希望我把工程文件提供下载。不过我觉得这样并不是一件好事,因为这几个例子都是很简单的操作,如果各位有耐心跟着阿赵一步步的做下来,应该可以得到你想要的结果。而如果没有耐心一步步的看下来,直接看工程文件,可能会忽略了很多重要的步骤的。