当前位置: 首页 > news >正文

让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

相关文章:

  • Log打印的:D/dalvikvm(4342): GC_FOR_ALLOC freed
  • servlet的执行原理与生命周期
  • 数组增删改查及冒泡
  • TCP连接状态详解及TIME_WAIT过多的解决方法
  • zabbix架构
  • nginx: bind() to 0.0.0.0:8001 failed (13: Permission denied)
  • Linux统计文件行数
  • ACM竞赛:立方和问题
  • 初级运维(一)
  • 九曲黄河万里沙,浪淘风簸自天涯 — 正则表达式
  • 【PHP】函数explode和split的区别
  • IIS下配置PHP
  • OGNL表达式介绍
  • CSS——NO.8(代码简写)
  • Sqli-labs less 10
  • [译] React v16.8: 含有Hooks的版本
  • 《深入 React 技术栈》
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 2019.2.20 c++ 知识梳理
  • CSS中外联样式表代表的含义
  • Date型的使用
  • Lsb图片隐写
  • node和express搭建代理服务器(源码)
  • Redis中的lru算法实现
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 构建工具 - 收藏集 - 掘金
  • 诡异!React stopPropagation失灵
  • 机器学习中为什么要做归一化normalization
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 解决iview多表头动态更改列元素发生的错误
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 学习笔记TF060:图像语音结合,看图说话
  • 延迟脚本的方式
  • 白色的风信子
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)Android开发优化---------UI优化
  • (C语言)二分查找 超详细
  • (搬运以学习)flask 上下文的实现
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • **PHP分步表单提交思路(分页表单提交)
  • .Net IE10 _doPostBack 未定义
  • .net 调用php,php 调用.net com组件 --
  • .Net 路由处理厉害了
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .py文件应该怎样打开?
  • .so文件(linux系统)
  • @Builder用法