Navigation导航系统

Navigation导航系统

##1Unity导航系统

++1.1、导航

++++导航在游戏中的概念就是从一点走到另外一点的过程,在该过程中需要考虑:阻挡,路径选择,可走地形,地形特点以及拟人化等多方面因素。

++++在游戏当中导航分为两种:

--1AI角色: 基于计算机本身控制的纯导航。

--2)主角: 基于UI交互下的导航。

++1.2、导航的实现方式

++++1A*算法

--导航当中常用的算法是A*算法,它是一种从起点到终点探测代价最小路径的广度优先搜索方式,广泛应用于2D格子型地图。

++++2Navigation Mesh

--Unity当中采用的是基于Navigation Mesh的寻路算法原理,Navigation MeshA*算法的变种,将A*算法当中的格子变成三角形或多边形。可以方便的从二维扩展到三维空间,是3D游戏当中的主流寻路算法。


##2、 自动寻路

++2.1NavMesh

++++NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。

++++NavMesh寻路一般包含两部分,首先是使用工具根据地图信息生成寻路用的NavMesh,接下来就是在游戏中根据生成的NavMesh来自动寻路。

++++首先搭建如下场景,将需要贡献导航网格的对象设置为导航静态,选中物体后点击Static,勾选上Navigation Static


++2.2NavMesh的设置

++++Object

--Scene Filter :设置场景当中需要进行烘焙的物体。

--Navigation Area :设置该物体贡献的导航网格在场景当中属于哪一层,是可行走还是不可以行走或者是可跳跃的。


++++Bake(用于设置烘焙导航网格的参数):

    --Baked Agent Size :参数可视化预览。

--Agent Raduis :烘焙路面参数的角色半径。

--Agent Height :烘焙路面参数的角色高度。

--Max Slope :最大坡度。

--Step Height :台阶的最大高度。

--Drop Height :可跳下高度。

--Jump Distance :可跨越宽度。


++++烘焙好的界面如图所示,蓝色区域表示角色可行走的区域。



++2.3NavMeshAgent

++++上面我们通过设置游戏物体的NavMesh来设置场景当中有哪些物体可以贡献导航网格,接下来我们要通过另一个组件NavMeshAgent设置物体能够在导航网格上的寻路。

++++NavMeshAgent可以控制物体在导航网格上面行走的一个组件。所以该组件添加在能够自动寻路的角色身上。

++++NavMeshAgent烘焙参数总共分为四部分:代理尺寸,代理操控,障碍回避,查找路径。

--Agent Size 代理尺寸:

  --1Redius:代理半径,仅用于计算寻路。

  --2Height:代理高度(用于调试图形)。

  --3Base Offset:碰撞几何体相对于实际几何体垂直的偏移。

--Steering 代理操控:

  --1Speed:代理移动的最大速度。

  --2Angular Speed:最大转速。

  --3Acceleration:最大的加速度。

  --4Stopping Distance:制动距离。(到目的地小于这个值,代理开始减速)

  --5Auto Braking:选中之后会自动制动。

--Obstacle Avoidance 障碍回避:

  --1Quality:回避障碍物的质量水平。

  --2Priority:优先级。(优先级高的物体会将优先级低的物体排挤开)

--Path Finding 路径查找:

  --1Auto Traverse Off Mesh:自动遍历 Off Mesh Link

  --2Auto Repath:重新规划路径。

  --3Area Mask:遮罩区域,也即是路径规划会考虑到的层。


++2.4NavMeshAgent常见的属性和方法

++++属性:

--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、分离路面导航

++++思考:如何实现PlayerA点运动到B点?

++3.2Off Mesh Link

++++在两个不连通的寻路网格间,如果角色想在这两个网格间行走就需要添加跳跃的链接Off Mesh Link。它是实现代理可以不链接的表面行走必不可少的组件,比如跳跃河岸等。


++++选中作为高台的Cube,在Navigation窗口的Object选项中勾选Generate OffMesh Links,将Bake选中参数Drop Height设置为1,进行烘焙。


