【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
我们来实现一个鼠标点击指定位置,然后角色会自动移动到点击的位置。
这里我们简单梳理一下逻辑:
-
鼠标点击屏幕
-
以鼠标点击的位置,向相机朝向的方向发射一条射线
-
射线命中地面,返回命中的点(Destination)
-
通过NavMeshAgent让角色移动到Destination
下面是C#代码(将这个脚本挂载在角色身上即可使用)
using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.AI;
public class MouseManager : MonoBehaviour
{
//定义一个Unity事件,参数是Vector3,表示要移动的位置
public UnityEvent<Vector3> onMouseClick;
//角色的NavMeshAgent组件
private NavMeshAgent _agent;
//用于存储射线命中信息
RaycastHit hitInfo;
private void Awake()
{
_agent = GetComponent<NavMeshAgent>();
}
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;
}
}
}