学习
实践
活动
专区
工具
TVP
写文章

探索NavMeshBuildingComponents,让AIAgent飞檐走壁

简介

最近在看AI寻路的文章时,发现Unity在5.6的版本中出了新的寻路功能NavMeshBuildingComponents。(-。-其实这个新功能并没有隐藏的很深,只要是5.6版本以上的兄弟,就能在引擎中很明显的位置看到,没发现的我太没用了)用过旧的Navigation的兄弟都知道旧版的寻路有多难受,烘焙出来的NavMesh只能支持一个agentType,而且只能支持静态寻路。

所以以上的这些痛点就催生了NavMeshBuildingComponents。支持多个agentType,支持动态寻路,支持任意方向的表面寻路。

一图流

NavMeshComponents有4个主要的组件:

NavMesh Surface

主要控件,控制哪些地方(MeshRenderer,Collider,Volume)需要烘焙NavMesh

NavMesh Modifier

修改物体的寻路设置,可以覆盖NavMeshSurface的设置

NavMesh ModifierVolume

修改范围内的寻路设置,可以覆盖NavMeshSurface的设置

NavMesh Link

连接2个NavMeshSurface

实践

今天我们的实践内容有2个demo,一个是让agent飞檐走壁,一个是运行时动态生成NavMesh。

获取NavMeshComponents

在Github上可以找到NavMeshComponents的工程链接,下载或者克隆后就能拿到我们想要的Components。

飞檐走壁

我们今天的主角有ThinAgent和FatAgent

ThinAgent

FatAgent

为两个Agent创建一个简单的寻路地形EZGround和Wall。

为EZGround添加两个NavMeshSurface组件,AgentType分别选择FatAgent和ThinAgent,点击bake

为EZWall添加NavMeshSurface组件,我们只允许ThinAgent飞檐走壁,所以AgentType选择ThinAgent,点击bake

添加NavMeshLink,连接EZGround和EZWall。

为我们的Agent添加Movement,让他们往我们鼠标所选的位置移动。

Play, Enjoy It!

注意NavMeshSurface组件放在一个空物体上时,在烘焙时只默认烘焙法线向世界坐标Y轴方向的面。所以需要为法线方向特殊的面生成NavMesh时需要单独根据MeshRenderer或者Collider创建一个NavMeshSurface。

飞檐走壁的Agent这么快就完成了,是不是很激动!激动之余让我们来看看NavMeshSurface到底做了什么事情。直捣黄龙,看看Bake按钮的奥秘。

NavMeshSurfaceEditor.cs

NavMeshSurface.cs

NavMeshComponent的生成流程主要分成两个步骤,一个是收集原始的数据,然后就是传送数据进行烘焙。然后一切的关键操作都在 中进行。虽然看了这么多代码但是关键的部分还是没有公开=。=

等NavMesh数据烘焙完成后,调用 ,返回NavMesh实例。

运行时动态生成NavMesh

利用官方提供的Example中的LocalNavMeshBuilder和NavMeshSourceTag来快速实现。这个版本的实现只是一个粗略的演示,默认的agentTypeID为0,并且area只要walkable。但是在看懂了实现代码后,就可以很方便地得到我们自己需要的动态寻路需求。

创建一个DynamicEnv空物体,添加LocalNavMeshBuilder组件

创建CubeA 和 CubeB为Dynamic的子物体,分别添加NavMeshSourceTag组件

Play, Engjoy it!动态生成网格的关键和预先烘焙差不多,也是在运行时不断手机原始数据,再进行烘焙。关键的API也是 。

在烘焙数据生成后调用NavMesh.AddNavMeshData,返回NavMesh实例。这个实例只在Enable的时候新建,然后保持引用,Disable的时候移除这些烘焙数据。

结尾

有了NavMeshComponent这么强大的工具,我们就能轻松愉快的实现心目中的AI了。官方对NavMeshComponents的定位是High-Level NavMesh Building Components,因此才开放给了我们一定的接口来满足我们的特殊需求,而且还给了很很多很好的Sample。

这是工程的Github地址:https://github.com/aaBaO/DemoRepository,欢迎大家Fork过去参考。

参考文档

UnityManual:https://docs.unity3d.com/2018.1/Documentation/Manual/NavMesh-BuildingComponents.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180522G1KWBE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券