Unity5.6新功能High-level NavMesh之组件介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dracoooo/article/details/72812934

该文为本人学习官方文档High-level NavMesh Building Components时的学习笔记,并非译文。

建议读者直接通过官网文档进行学习。
官方文档
High-level NavMesh组件

背景:之前一段时间用Unity5.5在开发一款需要强寻路AI的游戏,NavMesh是最方便的一种导航方式,但是旧版本Unity并没有完全提供一个开放自由的API。但由于动态障碍物众多,再加上巨大的场景,使用NavMeshObstacle挖洞的方式并不是很理想,故一直在寻求一个更完美的解决方案,直到看到了Unity5.6版本NavMesh的新功能,便开启了High-level NavMesh的学习之旅。


1. 如何使用NavMesh新组件

NavMesh的新组件一共有4个:

  • NavMeshSurface
  • NavMeshModifier
  • NavMeshModifierVolume
  • NavMeshLink

这4个新组件并不是在Unity5.6版本里面默认就有的,需要自己导入到工程中,下载->导入

接下来对4个组件逐个介绍

2.NavMesh Surface组件

NavMesh Surface组件
(上图使用NavMeshSurface组件将这片区域变成可走区域)

  • High-level NavMesh 最核心的组件
  • NavMeshSuface组件代表agent可以走的区域,定义世界中哪部分应该被bake成NavMesh
    一个场景中可以有多个NavMesh Surface组件

NavMesh Surface组件

  • NavMeshSurface组件可以被加在任何游戏物体上,可以用来定义那些物体可以用来生成NavMesh(有了该组件后可以不需要设置物体Navigition static的静态属性,以前的静态属性只适用于editor模式,不适用于实时bake的特性)
  • 参数介绍:
    • Agent Type: 用来匹配NavMeshAgent
    • Collect Object: 定义哪些物体用来bake生成NavMesh
      • All: 使用全部激活状态的物体(无论是否是父子物体)
        All
      • Volume: 被体积盒包围的物体,或者是包围在内的物体的部分
        Volume
      • Children: 有NavMeshSurface组件的物体及其子物体
        Children
    • Include Layers: 定义哪些层的物体要被bake
    • Use Geometry: 选择使用网格或者碰撞体来bake
      • Render Meshes - 使用Mesh Renderer 和 Terrains
      • Physics Colliders - 使用Colliders和Terrains(推荐)
    • Advanced:高级设置(一般默认就可以)
      • Default Area: 默认生成区域类型
      • Override Voxel Size: 覆盖默认的Voxel Size,体素尺寸,用来调整精度,场景比较精密的可以把该值调小,值越小精度越高,精度越高,bake越慢,该值与Tile Size共同影响bake的效果
      • Override Tile Size: 覆盖默认的Tile Size,块大小,默认是256voxel作为一块,为了让bake有较多平行与增加内存效率才有了此设置,在障碍物多的时候,可以将块减小以提升运行效率。或者打算实时bake的时候,可以用更小的Tile Size来降低内存消耗
        Tile Size 64
        Tile Size 64
      • Build Height Mesh: 不再被支持
  • 其它说明:
    • NavMesh Surface组件用来设置一片大范围内要被bake的物体的信息,而用NavMeshModifer组件可以对这些物体逐个进行微调
    • 如果物体身上有NavMesh Agent或者NavMesh Obstacle组件则不会被bake进去,会在bake的时候剔除他们,因为他们是来用NavMesh的,不是来建造这个NavMesh的

3.NavMesh Modifier组件

NavMesh Modifier组件
(上图用NavMeshModifier定义某一小块区域为Lava(岩浆)类型的区域)

  • NavMesh Modifier组件允许对一些要用来被NavMeshSurface组件bake的物体进行微调
  • NavMesh Modifier组件的作用效果包括其下的所有子物体
  • NavMesh Modifier组件可用于实时bake,且不需要static标志

  • 参数说明:

    • Ignore From Build: 是否无视bake
    • Override Area Type:生成区域类型
    • Affected Agents: 针对某个agents的微调,比如可以选择排除该agents的某些特定的障碍

4.NavMesh Modifier Volume 组件

NavMesh Modifier Volume 组件
(上图用NavMesh Modifier Volume将门的一片区域设置为不可走)

  • NavMesh Modifier Volume与NavMesh Modifier差不多
  • 前者作用于对体积盒包围的所有物体(或物体的部分),后者只作用于自身及其子物体
  • 参数说明:
    • Size和Center:调整体积盒的大小位置,其它和NavMesh Modifier一样

5.NavMesh Link 组件

NavMesh Link 组件

  • NavMesh Link组件允许在两个区域间创建一条可通行的通道
  • NavMesh Link组件对于连接两个不同的NavMesh Surfaces是必须的

  • 参数说明:

    • Agent Type: 哪种Agent才可以使用这个NavMesh Link
    • Start Point:开始点
    • End Point:结束点
    • Align Transform To Points: 将绑定该NavMesh Link组件的物体的Tranfrom属性与Link匹配,位置移动到link的中心,方向也对着link的方向
    • Cost Modifier: 测试不出有什么用,默认即可,原文→(when the cost modifier value is non-negative the cost of moving over the NavMeshLink is equivalent to the cost modifier value times the Euclidean distance between NavMeshLink and points.)
    • Bidirectional: 勾上时线的方向为双向,没勾时只能start-to-end单向
    • Area Type: 区域类型

6. 将多个NavMesh Surfaces连接注意事项

多个NavMesh Surfaces连接

  1. 可以使用多个 NavMesh Link连接多个NavMesh surfaces
  2. Link和Sufaces都必须有相同的agent类型
  3. Link的开始点和结束点都必须各种在一个surfaces内,两个surfaces叠在一起会不清楚开始点或结束点连接放在哪个surface上
  4. 如果场景中已经有了Link,然后再添加NavMesh Surface的时候检测会不会连接到不想连接的Surface

接下来计划将对High-level NavMesh的API以及How to bake the Navmesh at runtime进行研究。

没有更多推荐了,返回首页