unity学习47:寻路和导航,unity2022后版本如何使用 Navmesh 和 bake
目录
1 寻路和导航对移动的不同
1.1 基础的移动功能
1.1.1 基础移动
1.1.2 智能导航寻路
1.1.3 智能导航寻路还可以
2 如何实现这个效果?
2.1 通过地图网格的形式
2.1.1 警告信息 the static value has been deprecated的对应搜索
2.1.3 bake按钮的位置
2.2.1 unity 2022之前
2.2.1 unity 2022之后
2.3 如果遇到 window / 下面没有AI菜单的情况,解决办法
3 地图测试导航寻路准备
3.1 做一些障碍物 和 楼梯等
4 生成地图网格
4.3 可以设置 多种不同体型的 agent 数据
5 题外话:总结关于一个gameObject在游戏里有多个形象
6 用脚本实现移动时导航效果
6.1 具体内容
6.1.1 获得点击位置
6.1.2实现导航移动
6.2 脚本内容
6.3 报错处理
6.4 测试效果 OK
1 寻路和导航对移动的不同
1.1 基础的移动功能
实测有很多差别
1.1.1 基础移动
- 基础的移动可以朝向点选的地方移动
- 比如可以跳下去等等
1.1.2 智能导航寻路
- 但是导航可以让角色移动的同时,避开障碍物,也就是 智能移动/寻路
- 而且 NaviMesh 上显示非蓝色的区域,角色移动时根本不会往哪走
1.1.3 智能导航寻路还可以
- 判断路径,哪些地方是否可通过
- 可以绕着障碍物走
- 可以实现路径的不同区域的过路成本
2 如何实现这个效果?
2.1 通过地图网格的形式
- unity 2023版本以前,点击右上角的 navigation static 可以
- unity 2023版本以后,这个功能已经被弃用, the static value has been deprecated
2.1.1 警告信息 the static value has been deprecated的对应搜索
- the static value has been deprecated
这个警告信息是Unity中的一个已弃用的警告信息,它意味着你正在使用已经弃用的功能。这个信息是由于 Unity 2023 已经不再使用(Deprecated)
GameObjectUtility.FindOrCreateNavMeshSurface
API来处理生成Navmesh。这个警告信息只是告诉你正在使用过时的 API,但不影响你使用 Navigation 功能。如果你想使用Navigation功能但是不想看到这个报错信息,你可以通过在代码中使用新的API来解决这个问题,具体步骤如下:
1.首先,打开“Window > AI > Navigation”面板,并创建一个新的 NavMesh Surface 组件。
2.然后,将该组件添加到场景中的一个GameObject对象上。
3.在代码中,使用以下代码片段,获取对 NavMeshSurface 组件的引用:
NavMeshSurface navMeshSurface = GetComponent<NavMeshSurface>();
4.使用该组件的新 API,即:
navMeshSurface.BuildNavMesh();
这样就可以解决该警告信息,并正确地使用 Navigation 功能。
需要注意的是,由于该API已经弃用了,因此无法保证该解决方案在未来版本的 Unity 中是否会继续有效。因此,如果你想保持你的代码是最新的,建议使用最新的文档和API。
2.1.2 新的navigation bake功能
在Unity 2022版本中,导航系统的Bake按钮位置发生了变化,不再直接显示在菜单中,而是通过添加组件的形式进行烘焙。
在Unity 2022版本中,导航系统的Bake按钮位置发生了变化。原来的Bake按钮被替换为在组件上进行烘焙。具体操作如下:
- 选择场景中的静态物体:首先,确定场景中的静态物体(在整个游戏运行过程中不会发生Transform变化的物体),并将其设置为静态物体(勾选static前面的复选框)。
- 添加NavMeshAgent组件:给需要导航移动的物体添加Navmesh Agent组件。
- 组件上烘焙:在组件上通过添加NavMesh组件来实现烘焙功能。具体步骤如下:
- 打开Unity编辑器,进入Window菜单,选择AI -> Navigation。
- 在Navigation界面中,选择Agent Type并设置相关参数。
- 添加NavMesh组件到需要烘焙的物体上,通过组件参数进行烘焙设置12。
通过以上步骤,可以在Unity 2022版本中实现导航系统的烘焙功能,而无需直接使用Bake按钮。这种变化旨在提高工作效率并简化导航系统的使用13。
新版本的导航系统中没有"Bake"按钮,这是因为Unity在2022.1版本中对导航系统进行了改进。在新版本中,导航系统的烘焙过程是自动进行的,无需手动触发。当您对场景进行更改或添加导航代理时,Unity会自动检测并更新导航数据。因此,您无需手动进行烘焙操作,导航系统会自动处理。这样可以提高工作效率并简化导航系统的使用。如果您在使用新版本的Unity时遇到了导航相关的问题,请提供更多详细信息,以便我们能够更好地帮助您解决问题。
2.1.3 bake按钮的位置
2.2 总结 unity2022后版本如何实现Navmesh 的地图 bake烘焙
2.2.1 unity 2022之前
- 选择要烘焙的gameObject 右上角 静态static,然后 Navigation static
- 然后,在windows下打开AI,打开Navigation , 里面有 Navigation agent 和 bake按钮
2.2.1 unity 2022之后
- 玩家角色身上,添加 NavMeshAgent 的component
- 游戏场景里只需要1个物体,比如我这的wall,选择一个NavMeshSurface.包含bake按钮,也在这儿
- 在windows下打开AI,打开Navigation ,里面只有 Navigation agent 、
- 按前面的bake按钮
2.3 如果遇到 window / 下面没有AI菜单的情况,解决办法
- 如果遇到 window / 下面没有AI菜单的情况, 是安装unity时没安装这个功能包。我就遇到了这个问题
- 需要先打开 package manager ,然后,在unity的包下搜索 navigation
- 然后安装下就有了
3 地图测试导航寻路准备
3.1 做一些障碍物 和 楼梯等
- 让地图有些区域不能直接通过,比如加墙阻隔
- 需要通过楼梯,斜坡才能通过
4 生成地图网格
4.1 地图上1个物体添加新的component : nav mesh surface
- 错误:每个需要参与寻路的 gameObject 都增加一个新component : nav mesh agent
- 正确,只需要在场景内的一个gameObject 新建增加一个新component : nav mesh surface即可。 实测不需要每个物体上都添加
- 然后有bake按钮,点击,全部进行了bake
4.2 navigation Agent设置
- 其中 agents 就是指 寻路的主体,依据这个做的寻路是否可以通过
- 也就是说,寻路导航,是为主角player (大小,身高)量身定做的。而其他单位,比如怪物,NPC等不会受到这些寻路的影响。
4.3 可以设置 多种不同体型的 agent 数据
- 多种不同体型的 agent 数据,相当于多个模板
- 具体的不同的游戏内角色,可以选择属于哪个模板agent
然后不同的导航物体,可以选择属于哪一类
4.4 navigation Agent的详细设置
angent的形状,是一个圆柱形的,和 unity编辑器里的一样
而不是看起来的形状
5 题外话:总结关于一个gameObject在游戏里有多个形象
同样1个gameObject
- mesh render 决定的外观看起来什么样,比如外观的形状
- collider决定的碰撞时,此物体的样子,比如也也时胶囊
- angent的形状 决定navigation 寻路导航的这个物体的样子,比如圆柱形
6 用脚本实现移动时导航效果
6.1 具体内容
6.1.1 获得点击位置
- 点击目标点,获得点击点,仍然使用之前的,摄像机射线 ray
Ray ray1=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray1,out hit))
{
//点击位置
Vector3 point1=hit.point;
6.1.2实现导航移动
- //获取导航代理人
- agent1=GetComponent<NavMeshAgent>();
- agent1.SetDestination(point1);
6.2 脚本内容
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class TestNavMeshAgent : MonoBehaviour
{
private NavMeshAgent agent1;
// Start is called before the first frame update
void Start()
{
//获取导航代理人
agent1=GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
//如果点击鼠标左键
if (Input.GetMouseButtonDown(0))
{
Ray ray1=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray1,out hit))
{
//点击位置
Vector3 point1=hit.point;
//
agent1.SetDestination(point1);
}
}
}
}
6.3 报错处理
- 测试时,遇到这个,我没更新,点了X
6.4 测试效果 OK
- 可以实现智能寻路效果
- 和按键移动的差别,按键移动可以从墙上跳下到对面去
- 但是点击移动,摄像机射线这种方法,角色在墙上也无法移动到对面