上一章节我们已经看了怎么获得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. 记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖,编码集问题无法读取文件等.

    spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 ...

  2. cache缓存的BUG

    坑: 1.在使用这个模版代码开发的时候,当我们改变了数据库表的设置的时候,我们都要把本地的cache缓存文件删除一下. 如果不删除的话,当我们改变数据库设置的之后,程序读取数据是从本地的缓存文件里面读 ...

  3. 企业内部DNS跨国配置案例

    背景介绍:总公司与北京分公司均由总公司进行统一管理.总公司的主从DNS担任解析总公司服务器与北京分公司的服务器解析任务.总公司DNS委派其他两个公司管理自己域下的服务器解析任务.要求任何一个节点都能解 ...

  4. 在bmp上添加字符2

    void CTextOnbmpDlg::OnButton2() {  // TODO: Add your control notification handler code here  FILE *f ...

  5. Java求素数时出现错误

    Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...

  6. zTree实现地市县三级级联封装类

    zTree实现地市县三级级联封装类 Province.java: /** * @Title:Province.java * @Package:com.gwtjs.model * @Descriptio ...

  7. JavaScript获取当前值

    JavaScript获取当前值 1.说明        获取select下拉框中的选中的值以及文本值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  8. org.apache.catalina.LifecycleException: Failed to start component

    1.错误描述 Using CATALINA_BASE: "D:\NetBeans\apache-tomcat-8.0.12" Using CATALINA_HOME: " ...

  9. Flex中单选按钮控制表格中的列的增加或减少

    1.问题背景 单选按钮有"苹果"和"香蕉"两个,表格中的列有星期.苹果.香蕉和苹果比率,选择了"苹果"单选按钮,表格显示星期.苹果和苹果比率 ...

  10. python实现列表倒叙打印

    def func(listNode): listNode.reverse() for i in listNode: print(i) li = [1,2,3,4,5] func(li) 利用pytho ...