Unity中的自动寻路方法

发表于2018-01-19
评论0 8.5k浏览
在游戏制作中,我们经常会用到角色自动寻路这个功能,点击小地图或者场景中的某一处时,角色会自动走向目的地,并且自动避开期间的障碍物。而在Unity中,有多种方法能够实现寻路的功能,下面就给大家介绍下这几种方法。

(一)简单寻路

首先选择需要行走的路块进行烘焙,(点击最上方的Windows 下拉菜单的 Navigation )出现以下界面。

选中需要烘焙的路面以及物体,打上红勾,可以行走的区域选择Walkable,不可行走的选择Not Walkable。
选择完成后,点击右下角的Bake,即可烘焙完成。

烘焙完成也就完成了我们的第一步了。

在需要寻路的人物上,加上自动寻路Nav Mesh Agent组件,接下来再写个简单的小脚本,就可以让我们的人物动起来啦。

    public NavMeshAgent Nav_Npc;    <span style="color:#009900;">//NPC人物  
</span>    public Transform Tra_Target;    <span style="color:#009900;">//目标点  
</span>    private void Update()  
    {  
      <span style="color:#009900;"> //点击鼠标,使NPC到达鼠标点击位置  
</span>        RaycastHit hit;  
        if (Input.GetMouseButtonDown(0))  
        {  
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  
            if (Physics.Raycast(ray, out hit))  
            {  
              //SetDestination()函数:设置或者更新目的地并计算新的行走路径。  
                Nav_Npc.SetDestination(hit.point);  
            }  
        }  
    }  

(二)使用Off Mesh Link 连接组件,做一个跳板,使NPC可以经过跳板AB,来到达目标点。


下面就说一下方法吧,中途遇到个小Bug,搞了好几次终于搞定了。

步骤同(一)。不同的是我们需要在A或B上加一个Off Mesh Link 连接组件,然后将A、B起始点拖拽如组件中即可。然后我们再把需要走的地方烘焙一下,(A、B、地方、大方块)。

注:遇到的Bug:A、B方块不能太大!!!不然就导致我们的小人跳不上去啦。(这个Bug很诡异发火)
 

(三)选择路段行走

使A、B各沿着自己的路线行走。



其实也很简单,下面来解说一下。

还是在Navigation界面,选择Areas给红蓝两条路添加自定义标签,


然后返回Obj界面,选择红色道路对应标签(以红色为例)



然后选择红色小人,更改组件中的Area Mask,可以走哪条线路,就勾那个。接下来烘焙一下,就可以运行来,会发现红色只走红色道路到达对面。


 

(四)障碍物组件

NavMeshObstacle 导航网格障碍

导航网格躲避的障碍。

下面圣典的解释,再添加一些自己的话,使其比较容易理解。

障碍仅影响代理的躲避行为而不是寻路。这意味着当测绘路径时代理将会忽略该障碍,但是沿着路径移动时代理将会在障碍的附近回避。

如果启用carving,因此测绘路径时将会避免该障碍。(可以理解为没有烘焙此障碍物,不能通过。【实际事实是烘焙过的】)这意味着如果说障碍阻塞缺口,寻路将会寻找一个替代路线给目标。(也就是绕行)。


没有启用carving,障碍将会在导航网格上创建一个临时的“门”(路径是已被烘焙过的,但门是关着的)。该缺口(门)将会被寻路认可,代理将会朝缺口前进但是不可能通过缺口直到该障碍被清除。 (设置enable = flase,即障碍物清除)

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论