上一章节我们已经看了怎么获得NavMesh数据保存为obj

这一章节我们来读取NavMesh数据

首先我们要定义两个结构体

点 和 三角形

为什么不用unity自带的Vector3呢?

相信你们应该已经知道  我们的寻路不能使用浮点运算

这时候我们就要确定一个精度

我这里设置为10000

namespace AStar
{
public class AStarConfig
{
/// <summary>
/// 精度
/// </summary>
public const int precision = ;
}
}

点结构体:

using UnityEngine;

namespace AStar
{
/// <summary>
/// 点.
/// </summary>
public struct AStarPonit
{
public int x;
public int y;
public int z; /// <summary>
/// 构造函数
/// </summary>
/// <param name="point"></param>
public AStarPonit(Vector3 point)
{
x = (int)(point.x * AStarConfig.precision);
y = (int)(point.y * AStarConfig.precision);
z = (int)(point.z * AStarConfig.precision);
}
}
}

三角形结构体:

namespace AStar
{
/// <summary>
/// 三角形
/// </summary>
public struct AStarTriangle
{
//三角形的三个点坐标
public AStarPonit a;
public AStarPonit b;
public AStarPonit c; /// <summary>
/// 三角形重心
/// </summary>
public AStarPonit centroid; /// <summary>
/// 构造函数
/// </summary>
public AStarTriangle(AStarPonit a, AStarPonit b, AStarPonit c)
{
this.a = a;
this.b = b;
this.c = c; //计算重心
centroid.x = (a.x + b.x + c.x) / ;
centroid.y = (a.y + b.y + c.y) / ;
centroid.z = (a.z + b.z + c.z) / ;
}
}
}

我们需要一个类来保存导航网格信息方便 方便算法使用数据

using System.Collections.Generic;

namespace AStar
{
/// <summary>
/// 导航网格信息
/// </summary>
public class NavMeshInfo
{
/// <summary>
/// 所有的三角形
/// </summary>
public List<AStarTriangle> allTriangle = new List<AStarTriangle>();
/// <summary>
/// 所有的重心
/// </summary>
public List<AStarPonit> allCentroid = new List<AStarPonit>();
/// <summary>
/// 三角形索引 key点 .value点构成的所有三角形 正常情况为三个
/// </summary>
public Dictionary<AStarPonit, List<AStarTriangle>> pointIndexes = new Dictionary<AStarPonit, List<AStarTriangle>>();
}
}

读取导航网格信息代码:

using UnityEngine;
using System.IO;
using System.Collections.Generic; namespace AStar
{
public class NavMeshLoad
{
List<Vector3> allPoint = new List<Vector3>(); /// <summary>
/// 读取导航网格信息
/// </summary>
/// <param name="path">路径</param>
public NavMeshInfo Load(string path)
{
List<string> fileInfo = LoadFile(path); NavMeshInfo navMeshInfo = ReadInfo(fileInfo); return navMeshInfo;
} /// <summary>
/// 读取文件
/// </summary>
/// <param name="path">路径</param>
List<string> LoadFile(string path)
{
StreamReader sr = new StreamReader(path); string line;
List<string> fileInfo = new List<string>();
while ((line = sr.ReadLine()) != null)
{
//一行一行的读取
//将每一行的内容存入数组链表容器中
fileInfo.Add(line);
}
//关闭流
sr.Close();
//销毁流
sr.Dispose();
//将数组链表容器返回
return fileInfo;
} /// <summary>
/// 读取数据
/// </summary>
/// <param name="fileInfo">文件信息</param>
/// <returns></returns>
NavMeshInfo ReadInfo(List<string> fileInfo)
{
NavMeshInfo navMeshInfo = new NavMeshInfo(); for (int i = ; i < fileInfo.Count; i++)
{
string str = fileInfo[i]; string[] Split = str.Split(' '); if (Split[] == "v")
{
allPoint.Add(new Vector3(float.Parse(Split[]), float.Parse(Split[]), float.Parse(Split[])));
}
else if (Split[] == "f")
{
int a = int.Parse(Split[]);
int b = int.Parse(Split[]);
int c = int.Parse(Split[]); Vector3 aa = allPoint[a - ];
Vector3 bb = allPoint[b - ];
Vector3 cc = allPoint[c - ]; AStarPonit aaa = new AStarPonit(aa);
AStarPonit bbb = new AStarPonit(bb);
AStarPonit ccc = new AStarPonit(cc); AStarTriangle triangle = new AStarTriangle(aaa, bbb, ccc); navMeshInfo.allCentroid.Add(triangle.centroid); navMeshInfo.allTriangle.Add(triangle); AddPointIndexes(navMeshInfo.pointIndexes, aaa, triangle);
AddPointIndexes(navMeshInfo.pointIndexes, bbb, triangle);
AddPointIndexes(navMeshInfo.pointIndexes, ccc, triangle);
}
} return navMeshInfo;
} /// <summary>
/// 添加顶点索引
/// </summary>
/// <param name="navMeshInfo"></param>
/// <param name="ponit"></param>
/// <param name="triangle"></param>
void AddPointIndexes(Dictionary<AStarPonit, List<AStarTriangle>> navMeshInfo, AStarPonit ponit, AStarTriangle triangle)
{
if (navMeshInfo.ContainsKey(ponit))
{
navMeshInfo[ponit].Add(triangle);
}
else
{
List<AStarTriangle> list = new List<AStarTriangle>();
list.Add(triangle);
navMeshInfo.Add(ponit, list);
}
}
}
}

