标题: Unity里面的自动寻路(二) [打印本页] 作者: wyb314 时间: 2012-11-27 14:41 标题: Unity里面的自动寻路(二) 接着我的 上一篇自动寻路文章,这一次我们就来学习一下与自动寻路有关的组件吧。Unity中与自动寻路相关的组件主要有两个:NavMeshAgent ( 又称导航网格代理 ),Off Mesh Link( 分离网格链接 )。这两个组件的作用与使用范围是不同的,我们唯一可以确定的是我们必须烘焙地形,产生NavMesh(导航网格)。因为导航网格决定我们的角色(带有导航网格代理的角色)活动的范围。NavMeshAgent组件需要附着寻路的角色身上,比如怪物,而OffMeshLink这个组件主要是用来构造寻路角色的寻路路径的某个部分,比如我们有时需要怪物在寻路过程中从一个固定的地方移动到另一个固定的地方,这将会在我下面的例子中清楚的看到。好了,甭废话了,让我们开始吧!
首先,我们先来了解一下NavMeshAgent组件,这个组件是Unity3d提供的寻路系统的核心组件。官方是这样解释的:The NavMeshAgent component is connection with pathfinding,and is the place to put information about how this agent navigates the NavMesh 。意思大致是这样的:NavMeshAgent组件是关于寻路的,它是一个用来存放代理周游导航网格的路径信息的平台。那么代理又是什么呢?原来,角色的移动是要依靠代理来做的,每一个附着这个组件在寻路的过程中都是利用代理进行的,这也就是这个组件为什么叫导航网格代理的原因。每一个你需要让它具有自动寻路功能的角色必须要附着这个组件,除非你利用其它的寻路算法,但那样做实在是太复杂了,因为考虑的情况太多了,然而Unity为我们提供了这样一个组件,我们为啥不用呢?我们先来举一个例子吧,这样学起来也好理解一些。
我接着我上一篇文章中的工程,新建了一个Scene,给了它一个名字:TestNavgation2。然后这个场景里面也需要一个地面,我还是用Cube来做。这次我先向这个平面上建一个Spere,重命名为Hero,并且给它加上一个NavMeshAgent组件,方法:Unity菜单,Component->Navgation->NavMeshAgent。给Hero上个颜色就像下面截图一样:
选中Hero,在Inspector下,我们可以看到NavMeshAgent组件的各个属性:
这几个属性我简单的解释一下:
Radius:导航代理的半径,我们可以适当的调节一下这个值
Speed :这个属性代表这个导航网格代理寻路时可以达到的最大速率
Acceleration :加速度,表示代理的速度从0加速到Speed时的最大的加速度
Angular Speed :最高的角速度
Stopping distance : 制动距离,当代理据目的地的距离小于这个值时开始减速
Auto Traverse OffMesh Link :自动移动并关闭OffMeshLinks,这个选项对于我们利用程序来操纵后面我要介绍的OffMeshLink很关键,
Auto Repath 自动重新寻路,如果发现现有路径已失效,那么它将获得新的路径,这个选项我们一般将其勾选上
Height : 导航代理的高度。
Base Offset : 基本偏移,我们可以通过调整这个变量来调整代理自身的包围盒
Obstacle Avoidace Type : 代理躲避的水平,一般我们选默认的High Quality就行了
public class SetHeroDes : MonoBehaviour {
public Transform ds;//目的Cube的Transform
private Vector3 origin;//存储导航网格代理的初始位置
private NavMeshAgent nma;//存储导航网格代理组件
我们可以清楚的发现,我们的Hero越过了重重阻壑,终于到达了目的地。可是问题此时又随之而来了:如果我们将Hero中的导航网格代理组件中的Auto Traverse Off Ms选项给去掉,它还会越过重重沟壑到达我们的目的地吗?实验证明这样做是无法成功的。官方文档对这个勾选的解释为:
Automate movement onto and off of OffMeshLinks。大致是这样的:自动移动并且将OffMeshLinks关闭。你想,OffMeshLink都关闭了,Hero还怎么过来呢?
接下来我再来介绍OffMeshLink组件的用法了,操作非常简单:
1.新建连个空的GameObject或者你用模型也行,分别取名为StartPoint和EndPoint。为了便于识别,我用的是Sphere,给它上个绿色,并调节StartPoint的位置为Plane1上面,EndPoint的位置咋Plane2上面;
看到没,只生成了一条样条线。这就是我们自己做的OffMeshLink。我们可以编写一些简单的脚本来测试一下Hero此时是否会到达Plane2上的目的地。我想我们还会碰到一些问题的,但我觉得这些问题都不难解决,只需要花些时间尝试。那么最后留给读者一个问题,如果我们打开两个平面的OffMeshLink,那么Hero到底是从我们自定义的OffMeshLink上掠过还是从Plane自身生成的OffMeshLink上掠过?还有,如果我们将Hero身上的Auto Traverse Off Ms勾选给去掉,那么是不是犹如前一个实验一样发生越不过去的问题?这个问题如果弄清楚了,我的这篇帖子也就完成了它的使命了。好了,下次我准备重点讲解导航网格层的运用,这是重点中的重点。那么我们下次再会!