unity3D——自带寻路Navmesh入门教程(二)(转)

 转自:http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/blog

上一节简单介绍了NavMesh寻路的基本用法,此次来介绍一下稍微复杂一点点的高低落差以及跳跃的作法,首先来看看此次的目标:教程

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵 
unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 因为博客相册上传GIF有限制,因此我把整个过程切开了2部分上传,第一部分是爬楼梯,第二部分是横向跳跃和往下跳落get

      不论是爬楼梯,仍是跳跃,NavMesh都是经过了OffMeshLink来作的。建立OffMeshLink的方法有两种,接下来会经过制做上面的例子来进行说明:博客

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵
为了作这个例子,咱们预先在场景里面准备了一些物体:摄像机是必须的,一个做为地面的Plane,而后是F1——F5几个高低落差不同的台阶,L1和L2是楼梯模型, 控制人物主体man,还有移动的目标点target。
其中man身上必须带有NavMesh Agent组件,为了观察方便在target身上带了light组件。
 
unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 按照上一节所讲的,plane和F1——F5台阶在Navigation面板勾选Navigation Static选项,而后Bake,观察Scene视窗,会发现已经生成了咱们所要的NavMesh网格,如今咱们能够像上一节那样在plane上面给人物作寻路和移动了,但人物是不会爬楼梯的。it

 

这时候,咱们找到L1楼梯,在楼梯的开始和结束的位置放置两个点,这两个点只须要拾取它的位移的,你能够用empty Gameobject来作,我这里为了便于观察,就拿了cube来作。开始点命名为startPoint,结束点命名为endPoint。io

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 注意:startPoint和endPoint的位置要稍微比所在的平面高一点点。入门

 

接下来介绍第一种生成OffMeshLink的方法。选择L1楼梯,而后在Component下拉选项中选择Navigation——Off Mesh Link。object

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 

选择后,OffMeshLink组件已经添加到了L1的身上,咱们能够在Inspector面板看到:下载

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

咱们把刚才放置在场景里面的startPoint和endPoint指定到OffmeshLink组件的Start和End位置,其余选项默认不改变 方法

 

再次Bake

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 如今咱们发现,在scene面板里面,在startPoint和endPoint之间生成了一条线,而方向是从startPoint指向endPoint的。

 

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 这时候,你应该能够经过移动目标点让角色开始爬楼梯了。但爬上去以后角色暂时不能跳下来,若是把目标点移动到plane上,角色会顺着楼梯爬下来。

咱们使用一样的方法对L2进行生成OffMeshLink。这时候,角色应该能够爬两层楼梯了。到此第一个目标完成了。

 

接下来咱们进行第二个目标的制做,首先先来分析一下咱们的场景:

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 咱们但愿人物能从2.5M的高度往下跳,超过2.5M人物就不能跳了,过高会有危险。而后横向咱们但愿人物能跳过2米的沟。

根据这个设定,咱们的场景会是这样的状况:L1和L2只能经过爬楼梯,L2和L3之间能够跳跃,L3——L5是能够往下跳的。

 

因而,咱们在Navigation面板里面找到Bake栏,Drop Height(掉落高度)填2.5,Jump Distance(跳跃距离)填2,单位都是米

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 

接下来介绍第二种生成OffMeshLink的方法:

咱们把L1——L5的物体选中,在Navigation面板的Object栏里面把OffMeshLink Generation选项打上勾

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 

再次Bake,回到scene视窗:

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

这时候,场景里面会出现不少心的OffMeshLink,这是unity经过计算,把能够跳跃或者下落的地方自动生成了OffMeshLink了。

这时候,你应该已经能够经过移动目标点,让角色进行跳跃和下落了。 

 

进行到这里,咱们的第二个目标也完成了。

 

不过有些朋友可能会提出疑问,在作的过程当中,假如没有这个大兵的模型,而是用一个胶囊体来代替人物的话,它爬楼梯和跳跃的时候好像是在一瞬间完成的,没有大兵那个爬楼梯和跳跃动做的过程。如这样:

unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵 
unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵
的确是这样,由于默认的NaveMesh Agent组件上面是勾选了Auto Traverse Off Mesh Link(自动经过OffMeshLink)选项的。这样的意思是人物只要到了OffMeshLink的开始点,就会自动的移动到OffMeshLink的结束点。 
unity自带寻路Navmesh入门教程(二) - 阿赵 - 有爪的小羔羊阿赵

 

假如各位须要对越过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的稍微复杂的控制方法,但愿你们继续支持阿赵。

      顺带一提,可能不少朋友但愿我把工程文件提供下载。不过我以为这样并非一件好事,由于这几个例子都是很简单的操做,若是各位有耐心跟着阿赵一步步的作下来,应该能够获得你想要的结果。而若是没有耐心一步步的看下来,直接看工程文件,可能会忽略了不少重要的步骤的。

相关文章
相关标签/搜索