0x00 前言

unity5.6作为Unity5最后的一个版本,的确起到了一个承上启下的作用。除了上一篇文章《进击的AssetBundles和它的工具们》中提到的AssetBundles-Browser,本文还会介绍另一个在Github开源的,用于Unity5.6+的新寻路功能。

0x01 曾经的痛点

Unity5.6之前的navmesh系统的确操作起来十分容易上手,门槛很低。我们只需要将场景内需要烘焙navmesh的区域勾选上Navigation Static选项,之后就可以在Navigation窗口中烘焙整个场景了。

但是曾经的navmesh系统却也存在着一些性能上的和使用场景上的缺陷。
一个常见的问题,由于要预先烘焙场景的navmesh,因此我们很难方便的在运行时动态的修改navmesh。更不用说,有一些游戏的场景并非提前制作好的,需要在运行时动态的生成,这种情况下就无法使用navmesh了。
另一个问题是,如果场景过大的话,烘焙之后的navmesh也会保存很多数据,在运行时会造成一些内存上的开销。
当然,抛开这些不谈,另外一个让我吐槽navmesh的一点就是,它竟然不支持垂直面的导航。

在做一些2d的platform游戏时,我很希望能利用navmesh来实现寻路的逻辑。(图文无关)
但是,不幸的是,之前的navmesh是不支持的。

0x02 组件化的navmesh

不过还好,虽然新的navmesh系统并没有随着unity的正式版本一同发布。但是,我们还是可以通过github来获取这些新的功能:

NavMeshComponents

需要注意的是,Unity的版本要求在5.6以上。

我们可以看到,其实这里只有4个高层的C#脚本文件:


利用这4个脚本文件,就能基本解决我们之前的烦恼了。

其中NavMeshSurface这个脚本将navmesh组件化,利用这个组件就可以很方便的烘焙挂载该组件的对象的navmesh信息,而无需打开一个navigation窗口对整个场景进行烘焙了。我们甚至可以将挂载这个脚本的GameObject烘焙后保存为一个prefab,这个带有navmesh信息的prefab跟其他的prefab一样。


为对象添加NavMeshSurface组件很简单。在这里我们可以看到和之前navigation窗口类似一些设置,但是请注意,这里已经不是整个场景烘焙了。navmesh已经组件化了,它只会烘焙挂载它的对象。

只要点击一下这个组件下的Bake按钮,挂载它的对象就被烘焙好了。
那么GameObject能否挂载多个NavMeshSurface组件呢?这一种需求也的确存在,例如怪物和玩家的寻路策略不同,有些地方玩家能通过而怪物却不能通过。
这的确也是可以的,同一个GameObject能够同时挂载多个NavMeshSurface组件,并且烘焙不同的navmesh供不同的角色使用。

这样,我们针对不同的角色的NavMeshAgent组件设置不同的agent type并和烘焙好的两个navmesh匹配好就可以了。

0x03 飞檐走壁

好了,借助NavMeshSurface组件我们实现了navmesh的组件化。那么是不是我们就能很方便的实现在垂直面上烘焙navmesh了呢?各位想想我们是否能很轻松的让一个游戏对象的角度改变呢?答案是是的。那么这个游戏对象上如果有navmesh信息的话,我们只需要把这个游戏对象从水平变为垂直是否就行了呢?是的。
因此实现游戏角色的在垂直面上飞檐走壁的功能就变得十分简单了。


当然了,在水平面的navmesh和垂直面的navmesh之间我们还会用到NavMeshLink这个组件来链接二者。各位自己在实践的时候需要留意一下这一点。

0x04 在运行时烘焙navmesh

接下来就让我们看看新的navmesh系统带给我们的新的惊喜——在运行时烘焙navmesh。
这是一个很现实的需求,例如一些动态生成场景的游戏,我们无法在一开始就确定这个场景到底是什么样子的,所以也无法使用之前的navmesh系统,因为以前的navmesh只能在editor内烘焙。但是现在我们使用新的navmesh系统就能够很方便的在运行时烘焙navmesh了。


如图,这是一个空场景,在游戏运行之后场景才生成出来场景内的各种道路,此时单击鼠标,navmesh就生成了。
其实在新的navmesh系统内,实现这个机制十分简单。只需要调用游戏对象上挂的NavMeshSurface组件的BuildNavMesh()方法。

void Start()
{surface = GetComponent<NavMeshSurface>();
}void Update()
{if (Input.GetMouseButtonDown(0)){surface.BuildNavMesh ();}
}

既然navmesh已经可以在运行时创建了,那么我们能否也在运行时实例化一个navmesh的prefab,实时的影响场景内的寻路策略呢?
答案是当然可以。

0x05 场景太大不用愁

自己做过寻路算法的童靴可能会意识到一个问题,就是在做寻路时如果场景过大的话,寻路的数据可能会比较消耗内存。同样在navmesh中,如果场景过大,或者玩家的视野范围有限,一些对玩家当前位置影响不大的场景的其他位置的navmesh数据就有可能造成一些无谓的消耗。
在新的navmesh系统中,我们同样可以优化这个问题,只烘焙玩家周围的navmesh。

这里同样需要NavMeshSurface组件,在inspector视窗我们可以选择collect object中的volume,之后设定size的值就可以值烘焙这个范围内的navmesh了。之后随着玩家的移动,再动态烘焙新的navmesh就可以了。

