unity中Navigation实现自动寻路功能

前言

Navigation可以使物体智能的移动到某个位置,这样可以在游戏完成一些NPC的智能路径和主角的寻路功能

1,对于场景进行渲染

场景的渲染可以告诉角色该走哪里,哪里是障碍物,这样就可以实现对于场景的导航和避免角色撞墙

将场景需要烘培的物体设为静态:

首先选中需要烘培的物体,然后在inspector面板中右上角将物体设为静态物体,这样可以对物体进行烘培
在这里插入图片描述
打开NaNavigation(导航)烘培面板:

在windows中找到AI点击后出现Navigation面板,

在这里插入图片描述
在navigation中对于烘培进行设置:

对于Bake的相关参数进行,修改可以实现渲染的效果,比如攀爬楼梯、跳过沟壑、从高处跳下等功能的实现,调整下面的参数,可以在上面的示意图上实时展示出来

在这里插入图片描述
- 参数的相关含义:

  • Agent Radius:定义网格和地形边缘的距离
  • Agent Height:定义可以通行的最高度
  • Max Slope:定义可以爬上楼梯的最大坡度
  • Step Height:定义可以登上台阶的最大高度(最大高度要小于可通行的最大高度
  • Drop Height:允许最大下落距离
  • Jump Distance:允许最大的跳跃距离

- 渲染后的效果为:

淡蓝色区域即为角色可以移动的区域
在这里插入图片描述
对于Navigation中其他三个选项的设置

  • Object选项
    选中场景中一个物体后,Object中会出现如图选项,基本的设置选项如图,可以通过调整对对象的烘培,使得角色是否可以在该区域移动或者跳跃

在这里插入图片描述

  • Areas面板

Areas主要是用来设置不同区域的权值,这样可以确保角色优先在哪个区域移动(默认Jump权值高,这样在Object将物体设置为Jump时,没路时,物体会选择跳跃,而不是绕一大圈)
在这里插入图片描述

  • Agents面板
    这个面板主要是角色添加Nav Mesh Agent组件时使用的
    在这里插入图片描述

2、可以移动的动态障碍

直接给物体添加Nav Mesh Obstacle组件,通过设置参数,则可以形成动态移动的障碍物:
在这里插入图片描述

对于Carve进行勾选,才可以动态烘培,这样才能实现移动的障碍

3、NPC移动设置

给NPC添加Nav Mesh Agent组件
添加组件后,对相关参数进行设置:
在这里插入图片描述

  • Steering(操纵)
  • Speed:最大移动速度
  • Angular Speed: 行进时的最大角速度
  • Acceleration:最大加速度,控制速度的变化快慢
  • Stopping Distance:制动距离,到达目标点的距离小于这个值
  • Auto Braking:勾选,到达目标点后停止运动,没有缓冲运动

常用API:

  • ActivateCurrentOffMeshLink :激活或禁止当前off-MeshLink.
  • CalculatePath :计算到某个点的路径并储存
  • CompleteOffMeshLink :完成当前offMeshLink的移动
  • Move :移动到相对于当前位置的点
  • ResetPath :清除当前路径
  • SetDestination :设置目标点
  • SetPath :设置一条路线
  • Warp :瞬移到某点
  • remainingDistance:到目标点的距离
  • desiredVelocity:期望速度,方向指向的是到达目标点的最短路径的方向

编写代码控制物体移动

实现让角色通过系列的物体:

 	public GameObject[] pos; //定义系列点的数组
 	private NavMeshAgent nav; //定义一个NPC导航组件(一定要添加在头文件UnityEngine.AI类
 	private int nub = 0;   //定义一个整数

获取物体NavMeshAgent组件:

void Start()
    {
    
    
        nav = GetComponent<NavMeshAgent>();
    }

进行碰撞检测,如果物体达到相应物体,则数组移动到下一个:

    private void OnTriggerEnter(Collider other)
    {
    
    
        if(other.gameObject.tag=="object")    nub++;
    }

最后则是要控制物体导航到指定点,调用API接口destination:

    void Update()
    {
    
    
        if (Vector3.Distance(transform.position, pos[nub].transform.position) >= 0.1f)
        {
    
    
            nav.destination = pos[nub].transform.position;
        }

    }

总结

使用NavNavigation是一个比较复杂的流程,但是掌握方法,就会很简单,多学习多使用

猜你喜欢

转载自blog.csdn.net/xinzhilinger/article/details/109453277
今日推荐