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>运行时字典转模型,运 ...
随机推荐
- uva1354 枚举二叉树
这题很难,这几天一直在想这题,最后看了汝佳大哥的代码才明白.贴上代码 // UVa1354 Mobile Computing // Rujia Liu #include<cstdio> # ...
- HDU - 3533 bfs [kuangbin带你飞]专题二
看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...
- php留言板
这个小项目的学习,就这样结束啦.由于过程中需要使用到js,这个目前还是感觉不会.之前的分析还是不太懂的.现在心里还是有点迷茫.什么都是照着葫芦画瓢. 我的拥有自己的东西才行.
- kibana常用聚合查询DSL语句记录
-------- GET winlogbeat-2017.11.*/_search { "query": { "bool": { "must" ...
- SQL Server使用侦听器IP访问时遇到"The target principal name is incorrect. Cannot generate SSPI context"
在测试SQL Server 2016 Always On时,在创建侦听器后,在客户端使用SSMS, 可以用侦听器名称访问Always On集群,但是使用侦听器IP访问时遇到"The targ ...
- Android热修复(动态加载)方案汇总
整理了以下动态加载的方案,便于在项目中使用时查阅: Dexposed github (https://github.com/alibaba/dexposed) AndFix github (https ...
- java 堆 栈 常量池
java 堆中保存new 出来的对象(每个对象都包含一个与之对应的class的信息,[class信息存放在方法区]),堆中分配的内存,有虚拟机的自动垃圾回收器管理,栈内存只对其所属线程可见. java ...
- 剑指offer 第十天
37.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数. 采用二分查找法 /* 方法一:时间复杂度O(n),不可选 */ public class Solution { public i ...
- [mysql] 2进制安装和简单优化
##################################mysql 2进制安装和简单优化################################################## ...
- javascript右键菜单分析
右键菜单 思路 1.遮蔽原来的默认右键菜单 2.新建右键菜单跟随鼠标移动 3.注意边界处的位置变化 4.自定义右键内容的具体效果 具体 这样的事件涉及到有关contextmenu事件,阻止默认事件,获 ...