让Unity NavMesh为我所用

Unity里面整合了一个NavMesh功能,虽然让人又爱又恨。

但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了。

比如说服务器需要Unity的NavMesh数据时。

比如说你想将Unity的场景导出到其他引擎时,比如时下流行的H5。

?

最近我就碰到了这样一个需求,走了一些弯路,研究了Unity的NavMesh

  1. 将Unity的NavMesh数据导出

先说代码,我编写了一个导出脚本,将navmesh数据可以导出成一个obj,也可以导出成一个json文件

你可以用svn 获取代码

http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/res_navmeshexport

?

?

原理是Unity提供了一个接口可以得到NavMesh的三角形数据

这里直接有vertices 顶点,和 indices顶点索引

但是这个数据不可直接导出,这个数据不可直接导出这个数据不可直接导出。

导出来的三角形基本上都是不共边的,不共边怎么做连通图呢,这不行,所以要先分析他。

我已经帮你分析过了,这里unity发明了一个方法表达多边形,我没有搜到类似这样的做法,姑且认为是Unity发明的方法

?

Unity的NavMeshData有一些共边的三角形,共边的三角形其实不是连通关系,共边的三角形只是他们共同构成一个凸多边形,并且这种共边的三角形,全部都是扇形排列。

首先先以此划分,生成多边形列表。这个多边形列表,当然没有共边。

?

Unity的NavMeshData 那些不共边的多边形只是index索引不共边,从坐标上还是有共边的,所以我们合并掉重合顶点,重新排列多边形的index索引,就可以恢复到有共边的多边形列表和顶点列表

?

做了如上两步以后,我们就得到了原始的navmesh数据,有共边的多边形列表和顶点列表

然后将它写入obj文件或者json文件就可以了。

具体Unity的花招就是上面两步,代码可以拉svn研究。

二、外部使用这些数据

然后我们就可以脱离Unity来实现一个NavMesh了,到这里其实如果你接触过寻路,已经不用看了,如果你懒,接着往下看

?

我先在winform环境用c#实现了一个navmesh

你可以用svn拉取测试程序源码

http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/navmesh_pathfinding_test

用导出的json文件画出了连通图,鼠标左右键,完成寻路。

Navmesh的寻路原理是两步

  1. 先用astar 算法从navmesh连通图找出经过的三角形,图中的灰色部分
  2. 用照射法在经过的三角形中找出一条路径

然后将c#代码移植为TypeScript代码,就将navmesh带到h5了

一样可以从svn拉取代码:

http://code.taobao.org/svn/falconconv/trunk/babylonfan/webgl/canvas/canvasWebgl_NavMesh

时间: 2024-10-16 12:17:18

让Unity NavMesh为我所用的相关文章

Unity NavMesh导航网格

目的:要实现的功能就是你点击一下地图上的某个地方,人物就向着那个点移动.有点自动寻路的味道.  例子:三国群英传,三国赵云传之类的游戏里面的人物移动就可以用这个实现.还有一个我不太喜欢玩的游戏英雄联盟也是可以这样实现的. 怎么做:  先新建一些东西.如图: 这个Player我是建了一个椭圆体来用的.建好之后就开始跟着我做吧. 一.打开Navigation 二.为地图添加Navigation Static 选中plane,勾选Navigation Static,现在可以看到Navigation L

CritterAI 翻译 Configuration Parameters

翻译自: http://www.critterai.org/projects/nmgen_study/config.html 参考: http://blog.csdn.net/kun1234567/article/details/41714511  其他各处记不清了,不一一列出 说明: 英语水平有限,仅限于翻译原网页,并参考了以上作者的翻译,加以整理,并没添加过多的个人经验.(后面会有些个人经验说明),由于理解可能出现偏差,建议对照原英文文档参阅 一. 总览 二.详细 CellSize 限制:

【转】unity自带寻路Navmesh入门教程(一)

http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加了NavMesh寻路的功能.在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能.阿赵我也使用过A*寻路插件,A*的原理并不复杂,有

【转】unity自带寻路Navmesh入门教程(三)

http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路线进攻. 第二个例子是动态的控制道路的开关.当吊桥打开时,道路不通,当吊桥放下时,道路可以通行. 先来说说第一个例子吧,第一个例子其实很简单,只需要在之前两节的基

【转】unity自带寻路Navmesh入门教程(二)

http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/ 上一节简单介绍了NavMesh寻路的基本用法,这次来介绍一下稍微复杂一点点的高低落差以及跳跃的做法,首先来看看这次的目标: 由于博客相册上传GIF有限制,所以我把整个过程切开了2部分上传,第一部分是爬楼梯,第二部分是横向跳跃和往下跳落 不管是爬楼梯,还是跳跃,NavMesh都是通过了OffMeshLink来做的.创建OffMeshLink的方法有两种,接下

【Unity】12.5 Navmesh Obstacle组件

开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 在大多数游戏情景中,可行进的区域往往不是完全不变的.比如被破坏的路.桥等将不再允许通过.那么,如何控制行进物体呢?有两种解决办法. 第一种解决办法是分层控制,然后动态更改可行进层,比如对于不同的桥,分别用不同的层来控制.但是这种处理有一个局限性,比如一个游戏场景中包含很多桥的情形,每个桥都有自己的通行或禁止状态,那么如果分层控制,那么就需要为每一个桥分一个层,这样-来层数肯定不够用,因为在U

unity自带寻路Navmesh入门教程(一)

说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加了NavMesh寻路的功能.在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能.阿赵我也使用过A*寻路插件,A*的原理并不复杂,有兴趣的朋友可以自己百度一下.不过由于不是自带的功能,所以在设定网格和烘焙的过程难免会出现很多不便.NavMesh作为unity自带的功能,用法

unity自带寻路Navmesh入门教程(三)

继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路线进攻. 第二个例子是动态的控制道路的开关.当吊桥打开时,道路不通,当吊桥放下时,道路可以通行. 先来说说第一个例子吧,第一个例子其实很简单,只需要在之前两节的基础上修改一下层的设置就可以了. 先来分析一下我们的地形,为了做这个例子,我准备了两个plane分别作为我方基地和地方基地,然后用plane简单

Unity手游之路<九>自动寻路Navmesh之高级主题

http://blog.csdn.net/janeky/article/details/17492531 之前我们一起学习了如何使用Navmesh组件来实现最基本的角色自动寻路.今天我们再继续深入探索Navigation组件的高级功能.在本文中,你将了解到如何在两个隔离层自动生成寻路网格?如何手动指定寻路网格的路线?以及寻路网格层的应用.(本文所用到的模型皆来自Unity3d官网). (转载请注明原文地址http://blog.csdn.net/janeky/article/details/17