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>运行时字典转模型,运 ...
随机推荐
- 关于Spring事务的原理,以及在事务内开启线程,连接池耗尽问题.
主要以结果为导向解释Spring 事务原理,连接池的消耗,以及事务内开启事务线程要注意的问题. Spring 事务原理这里不多说,网上一搜一大堆,也就是基于AOP配合ThreadLocal实现. 这里 ...
- Docker系列一:Docker基本概念及指令介绍
1. Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用 ...
- AES-256加密解密
/// <summary> /// AES-256加密 /// </summary> /// <param name="toEncrypt">& ...
- Hbase配置java客户端
1.修改windows配置文件 C:\WINDOWS\system32\drivers\etc\hosts 将远程hbase和zookeeper主机的IP地址加进去 54.0.88.53 H ...
- mysql用户授权及数据备份恢复
用户授权与权限撤销 修改数据库管理员从本机登陆的密码测试: mysqladmin -hlocalhost -uroot -p password "新密码" Enter passwo ...
- Mycat 分布式事务的实现
引言:Mycat已经成为了一个强大的开源分布式数据库中间件产品.面对企业应用的海量数据事务处理,是目前最好的开源解决方案.但是如果想让多台机器中的数据保存一致,比较常规的解决方法是引入"协调 ...
- 工作中常用的linux命令(2)
1.find :查找指定文件名的路径: 列出当前目录以及子目录中的所有文件: 在当前目录下寻找特定文件名的文件: 列出长度为零的文件: 2.ps :查看某个程序的进程,例如查询mongodb和mysq ...
- FusionWidgets DrawingPad图
1.数据源 DrawingPad.xml: <?xml version="1.0" encoding="UTF-8"?> <chart bgC ...
- freemarker之include指令
freemarker之include指令 1.父页面ftl <html> <head> <meta http-equiv="content-type" ...
- Error:Error #2174
1.错误描述 Error:Error #2174 : 对于每个FileReference,每次只能执行一个下载.上载.加载或保存操作 2.错误原因 Flex中,在做单文件上传时,多次点击"上 ...