Unity Navigation system自动寻路AI

Navigation system由四部分组成:

1.NavMesh(Navigation Mesh的缩写)
数据结构。用于描述“可以行走的平面”的数据结构。

2.NavMesh Agent
组件。可以自动寻路的角色都需要带的一个组件

3.NavMesh Obstacle
组件。描述角色(agent)需要避开的动态障碍物。

4.Off-Mesh Link
组件。用于描述不能用一般的可行走平面描述的置,如可以跳过的沟渠或围栏,需要打开的门,都可以用Off-Meshnk描述。

有了上面四个东西,就可以实现自动寻路了。简单来说,首先,我们需要用NavMesh记录一下哪些面可以让我们的角色在上面走动,然后再给我们需要自动寻路的角色挂上NavMesh Agent就可以了。先来简单实现一下:
1.先创建一个Cube,并拉伸一下

这里写图片描述

2.打开创建NavMesh的窗口:Window->Navigation
3.打开Navigation窗口中的Object栏,然后选中我们创建的Cube,勾选Object栏中Navigation Static.(所有需要参与渲染的物体都要勾选上这个)
4.点击Bake栏中的bake按钮。
我们可以看见Cube上面出现了一块蓝色的面,这就是NavMesh在场景中的样子,也就是说蓝色部分是角色可以移动的面。

这里写图片描述

5.现在再创建一个角色,我们创建一个圆柱体代表一下。

这里写图片描述

正如前面说的,要给我们的角色添加一个agent组件。
这里写图片描述

6.emmm……..怎么还不动。。。因为还没告诉角色该往哪走。所以现在给角色添加一个脚本,用这个脚本来告诉他该往哪儿走。
这里写图片描述

注意:需要添加命名空间AI
destination属性是NavMesh Agent的目标点。

7.现在一切都准备就绪,运行起来。我们只要点击Cube蓝色区域,角色就会移动过去。

8.现在给场景中添加一些静态的障碍物,看他能否绕开他们到达目的地。添加几个Cube,然后调节他们的大小,在把他们在Object栏中的Navigation Static勾选上,最后点击一下Bake栏中的bake按钮。
这里写图片描述
9.运行:
这里写图片描述

