系列文章目录
Unity新导航系统—NavMeshSurface组件
前言
NavMeshSurface组件:用于定义特定导航网格代理(NavMesh Agent)类型的可行走区域,并确定应该构建导航网格的场景部分。
这是我的学习笔记,记载的是NavMeshSurface组件的用法和各个属性的用处(还会涉及到部分NavMeshAgent组件和NavMeshModifier组件),不能保证完全准确但是初学者可以参考一下。
1.实现寻路功能
在Package Manager中下载导航组件。
点击Navigation就可以看到这样一个面板。
(1)Name:当前Agent的名字,在后面的NavMeshSurface组件中指定这个名字可以为这个Agent创建专属于他的NavMesh。
(2)Radius:是 Agent的半径,在后面的NavMeshSurface组件中会根据这个半径来确定哪些地方因为足够宽所以可通过哪些地方因为不够宽所以不可通过。
(3)Height:是Agent的高度,在后面的NavMeshSurface组件中会根据这个半径来确定哪些地方因为足够高所以可通过哪些地方因为不够高所以不可通过。
(4)Step Height:是Agent可以迈上台阶的高度。
(5)Max Slope:是Agent可以走上的最大坡度。
(6)Drop Height:是Agent最大可以从多高的地方跳到地面。
(7)Jump Distance:是Agent可以从一个地面跳到另一个地面的最远距离,两个不相连的地面相距小于这个值时Agent可以跳过去。
搭建上面的场景,绿色的Cube是玩家Player待会要让它实现寻路功能。
给玩家添加NavMeshAgent组件,AgentType指定为最开始的Humanoid。
创建一个空物体,给它添加NavMeshSurface组件,这个组件就是用来创建玩家可以行走的NavMesh地区的组件。AgentType要选择最开始的名为Humanoid的Agent,然后其它的先不管直接点击Bake来烘焙。
此时的蓝色区域就是烘焙好的,专属于名为Humanoid的Agent的NavMesh,在这片区域内可以实现自动寻路。
但是桥和楼梯区域没有覆盖到,你就无法让玩家到这上面去。
原因是因为名为Humanoid的Agent的半径太大了,你把它调小一点。
调好后点一下Clear来清楚之前的NavMesh数据,再点击Bake重新烘焙。
此时就覆盖到楼梯和桥了。
但是楼梯和桥下方没有覆盖到。
原因是因为名为Humanoid的Agent太高了把Height调小一点。
再次Clear和Bake后就覆盖到桥和楼梯了。
把这个脚本给到Player,鼠标点击哪个地方Player就会自动寻路到这个地方。
点击某个位置,它就会到那个位置,实现了自动寻路。
给Navigation的Drop Height一个值5,表示它最高可从5米高的地方掉到地面。
Bake后会生成上面图示,表示可以从上面掉下来,注意要开启Generate Links才行。
此时它可以直接跳下来而不是原路返回。
2.NavMeshSurface组件属性介绍
(1)AgentType
这个是Agent的类型,也就是对应之前那个Navigation面板的Name。
你可以在Navigation面板创建一个新的Agent,然后在NavMeshSurface组件中指定这个Agent这样Bake出的NavMesh就是专属于这个Agent的NavMesh。然后再去玩家身上的NavMeshAgent组件指定这个Agent,这样玩家就可以在NavMesh区域实现自动寻路。
(2)DefaultArea
用于指定生成的 NavMesh 区域的默认区域类型。
它的默认值是Walkable消耗为1,Walkable就单纯是一个名字,消耗越少的代表玩家在寻路时会优先走这个消耗少的路。创建一个名为Water的区域消耗为2表示这里是河流不容易走。后续你可以通过NavMeshModifier组件为同一个NavMesh的不同地方指定不同区域例如一个地方是陆地另一个地方是河流。
在创建一个平面放在那里。
让Default Area为默认值此时cost为1,然后Bake。
点击下面桥的左侧,玩家会走下面的桥,因为下面桥消耗少。
选中下面的桥,给它添加NavMeshModifier组件。
勾选Override Area,将下面的Area Type改为cost为2的Water,此时这个桥的区域被Water覆盖,变为Water区域。
然后点击Clear和Bake。
此时这个桥就变为Water区域了,但是它还是走下面的桥并没有走上面的桥。
这是因为Water的区域cost其实不够大,你改为3。
然后点击Clear和Bake。
此时它会走上面的桥因为下面的桥消耗更大。
(3)Generate Links
是否连接两片断开的区域(这两个区域必须是相同的Default Area)。
给Navigation面板的Jump Distance一个合适的值,表示玩家可以跳跃的最大距
离。
勾选Generate Links后点击Bake。
此时两个区域之间有线状的连接。
此时它可以在两个区域来会穿越。
(4)Use Geometry
它有两个选项,默认是基于场景中物体的Render组件来创建NavMesh的,你可以改为第二项基于场景中物体的Collider组件来创建NavMesh。第二个选项会更加精确,如果两个选项烘焙出的NavMesh没有区别那么用默认选项就行。
(5)Collect Objects
用来选择参与NavMesh烘焙的物体。
All Game Objects:选中场景中所有激活的带有Render组件的物体参与NavMesh计算。
Volume:创建一个框你来自定义框住哪些激活的带有Render组件的物体参与NavMesh计算。
点击Bake,框住的物体参与NavMesh的计算。
Current Object Hierarchy:只让挂载了NavMeshSurface组件的激活的带有Render组件的物体参与NavMesh计算。
NavMeshModifier Component Only:只让挂载了NavMeshModifier组件的激活的带有Render组件的物体参与NavMesh计算。
整个场景只有下面的桥有这个组件,因此NavMesh区域就是下面的桥。
(6)Include Layers
选择哪些层的物体可参与NavMesh计算。
左侧平面标记为Fire,点击Bake后就只会烘焙左侧平面。
(7) Override Voxel Size和Override Tile Size
如果烘焙出的NavMesh出现闪烁情况,可以调整这两个值来解决。
(8)Minimum Region Area
面积小于这个值的面会被忽略,不参与NavMesh的计算。
(9)Build Height Mesh
启用 Build Height Mesh 会使 Unity 在计算NavMesh时考虑并生成一个额外的高度网格,用于提升导航网格的精度,建议开启。