##1、Unity导航系统算法
++1.1、导航数据库
++++导航在游戏中的概念就是从一点走到另一点的过程,在该过程当中须要考虑:阻挡,路径选择,可走地形,地形特色以及拟人化等多方面因素。编程
++++在游戏当中导航分为两种:设计模式
--(1)AI角色: 基于计算机自己控制的纯导航。网络
--(2)主角: 基于UI交互下的导航。ide
++1.2、导航的实现方式工具
++++(1)A*算法学习
--导航当中经常使用的算法是A*算法,它是一种从起点到终点探测代价最小路径的广度优先搜索方式,普遍应用于2D格子型地图。动画
++++(2)Navigation Meshui
--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引擎基础:http://www.javashuo.com/article/p-beommoeb-ka.html
++++Unity面向组件开发:http://www.javashuo.com/article/p-eigmuvut-dt.html
++++Unity物理系统:http://www.javashuo.com/article/p-nqvvciwv-kd.html
++++Unity2D平台开发:http://www.javashuo.com/article/p-ycaagdtj-hs.html
++++UGUI基础:http://www.javashuo.com/article/p-rukxwckw-mc.html
++++UGUI进阶:http://www.javashuo.com/article/p-wcatruhq-gt.html
++++UGUI综合:http://www.javashuo.com/article/p-dkccmqii-gg.html
++++Unity动画系统基础:http://www.javashuo.com/article/p-mbrdouxy-dq.html
++++Unity动画系统进阶:http://www.javashuo.com/article/p-aqaqpbkh-bp.html
++++Navigation导航系统:http://www.javashuo.com/article/p-dswwllas-t.html
++++Unity特效渲染:http://www.javashuo.com/article/p-ckojjyfj-bp.html
++++Unity数据存储:http://www.javashuo.com/article/p-bvlzynso-m.html
++++Unity中Sqlite数据库:http://www.javashuo.com/article/p-ejutsbxl-ca.html
++++WWW类和协程:http://www.javashuo.com/article/p-dbwmhsav-cy.html
++++Unity网络:http://www.javashuo.com/article/p-sqrlntgh-dw.html
++++C#事件:http://www.javashuo.com/article/p-zmwruvql-gm.html
++++C#委托:http://www.javashuo.com/article/p-uozpymaf-gh.html
++++C#集合:http://www.javashuo.com/article/p-sfqfdqsf-ex.html
++++C#泛型:http://www.javashuo.com/article/p-xrttqngo-ee.html
++++C#接口:http://www.javashuo.com/article/p-vhlfplgv-dm.html
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:http://www.javashuo.com/article/p-olslkfao-cq.html
++++C#数据类型:http://www.javashuo.com/article/p-hmabbtmc-ba.html
++++Unity3D默认的快捷键:http://www.javashuo.com/article/p-wuwcrclr-s.html
++++游戏相关缩写:http://www.javashuo.com/article/p-mwacxwca-gm.html
++++设计模式简单整理:http://www.javashuo.com/article/p-rngqugib-hg.html
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++UML类图:http://www.javashuo.com/article/p-sxberuew-bm.html
++++Unity知识点0001:http://www.javashuo.com/article/p-ryvdxxjr-ep.html
++++U3D_Shader编程(第一篇:快速入门篇):http://www.javashuo.com/article/p-kyppgrac-gz.html
++++U3D_Shader编程(第二篇:基础夯实篇):http://www.javashuo.com/article/p-qkyowtli-hv.html
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft : Lovezuanzuan--_--