ref:

【1】High-level NavMesh Building Components
【2】Unite Europe 2017 - Finding the path: New navigation features
各位如果觉得有趣的话,欢迎点个赞。

-EOF-
最后打个广告,欢迎支持我的书《Unity 3D脚本编程》

欢迎大家关注我的公众号慕容的游戏编程:chenjd01

转载于:https://www.cnblogs.com/murongxiaopifu/p/7196788.html

进击的新版NavMesh系统:看我飞檐走壁相关推荐

  1. 安卓最新系统_你的Windows电脑即将可以运行最新版安卓系统

    " 对于硬件设备来说系统是灵魂,PC设备今天能够如此成功Windows系统功不可没,而智能手机这10年来飞速发展,安卓和iOS系统也是功不可没.不过,系统之间的护城河都比较深,比如你很难在W ...

  2. 华为android系统最新版,谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级...

    原标题:谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级 [5月21日讯]相信大家都知道,随着华为鸿蒙OS 2.0正式版系统推出旗舰确认,也让华为鸿蒙OS系统在近期越来越火热,受到的关注 ...

  3. 擎天出口退税软件_新版申报系统退税申报注意事项

    前言:随着税务信息化建设"后金三"时代的不断深入,2019年年底国家税务总局启动出口退税管理系统整合(进入金税三期)项目,经过广东.大连两个地区试点,即将于今年年底前在全国完成金税 ...

  4. 鸿蒙系统兼容微软,效仿华为鸿蒙系统!微软放大招:新版Win10系统兼容安卓应用...

    原标题:效仿华为鸿蒙系统!微软放大招:新版Win10系统兼容安卓应用 相信大家都知道,华为鸿蒙OS2.0系统手机Bate版本即将在12月16日正式发布,届时有关于华为鸿蒙手机OS系统的所有细节都将得到 ...

  5. 视频教程-新版全面系统完整的电信客服综合案例教程-大数据

    新版全面系统完整的电信客服综合案例教程 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业.拥有丰 ...

  6. 网络里找不到工作组的计算机,win7系统看不到工作组计算机怎么办?win7系统看不到工作组计算机解决方法...

    在xp系统中网上邻居可以看到工作组计算机,但是升级到win7系统里面看不到工作组计算机,怎么办?很多用户都会为自己的电脑建立工作组,遇到win7系统看不到工作组计算机的问题,下面小编给大家讲解win7 ...

  7. 进击的 Kubernetes 调度系统(二):支持批任务的 Coscheduling/Gang scheduling

    作者 | 王庆璨(阿里云技术专家).张凯(阿里云高级技术专家) **导读:**阿里云容器服务团队结合多年 Kubernetes 产品与客户支持经验,对 Kube-scheduler 进行了大量优化和扩 ...

  8. 进击的 Kubernetes 调度系统(一):Kubernetes scheduling framework

    作者 | 王庆璨(阿里云技术专家).张凯(阿里云高级技术专家) 导读:阿里云容器服务团队结合多年 Kubernetes 产品与客户支持经验,对 Kube-scheduler 进行了大量优化和扩展,逐步 ...

  9. 进击的Kubernetes调度系统(一):SchedulingFramework

    作者:王庆璨 张凯 前言 Kubernetes已经成为目前事实标准上的容器集群管理平台.它为容器化应用提供了自动化部署.运维.资源调度等全生命周期管理功能.经过3年多的快速发展,Kubernetes在 ...

最新文章

  1. Asynctask源码分析
  2. 图解VC++6.0和ACE 5.4 开发入门
  3. Linux Top 命令解析 比较详细--转
  4. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
  5. eclipse序列化生成serialVersionUID
  6. C# 多线程,解决处理大数据时窗体(不能拖动等)假死现象
  7. python小案例下载_python 小案例demo06
  8. Java开发中数据类型之间的转换
  9. 倦怠和枯燥_我如何艰难地学习倦怠
  10. android 溢出按钮,React-Native封裝Tabbar 實現中間按鈕溢出效果(Android/iOS)
  11. linux多线程编程书籍推荐:linux大牛之路从这几本书开始
  12. 求大佬帮帮忙 ubuntu 安装完成vsftpd后用windows10的上安装的cutftp连接出现下面的情况 远程主机主动拒绝了对其进行的连接尝试
  13. word两页并排怎么变成单页排列
  14. 规培手册填写模板_肾内科 规培轮转登记手册模板
  15. win10启用smb3多通道_关于win10无法使用smb访问局域网内的计算机
  16. mac os监听扬声器、麦克风的音量、静音
  17. 关于Java文件路径问题
  18. 跨越数据的“叹息墙”:华为下一代数据湖与HPDA时代
  19. 剪辑视频,在视频画面上编辑一张图片
  20. AE使用中的常见错误01

热门文章

  1. Linux 命令行界面-GUI界面
  2. 浅谈FIle协议与Http协议及区别
  3. 中文 iOS/Mac 开发博客列表
  4. hibernate增删改查的标准范例
  5. Soap UI 负载测试
  6. [Music]若是每个人都彼此关怀
  7. beta book读书俱乐部的构思
  8. c语言switch循环语序,C语言初学者常见错误统计.doc
  9. 定义一个dto对象_正确理解DTO、值对象和POCO
  10. 操作系统原理第三章:进程