
·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找
一、导航寻路功能是什么
导航寻路功能是用于计算两点之间的移动路径的功能,在游戏中用于实现玩家或者敌人AI从一个地方避障寻路移动到另一个地方
Unity中的寻路是通过AI Navgation插件实现的,其本质使用的是A星寻路算法的优化与拓展
二、导航网格生成面板
1.导航网格生成面板的打开
1.1.导入AI Navgaition包
Unity2022版本之后,把AI Navigation从本体剥离了出去,要想使用需要先下载安装回来

1.2.打开导航网格生成面板

我们这里学习的是旧版本的导航寻路系统,所以选择打开这个旧版本的窗口
2.导航网格生成面板的参数
Object页签
用于把场景中物体设置为可以烘焙(Bake)的静态物体

Bake页签
用于对设置为静态物体的进行烘焙生成导航网格



Areas页签
设置导航网格的类型

可以给各个区域设置不同的寻路消耗(Cost),Cost越小的路径越容易被优先选择
Agents页签

这个感觉没什么用其实,基本可以不用理他
3.导航网格生成面板的使用
3.1.把所有需要要烘焙的物体设置为静态物体

在Object页签中设置
注意:如果要让两个断开的平面之间可以互相跳跃,需要把
给对应的两个平面勾上
3.2.调整烘焙参数进行烘焙

然后可以看到我们之间设置为静态的物体表面上都烘焙上了一层蓝色的区域,这个区域就是可以移动的区域

这个是跳跃区域,是因为我们之间设置了这两个平面之间
,并且在烘焙设置中设置了
所以就有了。表示可以从这个平面跳跃到另一个平面上
注意:这里是单向箭头是因为我只把下面那个平面勾选了
,而上面那个平面还是
这会导致只能从一个平面跳到另一个,但是不能跳回去。
我们把它打勾之后再烘焙一次就可以看到是双向的箭头了
可以看到中间和左边的平面上并没有,因为我们没有给它们勾选这个

这个是下落区域,是因为我们在烘焙中设置了
。
表示可以从这个平台上跳下来
三、导航网格寻路组件的使用

1.相关参数


Steerting移动设置

Obstacle Avoidance避障设置

Path Finding寻路设置


AreaMask可以选择在哪些区域中移动(没有可以移动的区域的话就不会移动)
2.关键API
![]()
当然肯定要先声明并获取这个脚本的

使用这两个API就可以实现最基本的寻路功能了的已经
(上面那些动图中就有所展示,只用了设置寻路目标点这个API)
using System.Collections;
using UnityEngine;
using UnityEngine.AI;
public class Lesson62_exercises : MonoBehaviour
{
private Animator animator;
private NavMeshAgent agent;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
agent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0)) {
RaycastHit hit;
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit)) {
agent.isStopped = false;
//让对象朝目标点移动 先生成行进路径 然后再移动
agent.SetDestination(hit.point);
}
}
if( Input.GetKeyDown(KeyCode.Space) )
{
agent.isStopped = true;
}
animator.SetInteger("Speed", agent.velocity == Vector3.zero ? 0 : 1); //设置动画的移动
}
可以搭配动画系统使用通过里面的参数
3.其他API
#region 不常用内容
#region 变量
//关键变量
//1.面板参数相关 速度 加速度 旋转速度等等
print(agent.speed);
print(agent.acceleration);
print(agent.angularSpeed);
//2.其它重要属性
//2-1当前是否有路径
if( agent.hasPath )
{
}
//2-2代理目标点 可以设置 也可以得到
print(agent.destination);
//2-3是否停止 可以得到也可以设置
print(agent.isStopped);
//2-4当前路径
print(agent.path);
//2-5路径是否在计算中
if( agent.pathPending )
{
}
//2-6路径状态
print(agent.pathStatus);
//2-7是否更新位置
agent.updatePosition = true;
//2-8是否更新角度
agent.updateRotation = true;
//2-9代理速度
print(agent.velocity);
#endregion
#region 方法
//手动寻路
//计算生成路径
NavMeshPath path = new NavMeshPath();
if( agent.CalculatePath(Vector3.zero, path) )
{
}
//设置新路径
if(agent.SetPath(path))
{
}
//清除路径
agent.ResetPath();
//调整到指定点位置
agent.Warp(Vector3.zero);
#endregion
#endregion
更详细的描述可以F12进去看
四、导航网格连接组件的使用
导航外连接组件是用于实现类似
这个效果的组件,不过它和这个烘焙中生成的不同之处在于,它可以更精准地控制跳跃的起始点与终止点,实现指哪打哪的效果
1.相关参数

- Start:指定跳跃起始点位置
- End:指定跳跃终点位置
- Cost Override:这个跳跃区域的消耗,在寻路过程中,如果除了这个跳跃区域还有其他路径可以走到同一个终点,那这个消耗值会决定最后走的路径是不是它
- Bidirectional:跳跃是否是双向的,打开了之后可以互相跳,否则只能从起点跳到终点
- Activated:是否激活,不激活的话这个跳跃区域是跳不了的
- Auto Update Position:当这个Start和End位置在游戏运行的时候动态变换时,跳跃区域是否跟着动态变换
- Navigation Area:选择这个条约区域属于哪个区域
2.具体使用
2.1.创建两个空物体分布用于跳跃起点与终点的位置


2.2.添加Off Mesh Link脚本

并且把起点位置和终点位置移动进行
2.3.运行检查效果

要是它宁愿走其他路径也不跳这里的话,检查一下是不是Cost太大了。或者不是双向的
五、导航网格动态障碍组件的使用
动态障碍组件是用于在场景上放置一些能够动态改变寻路网格的障碍的时候使用。
比如地图上有一块石头挡住了,玩家无法移动到另一个区域,但是在摧毁了这块石头之后,玩家就可以进到另一个区域了
也就是可以在游戏运行的时候动态改变已经烘焙好的网格的一个物体
1.相关参数


一般对于静止的障碍物,建议打开比较好,这样人物运动到它面前会是真的停下来,而不是继续尝试撞墙看起来
2.具体使用
2.1.创建一个作为障碍物的物体并调整好大小

2.2.添加Nav Mesh Obstacle脚本并调整参数

2.3.运行测试效果
显然没有打开Carve的话在可能会影响一些数据(比如移动速度),导致与之相关联的一些表现,比如动画表现的很奇怪
六、总结
①寻路导航网格可以帮助我们在编辑完成的地图中生成可以移动的网格路径,能够提供区域之间跳跃,下落等的移动方式。而我们也可以通过给不同区域设置不同的消耗来达到各种地形的路径移动选择效果
②寻路导航组件可以帮助我们给游戏中的人物制作寻路避障的功能,通过A星寻路算法在之前生成好了的网格上来获取消耗最小的移动路径进行移动
③跳跃连接组件可以帮助我们更精确地控制两个平台之间的跳跃移动
④动态障碍组件可以帮助我们在一定程度上动态地“清除”一定区域已经生成的网格,让地图寻路看起来更多变
⑤总的来说,组合使用这些组件与功能,可以帮助我们实现基础的人物在地图中的避障寻路效果





&spm=1001.2101.3001.5002&articleId=149311145&d=1&t=3&u=2447c536bdf442458394bd5507745ba6)
1万+

被折叠的 条评论
为什么被折叠?



