现在游戏中的自动寻路基本就是两种做法 A*算法 和Unity中的导航系统
自动寻路导航的步骤
1.对场景进行烘焙
2.为寻路物体添加NavMeshAgent组件
3.为寻路物体添加脚本 设置寻路物体的目标点触发寻路的方式
在学习导航之前 必须先学习bake(烘焙)烘焙其实就是将模型上的一些信息记录到模型上,比如光照信息等
那么为什么需要进行烘焙,由于在加载场景的时候对于模型上面的光照信息等都需要CPU进行计算,很消耗游戏的性能
为了性能优化,对场景进行烘焙烘焙过之后场景中的光照信息等就记录在模型上面,加载的时候不需要CPU进行计算 从而提高游戏性能 导航烘焙就是选中需要烘焙的物体选择statc中的Navigation Static 在Navigation中Bake 进行烘焙
Agent Radius表示行走面到边缘的之间的距离
Agent Height(代理高度)指可以通过的高度一般用于山洞
Max Slope表示可以通过最大坡度
Step Height表示可以通过的最大高度步长高度 ,通常用于台阶
Generated Off Mesh Links 主要用于断层之间跳跃以及断崖跳跃
DropHeight 表示下落的高度
Jump Distance 表示跳跃的距离
Advanced 高级设置
Min Region Area 允许你剔除掉小的非连接NavMesh区域,当NavMesh区域小于指定值时将被剔除。
请注意:有些区域可能无法被移除,尽管有Min Region Area 的设置,原因是NavMesh的构建是一个个的网格并行构建。当一个区域横跨两个网格将不会被移除,因为区域修剪过程中无法获取到周围的网格。
Voxel Size 立体像素尺寸
Manual voxel size :允许你改变烘焙操作过程中的精确性。
Navigation在构建寻路网格过程中,第一遍会把场景光栅化为体素,然后提取可行走区域,最后可行走区域会烘焙成网格。因此体素尺寸Voxel Size的决定了寻路网格烘焙的精准性。
提示:默认的体素设置最好的权衡了准确性和烘焙速度。在烘焙场景寻路的过程中,体素的增加会造成4x倍的内存消耗和4x倍的时间消耗。因此通常,你不需要自己去设置Voxel Size。
Areas面板
这里用于表示每个行走面的消耗 由于Navigation实现寻路其实是内置A*算法,在计算最短路径的时候 这些Cost相当于权值 会直接影响到下一步要走哪里 这里提供三种Areas 1.Walkable 表示可行走区域 NotWalkable表示不可行走区域 Jump表示跳跃的地方也就是 offMesh Links的地方 也可以用户自己定义Areas
NavMeshAgent组件
NavMesh Obstacle组件
NavMesh Obstacle组件作用,由于烘焙时进行Navgation Static这时场景中的物体都是静态的 如果要在之后生成新的障碍物或者是移动的物体 那么就需要用到这个组件
Shape由两种类型 box 和 capsule
勾选Carve这个时候这个障碍物会在行走面上面开一个洞 如果移动的话就会不断的撕出洞 加了NavMesh Obstacle组件时自带collider包围盒的
在实现自动寻路时需要了解NavMeshAgent中的重要API
常用API:
ActivateCurrentOffMeshLink :激活或禁止当前off-MeshLink.
CalculatePath :计算到某个点的路径并储存
CompleteOffMeshLink :完成当前offMeshLink的移动
Move :移动到相对于当前位置的点
ResetPath :清除当前路径
SetDestination :设置目标点
SetPath :设置一条路线
Warp :瞬移到某点
remainingDistance:到目标点的距离
desiredVelocity:期望速度,方向指向的是到达目标点的最短路径的方向
一般就是鼠标拾取寻路和怪物移动
鼠标拾取寻路
怪物寻路
只需要把agent.destination设置为主角的位置 即可