我们来写个测试代码看下是否能获得:

using UnityEngine;
using AStar; public class test : MonoBehaviour
{
void Start()
{
NavMeshLoad navMeshLoad = new NavMeshLoad(); NavMeshInfo navMeshInfo = navMeshLoad.Load(Application.dataPath + "/AStar/obj/test.obj");
}
}

断点后 我们看navMeshInfo变量  已经可以看到有数据了

链接: https://pan.baidu.com/s/1Y3BDlp506x7_diq7_d48zw 密码: ihvh

unity A*寻路 (二)读取NavMesh数据的更多相关文章

  1. 信息管理代码分析<二>读取二进制文件数据

    first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...

  2. unity A*寻路 (一)导出NavMesh数据

    使用unity的API   NavMesh.CalculateTriangulation 可以获取NavMesh数据 首先 我们创建一个新的工程 保存一个test场景 然后在场景中添加一个Plane作 ...

  3. EMV/PBOC 解析(二) 卡片数据读取

    上一篇简单的了解了IC智能卡的文件结构和APDU报文,这篇我们直接来读取卡内的数据.下面我们主要参照<中国金融集成电路(IC)卡规范>. 好了废话不多说,下面贴指令: (1)卡片接收一个来 ...

  4. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...

  5. Unity关于用LoadLevelAdditiveAsync导致新场景的Navmesh数据不正确Loading条的实践

    为了解决用Application.LoadLevelAdditiveAsync 导致新场景的Navmesh数据不正确(我们用的是4.63),我们现在loading条做法是先切到Loading的场景,然 ...

  6. 2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取

    paddlepaddle将数据保存为recordio文件并读取 因为有时候一次性将数据加载到内存中有可能太大,所以我们可以选择将数据转换成标准格式recordio文件并读取供我们的网络利用,接下来记录 ...

  7. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  8. NPOI操作excel之读取excel数据

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.  一.下载引用 去NPOI官网http://npoi.codeplex. ...

  9. iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

    一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运 ...

随机推荐

  1. UVA1213

    先打表,再回溯+剪枝 AC代码: #include<cstdio> #include<cstring> #include<cmath> const int maxn ...

  2. Py4j-RPC

    python 使用灵活.方便在科研中被广泛的使用,Numpy和SciPy等科学计算库使其拥有强大的计算方式.很多机器学习和深度学习的库也都采用了python,然而在大数据.后台开发中仍然较多的使用Ja ...

  3. centos下利用qemu搭建arm模拟器

    有点繁琐,整理一下,系统环境centos6.6,虚拟机以及实际系统中测试通过. 一.交叉编译器的下载与安装1.下载地址:http://blog.csdn.net/dldw8816/article/de ...

  4. R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...

  5. 在windows XP系统下编译和使用ffmpeg

    最近在做流媒体开发这一块,在服务器端,所用的live555不支持mp4,avi等视频容器格式,所以打算运用ffmpeg来进行扩展.将MP4文件先运用ffmpeg进行解析,解析成live555所支持的基 ...

  6. 使用ifstream和getline读取文件内容[c++]

    转载:http://www.cnblogs.com/JCSU/articles/1190685.html 假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion ...

  7. freemarker自定义标签报错(四)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  8. 错误代码: 1054 Unknown column 'course' in 'field list'

    1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT stu_name, course, score FROM t_ ...

  9. C#扩展方法类库StringExtensions

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. jquery Dialog弹框插件

    function Dialog(options) { var defaults = { // 默认值. title: '', // 标题文本,若不想显示title请通过CSS设置其display为no ...