Navigation导航系统
##1、Unity导航系统
++1.1、导航
++++导航在游戏中的概念就是从一点走到另外一点的过程,在该过程中需要考虑:阻挡,路径选择,可走地形,地形特点以及拟人化等多方面因素。
++++在游戏当中导航分为两种:
--(1)AI角色: 基于计算机本身控制的纯导航。
--(2)主角: 基于UI交互下的导航。
++1.2、导航的实现方式
++++(1)A*算法
--导航当中常用的算法是A*算法,它是一种从起点到终点探测代价最小路径的广度优先搜索方式,广泛应用于2D格子型地图。
++++(2)Navigation Mesh
--Unity当中采用的是基于Navigation Mesh的寻路算法原理,Navigation Mesh是A*算法的变种,将A*算法当中的格子变成三角形或多边形。可以方便的从二维扩展到三维空间,是3D游戏当中的主流寻路算法。
##2、 自动寻路
++2.1、NavMesh
++++NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。
++++NavMesh寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的NavMesh,接下来就是在游戏中根据生成的NavMesh来自动寻路。
++++首先搭建如下场景,将需要贡献导航网格的对象设置为导航静态,选中物体后点击Static,勾选上Navigation Static。
++2.2、NavMesh的设置
++++Object:
--Scene Filter :设置场景当中需要进行烘焙的物体。
--Navigation Area :设置该物体贡献的导航网格在场景当中属于哪一层,是可行走还是不可以行走或者是可跳跃的。
++++Bake(用于设置烘焙导航网格的参数):
--Baked Agent Size :参数可视化预览。
--Agent Raduis :烘焙路面参数的角色半径。
--Agent Height :烘焙路面参数的角色高度。
--Max Slope :最大坡度。
--Step Height :台阶的最大高度。
--Drop Height :可跳下高度。
--Jump Distance :可跨越宽度。
++++烘焙好的界面如图所示,蓝色区域表示角色可行走的区域。
++2.3、NavMeshAgent
++++上面我们通过设置游戏物体的NavMesh来设置场景当中有哪些物体可以贡献导航网格,接下来我们要通过另一个组件NavMeshAgent设置物体能够在导航网格上的寻路。
++++NavMeshAgent可以控制物体在导航网格上面行走的一个组件。所以该组件添加在能够自动寻路的角色身上。
++++NavMeshAgent烘焙参数总共分为四部分:代理尺寸,代理操控,障碍回避,查找路径。
--Agent Size 代理尺寸:
--(1)Redius:代理半径,仅用于计算寻路。
--(2)Height:代理高度(用于调试图形)。
--(3)Base Offset:碰撞几何体相对于实际几何体垂直的偏移。
--Steering 代理操控:
--(1)Speed:代理移动的最大速度。
--(2)Angular Speed:最大转速。
--(3)Acceleration:最大的加速度。
--(4)Stopping Distance:制动距离。(到目的地小于这个值,代理开始减速)
--(5)Auto Braking:选中之后会自动制动。
--Obstacle Avoidance 障碍回避:
--(1)Quality:回避障碍物的质量水平。
--(2)Priority:优先级。(优先级高的物体会将优先级低的物体排挤开)
--Path Finding 路径查找:
--(1)Auto Traverse Off Mesh:自动遍历 Off Mesh Link。
--(2)Auto Repath:重新规划路径。
--(3)Area Mask:遮罩区域,也即是路径规划会考虑到的层。
++2.4、NavMeshAgent常见的属性和方法
++++属性:
--autoTraverseOffMeshLink :到达跳跃点,是否执行跳跃。
--currentOffMeshLinkData :当前连接数据。
--desiredVelocity :期望速度。
--destination :寻路目标。
++++方法:
--SetDestination(Vector3 target) :设置目标点。
--RePath() :清除当前路径。
--Stop() :停止代理的运动。
--ActivateCurrentOffMeshLink(bool flag) :启用或禁用当前offMeshLink。
++++代码示例:
NavMeshAgent agent;
public Vector3 destinationPosition; //目标位置
void Start(){
agent = GetComponent<NavMeshAgent>(); //获取游戏物体身上的NavMeshAgent组件
agent.SetDestination(destinationPosition);
}
##3、 分离路面导航
++3.1、分离路面导航
++++思考:如何实现Player从A点运动到B点?
++3.2、Off Mesh Link
++++在两个不连通的寻路网格间,如果角色想在这两个网格间行走就需要添加跳跃的链接Off Mesh Link。它是实现代理可以不链接的表面行走必不可少的组件,比如跳跃河岸等。
++++选中作为高台的Cube,在Navigation窗口的Object选项中勾选Generate OffMesh Links,将Bake选中参数Drop Height设置为1,进行烘焙。
++++选择如图两个分离地面,在Navigation窗口的Object选项卡中勾选Generate OffMeshLinks;将Bake选项卡参数Jump Distance设为10,进行烘焙。
++3.3、Off Mesh Link参数详解
++++Off Mesh Link参数:
--Start :分离网格链接开始点物体。
--End :分离网格结束点物体。
--Cost Override :开销覆盖,开销越大,在有其他路线情况下会优先考虑其他路径。
--Bi Directional :起止点是否双向定向。
--Activated :指定该Off Mesh Link是否参与寻路。
--Auto Update Positions :启用时,Off Mesh Link会自动重新连接Start与End的坐标。
--Navigation Area :描述Link所属的NavMesh区域类型。
##4、 分层烘焙路面
++4.1、分层烘焙
++++在导航系统当中可以将导航网格划分为不同的区域,方便动态设置哪些层可以行走,哪些层不可行走。
++4.2、分层烘焙路面
++++实现分层路面导航主要分为以下步骤:
--(1)自定义Area层。
--(2)设置场景中不同区域烘焙为不同的层。
--(3)设置角色可以在导航网格中哪些层移动。
++++如图所示为导航系统当中的所有区域,默认的有Walkable,Not Walkable,Jump三个区域,通过设置不同的层可以实现分层寻路。
--Cost表示通过这些区域所需要的代价,比如在平地上行走和水中移动代价是不同的,我们可以通过Cost来设定,导航系统中最短路径就是移动到目标点所消耗的代价最小。
++++设置贡献了导航网格的物体在导航中属于哪一层:
++4.3、Nav Mesh Agent
++++设置不同区域在导航网格中为不同的层主要是控制角色有选择的行走某些区域。
++++设置好烘焙出来不同区域在场景当中呈现不同颜色,接下来通过角色挂载的NavMeshAgent组件里的AreaMask属性设置代理可以在导航网格中的哪些区域移动。(默认为Everything)
++++角色可行走区域除了通过 Nav Mesh Agent的Area Mask属性设置还可以通过代码来设置。
--NavMesh的Area是一个32位的数。
--每一层对应着一个数值,当设置多个层时,各层的值相加即可。
NavMeshAgentagent;
void Start(){
//Nothing = 0; EveryThing = -1;
agent.areaMask= 7; //代表勾选前三层
}
##5、 动态路障
++5.1、Nav Mesh Obstacle
++++Nav Mesh Obstacle有两种模式:
--一种是普通的模式,通过设置半径与高度来确定一个范围,阻挡代理的移动。
--另一种是Carve模式,会根据模型大小界定该区域无法参与导航网格计算。
++++Nav Mesh Obstacle属性详解:
--Shape :该导航阻挡的形状;
--Size :导航阻挡在各个轴向上的尺寸;
--Carve :是否使用Carve模式,使用Carve模式该导航阻挡可以动态移动。
#立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++立钻哥哥推荐的拓展学习链接(Link_Url):
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++++Unity引擎基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向组件开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平台开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI综合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity动画系统基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity动画系统进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation导航系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity数据存储:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite数据库:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW类和协程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity网络:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委托:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#数据类型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默认的快捷键:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++游戏相关缩写:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++设计模式简单整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++UML类图:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++Unity知识点0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++U3D_Shader编程(第一篇:快速入门篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader编程(第二篇:基础夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft : Lovezuanzuan--_--