unity中NavMeshAgent有关知识
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为我们提供了这样⼀个组件,我们为啥不⽤呢?我们先来举⼀个例⼦吧,这样学起来也好理解⼀些。
在Inspector下,我们可以看到NavMeshAgent组件的各个属性:
欢迎词语
这⼏个属性我简单的解释⼀下:
Radius:导航代理的半径,我们可以适当的调节⼀下这个值年终奖缴税
Speed :这个属性代表这个导航⽹格代理寻路时可以达到的最⼤速率
Acceleration :加速度,表⽰代理的速度从0加速到Speed时的最⼤的加速度
Angular Speed :最⾼的⾓速度
Stopping distance :制动距离,当代理据⽬的地的距离⼩于这个值时开始减速
Auto Traver OffMesh Link :⾃动移动并关闭OffMeshLinks,这个选项对于我们利⽤程序来操纵后⾯我要介绍的OffMeshLink很关键,
Auto Repath ⾃动重新寻路,如果发现现有路径已失效,那么它将获得新的路径,这个选项我们⼀般将其勾选上
Height :导航代理的⾼度。
Ba Offt :基本偏移,我们可以通过调整这个变量来调整代理⾃⾝的包围盒
Obstacle Avoidace Type :代理躲避的⽔平,⼀般我们选默认的High Quality就⾏了
NavMesh Walkable :导航⽹格代理可以通过的⽹格层类型
好了这些属性我们基本上知道了⼀点,但要真正理解它,我们还有很长的路要⾛。我们到头来是要⽤脚本来控制寻路的,也就是说我们必须掌握NavMeshAgent这个类,还是⽼办法,看⽂档吧,记住,⽂档我们必须看,这是我们学习新东西必须做的,那些出视频,出书的没⼀个不是从看⽂档开始的。
我们看NavMeshAgent这个类,Unity菜单:help->Scripting Reference 。我们找到这个类,发现⾥⾯的变量和⽅法还不少呢。这次我不可能将其全部讲解到 , 因为有些我⾃⼰都没⽤过,所以我只讲解我们常⽤的:
NavMeshAgent(导航⽹格代理组件所对应的类)
假使我们的主⾓⾝上添加了⼀个导航⽹格组件,我们⼀般在脚本中这样定义NavMeshAgent类型的成员变量:
private NavMeshAgent nma ;
并在Start或Awake函数中实例化它:
nma = gameObject.GetComponent();
重要变量:
1.destination
我们可以这样对导航⽹格代理设置⽬的地:
大便潜血阳性意味着什么
nma.destination = Vector3类型的值。相当于nma.SetDestination( Vector3类型的值 )
2.stoppingDistance
这个与Inspector⾯板中的Stopping Distance对应,⼀下再不涉及与Inspector⾯板中的属性对应的变量
3.velocity
导航⽹格代理周游时的实时速度,⾮常重要
顾名思义,也就是下⼀个位置,在Update函数中打印这个属性,你会发现打印出的结果与这个导航⽹格代理周游过的路径⼀致
5.steeringTarget(只读)
批评的近义词
这个属性是相当重要的,它指的是导航⽹格代理在导航⽹格中周游时所经过的拐点,这对于制作寻路⽹游同步⾓⾊的Transform是相当重要的,因为导航⽹格的寻路路线是直线,我们只需将其寻路的拐点与旋转⾓度告诉给服务器端,有服务器端⼴播出去,然后再写⼀个执⾏Transform同步的脚本(是特制的)绑定在⾮⾓⾊玩家⾝上就可以了。
6.desiredVelocity(只读)
这个属性说实话我⽤的不多,指的是导航⽹格代理的期望速度,与其当前速度不是等价的。
银耳炒鸡蛋导航⽹格代理离⽬的地还剩的距离,如果其值为0,那么代理已经到达了⽬的地了,所以我们可⼀个这样判断⼀个导航⽹格代理是否到达了⽬的地:
if( ainingDistance == 0 ){
//执⾏⾏为
}
政治题库8.isOnOffMeshLink
导航⽹格代理当前的位置是否位于OffMeshLink,因为这个牵扯到了另⼀个组件,我会在后⾯说的
重要⽅法:
1.SetDestination( Vector3 v )
设置⽬的地,与nma.destination = v⼀样的,你想怎么⽤都⾏,只是这个函数在设置⽬的地成功后返回***e,否则返回fal,就只⽐调⽤属性多了⼀个返回值
2.ActivateCurrentOffMeshLink( bool activated )
社会单位返回值为空
与OffMeshLink有关,当activated为***e激活OffMeshLink,后⾯会讲到的
3.CompleteOffMeshLink ()
让导航⽹格代理完成在OffMeshLink上的周游,后⾯会讲的
4.Move( Vector3 v )
让导航⽹格代理朝向量v的世界坐标系⽅向平移v的长度
5.Stop()
让导航⽹格代理停⽌寻路,但此寻路状态可以靠下⾯⼀个函数恢复到寻路状态,并且⽬的地也与上次⼀样
天空的颜色
6.Resume()
恢复寻路状态,此时⾓⾊会在上⼀次执⾏了Stop函数停下来后恢复当时的状态,⽬的地为上⼀次的⽬的地
这8个属性与Inspector⾯板上的各个属性并且和这6个函数我们⼀定要好熟练掌握,这关系到我们是否能熟练书写寻路脚本。还有⼀些函数我这⾥没有介绍,就留着读者⾃⼰研究研究吧。