10.再来试试斜面,角色是否可以正常移动上去
只要斜坡的倾斜度在要求内就可以Bake成功(倾斜度可以自己设置这里写图片描述

11.最后来用一下Link,我们放入两个高台用于实验,在创建两个空物体来标记link的起点和终点,实现的效果就是角色可以在起点和终点间转移。
这里写图片描述
offNavMeshLink组件挂在Link物体上。

12.然后运行:
这里写图片描述

可以看到,offMeshLink是有效的,并且角色的AI会让他自动找到一条最短的路线到达目的地。(添加好组件,起点,终点即可,不需要再次bake)。在这个过程中通过用代码播放恰当的动画,既可以达到爬楼梯,跳跃等效果。


下面总结一下各部分的细节:
NavMesh窗口
1.打开NavMesh窗口:
Window->Navigation
1.2Object设置:(每个GameObject是单独的)
这里写图片描述
a.Scene Filter(过滤器):这个选项不是太要紧,可以通过Scene视图直接选中物体
All:在Hierarchy中显示所有GameObject
Mesh: 在Hierarchy中显示有Mesh Renderer组件的GamObject
Terrains: 在Hierarchy中显示所有Terrain

b.Navigation Static: 所有需要参与渲染的物体都要勾选。(也可以在物体的Inspector面板右上角的static旁的三角标处选中)

c.Generate OffMeshLinks :是否自动生成OffMeshLink(前面提到过的组件)(同样可以在inspector面板同上位置设置)

d.Navigation Area:生成的NavMesh的类型,用于区分不同的区域,地面,水,沼泽随你设置(可以在Areas设置)。

b.Navigation Static: 所有需要参与渲染的物体都要勾选。(也可以在物体的Inspector面板右上角的static旁的三角标处选中)

c.Generate OffMeshLinks :是否自动生成OffMeshLink(同样可以在inspector面板同上位置设置)

d.Navigation Area:生成的NavMesh的类型

1.3Bake设置
这里写图片描述
a.上半部分为图示
b.Agent Radius 决定agent的中心到墙或者边界最近的距离
c.Agent Height 决定agent 可以通过的最低的空间
d.Max Slope 决定 agent 可以爬得上的最陡的斜坡度数
e.Step Hight 决定agent 可以跨上的最高的台阶
f.Drop Height 当高度低于这个值时会自动生成OffMesh Link
g.Jump Distance 当跨度低于这个值时会自动生成OffMesh Link
h.Voxel Size 调整NavMesh的精度(一般默认即可)。
i.Min Region Area 会把单独存在的低于这个值的可行走区域剔除。有个列外:NavMesh是创建一些平行的小格子上的(Scene中能看到白线),如果一个面积比Min Region Area设置的小的面在格子线上时,将不会被剔除。
这里写图片描述
j.Height Mesh 勾选上时 agent上台阶时会一节一节上去(存在抖动),不勾选时,agent会平滑的上去
Bake 按钮:计算出可行走区域,计算完成后,可行走区域在Scene视图中会以蓝色的凸多边形表现,并且会在和Scene同名的文件夹中保存一份NavMesh的数据文件。
Clear 按钮: 清除NavMesh数据,会删除场景中的NavMesh多边形和文件夹中的NavMesh数据文件。

1.4.Areas设置
Navigation Areas定义了不同的区域类型。在寻找路径时低的cost区域优先级将会更高。此外每个NavMesh Agent 有一个Area Mask属性可以选择该Agent可以移动的区域类型。
这里写图片描述

NavMesh Agent

这里写图片描述

1.Agent Type : 设置Agent类型,Agent类型在Navigation面板中的Agents中设置。
这里写图片描述
a.Name:Agent类型的名字
b.Radius: Agent半径,用于计算和其他agent和障碍物的碰撞
c.Height:可以走过的最低高度
2.Base offset: 圆柱碰撞体相对于transform原点的偏移
3.Speed:最快的移动速度
4.Angular Speed:最快的旋转速度
5.Accelerat : 最快的加速度
6.Stopping distance: 距离目标多近就会停止运动
7.Auto Barking: 刹车。当靠近目标点的时候会自动减速。如果在多个点之间巡逻,最高禁用这个。
8.Quality:障碍物躲避效果的质量。如果有很多的agent可以把这个调低来节省CPU。如果设置为none,那么只会处理碰撞而不会试图去避开。
9.Priority:在移动的时候,高优先级的Agent会把低优先级的Agent的撞开,且差距越多撞开效果越明显。
10.Auto Traverse OffMesh Link 勾选这个将会自动越过off-mesh Link。
11.Auto Repath: 当路线失效时会自动重新找一条路线,如果找不到了,就会找一个到最靠近目标点的路线。
12.Area Mask:选择此Agent可以移动的Area。

常用函数:
ActivateCurrentOffMeshLink 激活或禁止当前off-MeshLink.
CalculatePath 计算到某个点的路径并储存
CompleteOffMeshLink 完成当前offMeshLink的移动
Move 移动到相对于当前位置的点
ResetPath 清除当前路径
SetDestination 设置目标点
SetPath 设置一条路线
Warp 瞬移到某点

NavMesh Obstacle
这里写图片描述

Crave:当勾选此项,将会在NavMesh上挖一个洞。此项适合障碍物静止时。
Move Threshold:该参数代表该障碍物的移动的极限距离超过这个参数时,才会重新雕刻这个障碍物。
Time To Stationar: 障碍物静止不动多少时间后会重新雕刻导航网格

Carve Only Stationar:勾选此参数时,只有在障碍物静止时会对它导航网格进行雕刻。

Off-Mesh Link
这里写图片描述
Start: 开始的位置
End:结束的位置
Cost Override:
Bi Directional:是否双向都可以运动,若不勾选,只能start到End.
Activated:此link是否可以被自动路找到。
Auto Update Positions:若勾选,则当End点移动时会重新设置路线。否则,即使End点移动了路线也不会变动。
Navigation Area:定义此Link的area类型,可以通过agent中的mask判断该agent能否通过这个link。

虽然这个AI系统省去了我们的很多麻烦,但还是有些不方便的地方,如不能渲染出竖直方向的NavMesh,不能做到动态的Bake,不能去实现一些有趣的玩法和随机地图的生成功能,不过高级NavMesh将会完成Unity自带NavMesh未完成的使命。

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity NavigationUnity引擎中的一个功能模块,用于实现游戏中的动态寻路。它可以让游戏角色在复杂的地形中自动寻找最短路径,并避免障碍物。Unity Navigation使用了A*算法和导航网格来实现寻路功能。开发者可以通过设置导航网格的大小和分辨率来控制寻路的精度和性能。同时,Unity Navigation还提供了一些API和事件,方便开发者对寻路过程进行控制和处理。 ### 回答2: Unity Navigation 动态寻路是一种用于游戏开发的寻路算法,主要用于让游戏中的角色进行自动的寻路和移动。 在使用 Unity Navigation 动态寻路的时候,通常需要为游戏中的场景和角色建立一个导航图。导航图是一种用于描述场景的二维网格,其中包含了场景中的所有可行走区域和障碍物。导航图的建立通常需要依赖于场景建模软件和 Unity Navigation 工具。 一旦导航图建立完成,就可以通过 Unity Navigation 工具为游戏中的角色生成一个自动寻路AI。这个 AI 可以根据场景中的导航图来自动寻找到达目标的最短路径,并移动到目标位置。 在使用 Unity Navigation 动态寻路的过程中,还可以对寻路的参数进行调整,如搜索速度、起始点、寻路目标等。这可以帮助优化游戏中的自动寻路效果,使得角色能够更加高效地移动和执行任务。 总的来说,Unity Navigation 动态寻路是一种实用的寻路算法,在游戏开发中得到了广泛的应用。它可以使得游戏中的角色表现更加自然和逼真,提升游戏的体验和玩家的参与度。 ### 回答3: Unity Navigation是一个可以用于游戏中角色的寻路系统,Unity Navigation的动态寻路是指在游戏运行时,根据角色的移动和场景的变化,动态生成角色的寻路路径。 在使用Unity Navigation动态寻路时,需要先将场景中的导航网格生成器进行设置和布置。导航网格是指游戏场景中被划分成多个网格的区域,通过导航网格生成器对这些网格进行划分和连通,构建出可供角色行走的寻路路径。设置完成后,可以通过代码对生成的导航网格进行修改,包括增加、删除、移动网格等。 当场景中的物体发生移动和场景发生变化时,导航网格需要进行重新计算,重新生成新的寻路路径。此时,可以通过使用Unity NavigationNavMeshLink组件,将已有路径和新生成的路径连接起来。NavMeshLink组件可以自动将两个不同寻路网格之间的路径连接起来,避免角色出现异常的跳跃行为。 在角色进行寻路时,需要使用Unity Navigation中的NavMeshAgent组件。NavMeshAgent组件是一个负责控制角色行走和跟踪路径的组件,可以通过代码设置角色的移动速度、加速度等属性。同时,NavMeshAgent组件还支持对角色进行避障和避免碰撞等特殊处理,确保角色在行走过程中不会出现卡住等异常情况。 总的来说,Unity Navigation动态寻路是一种可以让角色在游戏中自动寻找路径的技术,可以让游戏更加流畅和自然,提高游戏的可玩性和趣味性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值