unity A*寻路 (二)读取NavMesh数据
上一章节我们已经看了怎么获得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数据的更多相关文章
- 信息管理代码分析<二>读取二进制文件数据
first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...
- unity A*寻路 (一)导出NavMesh数据
使用unity的API NavMesh.CalculateTriangulation 可以获取NavMesh数据 首先 我们创建一个新的工程 保存一个test场景 然后在场景中添加一个Plane作 ...
- EMV/PBOC 解析(二) 卡片数据读取
上一篇简单的了解了IC智能卡的文件结构和APDU报文,这篇我们直接来读取卡内的数据.下面我们主要参照<中国金融集成电路(IC)卡规范>. 好了废话不多说,下面贴指令: (1)卡片接收一个来 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
- Unity关于用LoadLevelAdditiveAsync导致新场景的Navmesh数据不正确Loading条的实践
为了解决用Application.LoadLevelAdditiveAsync 导致新场景的Navmesh数据不正确(我们用的是4.63),我们现在loading条做法是先切到Loading的场景,然 ...
- 2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取
paddlepaddle将数据保存为recordio文件并读取 因为有时候一次性将数据加载到内存中有可能太大,所以我们可以选择将数据转换成标准格式recordio文件并读取供我们的网络利用,接下来记录 ...
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新
本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...
- NPOI操作excel之读取excel数据
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 一.下载引用 去NPOI官网http://npoi.codeplex. ...
- iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签
一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运 ...
随机推荐
- 批标准化(Batch Norm)
BN作用: 加速收敛 控制过拟合,可以少用或不用Dropout和正则 降低网络对初始化权重不敏感 允许使用较大的学习率 一.如何加速收敛? 通过归一化输入值/隐藏单元值,以获得类似的范围值,可加速学习 ...
- NOIP2017 - 宝藏
LibreOJ链接 Description 给出一个\(n(n\leq12)\)个点\(m(m\leq1000)\)条边的带权无向图,求该图的一棵生成树,使得其边权×该边距根的深度之和最小. Solu ...
- 用pycharm+flask 建立项目以后运行出现ImportError: No module named flask-login问题
出现此问题,一般情况下: 打开CMD输入: pip install flask-login 然后,在cmd中输入命令: pip list 查看目前已安装的的模板.在此时,如果你继续运行项目,有可能会发 ...
- 排序算法java实现
1. 插入排序 原理:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止. 算法的复杂度也是简单 ...
- RS232 3线制与7线制的区别
当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用少数几根信号线.最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根线(发送线.接收线.信号地线)便可 ...
- FusionCharts 2D柱状图和折线图的组合图调试错误
在设计FusionCharts 2D柱状图和折线图的组合图的时候,我发现不管怎么重启服务器,组合图就是不出来.后来,我通过调试发现我犯了一个致命的错误,运用平常一贯的思维,认为3D图有这种类型,那么2 ...
- DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)
虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...
- How to verify Certificate Pinning?
Some friends of mine they worry about the risk of Man-in-the-middle so they ask me how to verify the ...
- How I explained OOD to my wife(转)
How I explained OOD to my wife Learning Object Oriented Design principles through interesting conver ...
- Http头介绍:Expires,Cache-Control,Last-Modified,ETag
缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等.其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是客户 端,而几乎不耗费服务器端的资源. 让浏览器做缓存需要给浏览器发送指定的Http头,告诉浏览器 ...