阅读 631

Unity 之 基础寻路 -- NavMesh简介和使用示例

自动寻路就是AI中的一个十分重要的分支,其算法异常复杂。Unity中提供的这套非常成熟的组件来为我们解决这一难题。

NavMesh寻路系统的操作步骤:

对场景中的物体进行标记,然后进行路径烘焙,产生网格数据

为要进行寻路的物体添加寻路组件(NavMeshAgent)

通过NavMeshAgent组件的属性或方法进行移动

Bake烘焙参数面板

  • Radius:半径。半径数值越小,生成网格面积越大,越容易靠近被烘焙过的静态物 体。

  • Height:高度。整体网格可以烘焙到的高度。1和2可以理解为寻路者的半径和高度

  • Max Slope:最大斜坡角度。角度越大,代理越能爬坡 ,超过这个坡度寻路者则无法通过。

  • Step Height:台阶步高。步高越大,导航代理迈过台阶的能力越强(可达到或代替跳跃效果)。

  • Drop Height:代理跳落高度。(只能往下跳,不可往上跳)。表示寻路者可以跳落的高度限。

  • Jump Distance:代理跳跃距离。(往远处跳跃的距离)。 表示寻路者的跳跃距离极限

  • Advanced高级模式(最好别动.)

  • Manual Voxel Size 导航烘焙的像素效果

  • Min Regon Area:网格面枳小于该值的地方,将不生成导肮网格。

  • Height Mesh:勾选后,将会保存高度信息。


一个实例:

搭建如图所示的游戏场景:

绿色的地面,黑色的胶囊体作为主角,红色的球作为目标地点,蓝紫色的立方体作为障碍物,,,然后通过菜单栏->Window->Navigation打开Navigation操作窗体,,,然后选中场景中的障碍物和地面,在Naigation中的Object面板下选择Navigation Static,如下图

然后在Bake 面板上点击Back(烘焙)就会出现图一的网格了,,,这样场景就搭建完成了,当然game视图是看不到网格的,,,

最后为主角(黑色胶囊体)添加一个NavMeshAgent的组件,附加如下代码即可完成简单寻路,,

注:引用命名空间 using UnityEngine.AI;

public class MeshlinksDemo : MonoBehaviour {     public GameObject target;  //获取目标点,注意在面板中赋值     NavMeshAgent mr;   //声明变量     void Start () {         //获取到自身的NavMeshAgent组件         mr = GetComponent<NavMeshAgent>();     }     void Update () {         //使用属性将目标点的坐标进行传递         mr.destination = target.transform.position;            //使用方法获取目标点坐标,,和前一行代码作用相同         //mr.SetDestination(target.transform.position);     } } 复制代码


拓展:实现鼠标点击主角寻路

将以上例代码改写为如下所示:

using UnityEngine; using UnityEngine.AI; public class MeshlinksDemo : MonoBehaviour {     NavMeshAgent mr;   //声明变量     void Start () {         //获取到自身的NavMeshAgent组件         mr = GetComponent<NavMeshAgent>();     }     void Update () {                 if (Input.GetMouseButtonDown(0))         {             //获取鼠标点击的点,             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);             RaycastHit rayhit;  //声明RacastHit类型             if (Physics.Raycast(ray, out rayhit))               {                 if (rayhit.transform.name == "Plane") //判断是不是点击地面                 {                     //鼠标点击的点赋值给目标点                     mr.SetDestination(rayhit.point);                 }             }         }     } }


作者:陈言必行
链接:https://juejin.cn/post/7025745909870755871

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