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