unity3d——自带寻路Navmesh (三)(转)

 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下如下两个例子,先看看完成的效果:动画

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

 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不一样小队分不一样路线进攻的寻路,红绿蓝三个队伍分别根据三条路线进攻。设计

第二个例子是动态的控制道路的开关。当吊桥打开时,道路不通,当吊桥放下时,道路能够通行。教程

先来讲说第一个例子吧,第一个例子其实很简单,只须要在以前两节的基础上修改一下层的设置就能够了。文档

 

先来分析一下咱们的地形,为了作这个例子,我准备了两个plane分别做为我方基地和地方基地,而后用plane简单的拼了三条线路。it

在我方基地,准备了红绿蓝各三个的小兵(用胶囊代替)。固然小兵身上带着NavMesh Agent组件unity自带寻路Navmesh入门教程(三) - 阿赵 - 有爪的小羔羊阿赵io

 若是把两个plane和三条线路都打上Navigation static的话,就和普通的寻路没有区别,三条路都能走。接下来咱们进行层的设置。入门

 

还记得第一节里面讲过的怎么设置NavMeshLayer吧?基础

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

 如今咱们须要设置Red、Blue和Green三个层,如上图所示。date

 

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

 如今,咱们能够选择路线一,而后在Navigation Layer里面选择Red层了。相应的,路线二选择Blue层,路线三选择Green层方法

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

 Bake出来后,会是上面的效果。

 

道路已经设置好了接下来咱们对小兵身上的NavMesh Agent组件进行设置

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

选择蓝色的小兵,而后找到NavMesh Agent组件里面的NavMesh Walkable选项,这里就是人物能经过的层的选择了。按照刚才层的设计,蓝色的小兵须要勾选Blue层 ,把Red层和Green层取消选择。

 

同理,把红色小兵和绿色小兵的NavMesh Walkable层处理一下。

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

 如今,咱们能够运行了,移动目标点到敌方基地,三种不一样颜色的小兵就会根据不一样的路线寻路进攻了。

unity自带寻路Navmesh入门教程(三) - 阿赵 - 有爪的小羔羊阿赵
咱们第一个目标也就完成了。
 
 
接下来讲一下第二个例子
unity自带寻路Navmesh入门教程(三) - 阿赵 - 有爪的小羔羊阿赵
这个例子我准备了两个平台,中间是一个活动的吊桥,一个带NavMesh Agent组件的角色模型,一个目标点
若是按照以前的操做,咱们能够轻易的让角色在任意位置寻路,但为了让吊桥升起的时候角色不能经过吊桥,咱们须要对吊桥的NavMesh层进行一些设置。
 
unity自带寻路Navmesh入门教程(三) - 阿赵 - 有爪的小羔羊阿赵
和刚才同样,咱们要预先设置了一个叫作bridge的层(在第一节的时候作过)。
 
 
unity自带寻路Navmesh入门教程(三) - 阿赵 - 有爪的小羔羊阿赵
一样的,吊桥选择bridge层
 
这里的操做和上面的例子没什么区别,但此次角色身上的NavMesh Walkable不须要设置,直接Everything就好了。
 
      到了这里,咱们须要经过脚原本控制人物是否能经过吊桥。这里须要用NavMeshAgent.walkableMask来动态修改NavMesh Walkable的值。
      关于吊桥怎样升降,这不是本次讨论的内容,你能够选择直接用位移来控制,或者吊桥直接作好开关的动画也行。
      以前说过,各位最好要有习惯用状态来控制物体。这里的吊桥会有2种状态,一种是开状态,一种是关状态。当开状态时,吊桥断开,人物不能通行,关状态时,吊桥闭合,人能通行。给予这两种状态,咱们给人物身上的NavMeshAgent.walkableMask赋值。
写一段很简单的代码吧:
    private bool open = false;
    private NavMeshAgent agent;
void Start () {
  agent = gameObject.GetComponent<NavMeshAgent>();
 
 }
void Update(){
if(open) agent.walkableMask = 1;
else agent.walkableMask = -1;
}
 
能够了,就是这么简单。
这里为了简便,把赋值写在了UpDate里面,其实这样作是不正确的,不必每帧都检测赋值,只须要把这个赋值写在吊桥开关的控制里面就好了。
我来解释一下其中的意思:
定义了一个状态的开关open,当吊桥打开时open= true;当吊桥闭合时,open = false;至于这个状态时怎样赋值的,各位能够本身试试想办法。
而后假设这个脚本是放置角色身上的,那么在start的时候就获取角色身上的NavMesh Agent组件。固然了,你也能够把脚本放在其余的地方,而后经过赋值来指定agent。
当open为true的时候,人物的walkableMask = 1,意思是只有第一层(就是默认的Default)可让玩家通行。
当open为false的时候,人物的walkableMask = -1,意思是全部层(Everything)均可以让玩家经过。
unity自带寻路Navmesh入门教程(三) - 阿赵 - 有爪的小羔羊阿赵
 
从自定义层的界面咱们能够总结一下,每个层的可经过值,其实就是全面因此层的值相加的总和再加1。或者说是2的(n-1)次方。
除了指定自己的层意外,还能够指定多个层,好比这里假如你想mix一个Default和bridge层都能经过,你能够设定walkableMask = 9,也就是1+8。
 
 
      到此为止,阿赵我对于Unity自带的NavMesh寻路的介绍就结束了。至于NavMesh或者NavMesh Agent组件的各个属性和方法,API文档里面有具体的说明,有兴趣能够具体去看看,我就不一一解释。有不少变化的用法,各位能够本身尝试一下。谢谢你们的支持!
相关文章
相关标签/搜索