array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 unity A*寻路 (二)读取NavMesh数据 - 爱码网
zouqiang

unity A*寻路 (二)读取NavMesh数据

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

 

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

 

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

点 和 三角形

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

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

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

 

我这里设置为10000

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

 

 

点结构体:

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) / 3;
            centroid.y = (a.y + b.y + c.y) / 3;
            centroid.z = (a.z + b.z + c.z) / 3;
        }
    }
}

 

 

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

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 = 0; i < fileInfo.Count; i++)
            {
                string str = fileInfo[i];

                string[] Split = str.Split(' ');

                if (Split[0] == "v")
                {
                    allPoint.Add(new Vector3(float.Parse(Split[2]), float.Parse(Split[3]), float.Parse(Split[4])));
                }
                else if (Split[0] == "f")
                {
                    int a = int.Parse(Split[1]);
                    int b = int.Parse(Split[2]);
                    int c = int.Parse(Split[3]);

                    Vector3 aa = allPoint[a - 1];
                    Vector3 bb = allPoint[b - 1];
                    Vector3 cc = allPoint[c - 1];

                    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变量  已经可以看到有数据了

 

posted on 2018-03-21 17:52 邹强 阅读(...) 评论(...) 编辑 收藏

分类:

技术点:

相关文章: