> 技术文档 > 【Unity】AI Navigation自动寻路(导航)功能_unity ai navigation

【Unity】AI Navigation自动寻路(导航)功能_unity ai navigation


1.简介以及安装AI Navigation

1.1 简介

AI导航包包含高级组件,允许你在游戏中使用导航网格来整合导航和寻径。有了这个包,你可以在运行时和编辑时构建和使用导航网格,创建动态障碍,并使用链接来允许特定的动作(如跳跃),因为你的角色在导航网格之间导航。

1.2 安装方式

在Window->PackageManager中,搜索AI Navigation,安装导入即可

2.创建导航地面

这一步是为了确定要实现智能导航的区域

2.1 创建地面

在游戏场景中,创建一个3D Object—>Plane

或者,你可以使用自己已经搭建好的地面地形

2.2 添加网格表面导航

选中刚刚创建好的地面,然后添加NavMeshSurface组件

2.3 烘焙地面

在完成上述步骤之后,在NavMeshSurface组件中,点击Bake完成烘焙。

此时可以看到场景中出现了蓝色区域,这些区域就是允许导航的区域。

3.障碍物设置

如果在场景中需要添加阻碍角色移动的物体,你可以为其添加NavMeshObstacle组件

4.添加角色导航代理

在游戏角色身上添加NavMeshAgent,这样你的角色就可以受到智能导航的控制了!

在里面,你可以调整一些角色移动的基本参数,比如Speed(最大移动速度)、Angular Speed(最大转向角速度)、Acceleration(最大加速度)

还有身体的参数:

  • Radius(角色体积半径)

  • Height(角色高度)

  • Priority(权重),用于多角色导航时候的导航优先权设置,越大则越优先进行导航

  • Stop Distance(停止距离),如果你希望角色移动到目标位置时会保持一定的距离,可以设置该参数

  • Auto Breaking(自动刹车),如果希望在移动到目标位置的时候有一个缓慢停止的过程,可以启用该功能

5.实现角色智能导航移动

我们需要给地面在Insprctor窗口中添加一个Tag(我给Tag取名为“Ground”),同时确保地面有MeshCollider

我们来实现一个鼠标点击指定位置,然后角色会自动移动到点击的位置。

这里我们简单梳理一下逻辑:

  1. 鼠标点击屏幕

  2. 以鼠标点击的位置,向相机朝向的方向发射一条射线

  3. 射线命中地面,返回命中的点(Destination)

  4. 通过NavMeshAgent让角色移动到Destination

下面是C#代码(将这个脚本挂载在角色身上即可使用)

using System;using UnityEngine;using UnityEngine.Events;using UnityEngine.AI;public class MouseManager : MonoBehaviour{ //定义一个Unity事件,参数是Vector3,表示要移动的位置 public UnityEvent onMouseClick; //角色的NavMeshAgent组件 private NavMeshAgent _agent; //用于存储射线命中信息 RaycastHit hitInfo; private void Awake() { _agent = GetComponent(); } private void Update() { //将鼠标的位置(鼠标的屏幕坐标)转换为射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //发射射线,hitInfo接收命中信息 Physics.Raycast(ray, out hitInfo) //如果鼠标左键按下,并且命中的目标的Collider不是空的 if (Input.GetMouseButtonDown(0) && hitInfo.collider != null) { //如果命中的目标的Tag是地面(Ground),则激活事件 if(hitInfo.collider.gameObject.CompareTag(\"Ground\")) _agent.destination = hitInfo.position; } }}