• Unity自带寻路Navmesh


    自带寻路Navmesh的三大组件:

    1.Nav Mesh Agent:主要挂在寻路物体上

    2.Off Mesh Link:实现区域转移功能(例如,有时不一定只是在地面上进行寻路,可能有些高高的平台,平台与地面是不相连的,使用该组件可以跳到平台上)

    3.Nav Mesh Obstacle:主要挂在障碍物上



    一、基础

    1.选中静态对象,勾选Navigation Static

    2.Window/Navigation,弹出Navigation视图,点击右下角的Bake按钮生成导航网格

    3.在Bake选项卡中调整参数

    4.新建一个胶囊体,Component/Navigation/Nav Mesh Agent,添加导航组件

    5.为胶囊体添加脚本

    [csharp] view plain copy
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class FindObj : MonoBehaviour {  
    5.   
    6.     public Transform targetObj;  
    7.     void Start ()   
    8.     {  
    9.         GetComponent<NavMeshAgent>().destination = targetObj.position;  
    10.     }  
    11. }  


    二、其他功能

    1.设置掉落点

    a.选中所有静态对象,在Navigation视图的Object标签页下勾选OffMeshLink Generation

    b.在Navigation视图的Bake标签页设置Drop Height,点击右下角的Bake按钮



    2.跳跃功能

    a.添加两个对象,分别为start point和end point

    b.对于start point,Component/Navigation/Off Mesh Link,为该组件设置好Start和End

    c.Bake后即可看到连接路径,如果看不到可以调整Bake标签页的Step Height

    d.新建一个胶囊体,Component/Navigation/Nav Mesh Agent,添加导航组件,添加上面的导航脚本


    如果希望上升过程丰富一些,比如播放一个爬梯或者飞行的动作,那么完全可以通过脚本来自行控制。

    首先需要放弃勾选行进物体Nav Mesh Agent组件下的Auto Traverse Off Mesh Link选项,然后编写相应脚本来实现移动过程。在脚本中通过访问NavMeshAgent.isOnOffMeshLink成员来判断是否到达起点或终点,如果到达则访问NavMeshAgent.currentOffMeshLinkData成员来取得起点和终点的信息,最后实现自己的移动过程。完成移动后需要调用NavMeshAgent.CompleteOffMeshLink()来结束手动过渡过程


    3.为网格分层

    在Navigation视图下的Layers标签页可以设置层,Object标签页可以为物体指定层,Nav Mesh Agent组件的NavMesh Walkable可以指定可行走的层


    4.动态更改可行进层

    关于walkableMask:

    Built-in Layer 0 对应的 walkableMask 为1

    Built-in Layer 1 对应的 walkableMask 为2

    Built-in Layer 2 对应的 walkableMask 为4

    User Layer 0 对应的 walkableMask 为8

    User Layer 1 对应的 walkableMask 为16

    如此类推,即是walkableMask为2的(n-1)次方

    当设置walkableMask 为-1时,表示所有层都能通过

    当设置walkableMask 为0时,表示所有层都不能通过

    当设置walkableMask 为1时,表示只有Built-in Layer 0层能通过

    当设置walkableMask 为2时,表示只有Built-in Layer 1层能通过

    当设置walkableMask 为3时,表示只有Built-in Layer 0和Built-in Layer 1层能通过(3 = 1 + 2)

    当设置walkableMask 为8时,表示只有User Layer 0层能通过


    可以通过查看Nav Mesh Agent组件的NavMesh Walkable看到设置walkableMask后的结果


    [csharp] view plain copy
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. //该脚本挂在桥上,桥设置为User Layer 0的那个层  
    5. public class ChangeMovable : MonoBehaviour {  
    6.   
    7.     public Transform moveObj;//寻路的物体  
    8.     public float timer = 0f;  
    9.   
    10.     void Start ()   
    11.     {  
    12.         if (moveObj != null)  
    13.         {  
    14.             moveObj.GetComponent<NavMeshAgent>().walkableMask = 0;  
    15.             renderer.enabled = false;  
    16.         }  
    17.     }  
    18.       
    19.     void Update ()   
    20.     {  
    21.         timer += Time.deltaTime;  
    22.         if (timer > 2f)  
    23.         {  
    24.             moveObj.GetComponent<NavMeshAgent>().walkableMask = -1;  
    25.             renderer.enabled = true;  
    26.         }  
    27.     }  
    28. }  



    5.Nav Mesh Obstacle组件(动态路障)

    为路障挂上该组件,当该组件enable为true时,不可通过,否则可以通过


    该方法与设置可行进层的区别:

    使用可行进层时,动态物体会在中断处暂停行进而等待新的路径出现后再继续行进,意味着在暂停的时候,物体的加速度为0;

    而使用动态路障时,物体将不会暂停,而是一直在运动并试图绕过障碍来向目标点接近,意味着物体保持着一个加速度。


    6.防止一群寻路的物体围住目标点:

    设置Nav Mesh Agent组件中的Obstacle Avoidance Type为None,即可以让寻路物体互相穿过

  • 相关阅读:
    O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素(转)
    北京网选赛第二题(最大仰望角度)
    最小圆覆盖(随机增量法&模拟退火法)
    模拟退火算法A Star not a Tree?(poj2420)
    模拟退火算法(run away poj1379)
    模拟退火算法(西安网选赛hdu5017)
    最小费用流判负环消圈算法(poj2175)
    中国邮递员问题(一)
    破坏行动问题
    进化树问题
  • 原文地址:https://www.cnblogs.com/jiangshuai52511/p/6825815.html
Copyright © 2020-2023  润新知