Navigation导航系统

  • Post author:
  • Post category:其他




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


位的数。



每一层对应着一个数值,当设置多个层时,各层的值相加即可。



NavMeshAgent


agent

;



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–_–



版权声明:本文为vrunsoftyanlz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。