++++选择如图两个分离地面,在Navigation窗口的Object选项卡中勾选Generate OffMeshLinks;将Bake选项卡参数Jump Distance设为10,进行烘焙。


++3.3Off Mesh Link参数详解

++++Off Mesh Link参数:

--Start :分离网格链接开始点物体。

--End :分离网格结束点物体。

--Cost Override :开销覆盖,开销越大,在有其他路线情况下会优先考虑其他路径。

--Bi Directional :起止点是否双向定向。

--Activated :指定该Off Mesh Link是否参与寻路。

--Auto Update Positions :启用时,Off Mesh Link会自动重新连接StartEnd的坐标。

--Navigation Area :描述Link所属的NavMesh区域类型。



##4、 分层烘焙路面

++4.1、分层烘焙

++++在导航系统当中可以将导航网格划分为不同的区域,方便动态设置哪些层可以行走,哪些层不可行走。


++4.2、分层烘焙路面

++++实现分层路面导航主要分为以下步骤:

--1)自定义Area层。

--2)设置场景中不同区域烘焙为不同的层。

--3)设置角色可以在导航网格中哪些层移动。

++++如图所示为导航系统当中的所有区域,默认的有WalkableNot WalkableJump三个区域,通过设置不同的层可以实现分层寻路。

--Cost表示通过这些区域所需要的代价,比如在平地上行走和水中移动代价是不同的,我们可以通过Cost来设定,导航系统中最短路径就是移动到目标点所消耗的代价最小。


++++设置贡献了导航网格的物体在导航中属于哪一层:


++4.3Nav Mesh Agent

++++设置不同区域在导航网格中为不同的层主要是控制角色有选择的行走某些区域。

++++设置好烘焙出来不同区域在场景当中呈现不同颜色,接下来通过角色挂载的NavMeshAgent组件里的AreaMask属性设置代理可以在导航网格中的哪些区域移动。(默认为Everything


++++角色可行走区域除了通过 Nav Mesh AgentArea Mask属性设置还可以通过代码来设置。

--NavMeshArea是一个32位的数。

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

NavMeshAgentagent;

void Start(){

  //Nothing = 0;  EveryThing = -1;

  agent.areaMask= 7;  //代表勾选前三层

}



##5、 动态路障

++5.1Nav 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知识点0001https://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--_--

Unity作为一款广泛使用的游戏开发引擎,在游戏开发领域中有着举足轻重的地位。如果想要开始学习Unity引擎,需要掌握基础概念和技能。以下是Unity零基础到入门的步骤: 第一步是了解Unity的界面和基本概念,包括场景、游戏对象、组件等,这些是搭建Unity工程的基础。 第二步是学习Unity中的脚本编程,以及常用的变量类型、条件语句、循环语句等基本语法知识。 第三步是掌握Unity的资产管理和使用,包括材质、纹理、声音、动画等。 第四步是了解Unity中的游戏物理系统,包括刚体、碰撞器等,以及如何添加和控制它们。 第五步是学习Unity中比较重要的导航系统,这就需要我们详细解析这个系统的操作步骤和注意事项,这个过程就需要用到"万字教程"。 Unity导航系统是一个专门用于实现寻路和移动的功能,它可以在场景中自动生成地图,并自动计算出路线、寻找路径和避免障碍物。导航系统的基本原理是通过使用寻路算法来查找最短路径,这个算法需要用到A*算法,这也是一个常用的寻路算法。在具体操作中,用户需要首先添加导航网格、设置导航代理、通过设置导航区域建立环境信息来让导航代理获取路径信息等步骤,最终通过代码实现控制游戏对象移动的过程。 总之,要学习Unity导航系统,需要先获得一定的Unity基础,学习并熟练掌握资产管理、物理系统、脚本编程等技能,并结合"万字教程"对导航系统进行深入学习和了解,最终掌握实现游戏导航的技巧和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值