少年修仙传客户端基础资源
client_Wu Xijin
2018-08-14 31c2cebbccba45a00a755981dd6d0cdd0a0459e9
Assets/Editor/Tool/NavMeshExport.cs
@@ -1,530 +1,530 @@
using UnityEngine;
using System.Collections.Generic;
using UnityEditor;
using System.IO;
using UnityEngine.AI;
using System;
public class NavMeshExport : EditorWindow
{
    static byte[] _writedBytes = null;
    /** 字节写入位置索引 */
    static int _writeIndex = 128;
    private static int[][] m_Datas;
    // 主文件
    private static List<List<int>> m_MainData = null;
    [MenuItem("美术工具/场景/合并布怪区")]
    static void Init()
    {
        var _window = CreateInstance<NavMeshExport>();
        _window.Show();
    }
    private void BuildCurData()
    {
        float _navWidth;
        float _navHeight;
        float _maxWidth;
        float _maxHeight;
        Vector3[] _navVertices = NavMesh.CalculateTriangulation().vertices;
        if (_navVertices == null || _navVertices.Length <= 0)
        {
            return;
        }
        List<Vector3> _chkList = new List<Vector3>(_navVertices);
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.x > v2.x ? -1 : 1;
        });
        _navWidth = _chkList[0].x - _chkList[_chkList.Count - 1].x;
        _maxWidth = _navWidth + _chkList[_chkList.Count - 1].x;
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.z > v2.z ? -1 : 1;
        });
        _navHeight = _chkList[0].z - _chkList[_chkList.Count - 1].z;
        _maxHeight = _navHeight + _chkList[_chkList.Count - 1].z;
        float _outWidth = (int)(_maxWidth * 2) + 1;
        float _outHeight = (int)(_maxHeight * 2) + 1;
        float _column;
        float _row;
        var _curData = new List<List<int>>();
        for (int r = 0; r < _outHeight; ++r)
        {
            List<int> _rowData = new List<int>();
            for (int c = 0; c < _outWidth; ++c)
            {
                _column = c * .5f;
                _row = r * .5f;
                if (IsInNavmeshArea(_column, _row))
                {
                    _rowData.Add(00);
                }
                else
                {
                    _rowData.Add(03);
                }
            }
            _curData.Add(_rowData);
        }
        MapCollide _file = new MapCollide();
        _file.width = _curData[0].Count;
        _file.height = _curData.Count;
        _file.data = new int[_curData.Count][];
        for (int r = 0; r < _curData.Count; ++r)
        {
            _file.data[r] = new int[_curData[r].Count];
            for (int c = 0; c < _curData[r].Count; ++c)
            {
                _file.data[r][c] = _curData[r][c];
            }
        }
        LitJson.JsonData _jsonData = LitJson.JsonMapper.ToJson(_file);
        string _dirPath = Application.dataPath + "/Editor/MapCollideFiles/";
        if (!Directory.Exists(_dirPath))
        {
            Directory.CreateDirectory(_dirPath);
        }
        string _filePath = _dirPath + UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + ".json";
        using (StreamWriter _sw = new StreamWriter(_filePath))
        {
            _sw.Write(_jsonData.ToString());
        }
        AssetDatabase.Refresh();
    }
    private void CombineFromFile()
    {
        string _inputPath = EditorUtility.OpenFilePanel("打开合并文件",
            Application.dataPath + "/Editor/MapCollideFiles/", "asset");
        if (string.IsNullOrEmpty(_inputPath))
        {
            return;
        }
        string _fileName = Path.GetFileNameWithoutExtension(_inputPath);
        string _configPath = "Assets/Editor/MapCollideFiles/" + _fileName + ".asset";
        MapCombine _config = AssetDatabase.LoadAssetAtPath<MapCombine>(_configPath);
        if (_config == null)
        {
            Debug.LogErrorFormat("{0} 文件无法读取.", _configPath);
            return;
        }
        string _mainFilePath = Application.dataPath + "/Editor/MapCollideFiles/" + _config.mainFileName + ".json";
        string _jsonData = string.Empty;
        using (StreamReader _sr = new StreamReader(_mainFilePath))
        {
            _jsonData = _sr.ReadToEnd();
        }
        if (string.IsNullOrEmpty(_jsonData))
        {
            Debug.LogErrorFormat("{0} 文件无法读取.", _config.mainFileName);
            return;
        }
        MapCollide _file = LitJson.JsonMapper.ToObject<MapCollide>(_jsonData);
        if (m_MainData == null)
        {
            m_MainData = new List<List<int>>();
        }
        else
        {
            m_MainData.Clear();
        }
        for (int i = 0; i < _file.height; ++i)
        {
            List<int> _row = new List<int>();
            for (int j = 0; j < _file.width; ++j)
            {
                _row.Add(_file.data[i][j]);
            }
            m_MainData.Add(_row);
        }
        for (int i = 0; i < _config.dataList.Count; ++i)
        {
            Combine(_config.dataList[i]);
        }
        _writedBytes = null;
        string _exportPath = EditorUtility.SaveFilePanel("",
                                                  "",
                                                  _config.mainFileName,
                                                  "col");
        if (string.IsNullOrEmpty(_exportPath))
        {
            return;
        }
        if (File.Exists(_exportPath))
        {
            File.Delete(_exportPath);
        }
        WriteBytes(BitConverter.GetBytes((uint)(m_MainData[0].Count)));
        WriteBytes(BitConverter.GetBytes((uint)(m_MainData.Count)));
        m_Datas = new int[m_MainData.Count][];
        for (int i = 0; i < m_Datas.Length; ++i)
        {
            m_Datas[i] = new int[m_MainData[i].Count];
        }
        for (int r = 0; r < m_MainData.Count; ++r)
        {
            for (int c = 0; c < m_MainData[r].Count; ++c)
            {
                m_Datas[r][c] = m_MainData[r][c];
            }
        }
        for (int i = 0; i < m_Datas.Length; i++)
        {
            WriteBytes(m_Datas[i]);
        }
        WriteToFile(_exportPath);
    }
    private Vector3 m_ChkPos;
    private void OnGUI()
    {
        if (GUILayout.Button("合并配置文件地图"))
        {
            CombineFromFile();
        }
        if (GUILayout.Button("生成当前地图的合并文件"))
        {
            BuildCurData();
        }
        GUILayout.Space(10);
        EditorGUILayout.BeginHorizontal();
        m_ChkPos = EditorGUILayout.Vector3Field("测试点", m_ChkPos);
        if (GUILayout.Button("测试"))
        {
            if (IsInNavmeshArea(m_ChkPos.x, m_ChkPos.z))
            {
                Debug.Log("正常点...........");
            }
            else
            {
                Debug.Log("障碍点...........");
            }
        }
        EditorGUILayout.EndHorizontal();
        if (GUILayout.Button("直接导出当前地图.col文件"))
        {
            Export();
        }
        if (m_Datas == null)
        {
            return;
        }
        Rect _rect = new Rect(0, 0, 2, 2);
        for (int i = 0; i < m_Datas.Length; ++i)
        {
            if (m_Datas[i] == null)
            {
                continue;
            }
            for (int j = 0; j < m_Datas[i].Length; ++j)
            {
                if (m_Datas[i][j] == 00)
                {
                    GUI.color = Color.green;
                }
                else if (m_Datas[i][j] == 03)
                {
                    GUI.color = Color.red;
                }
                _rect.position = new Vector2(j * 2 + 4, i * 2 + 72);
                GUI.Box(_rect, "");
            }
        }
    }
    private void OnDisable()
    {
        m_Datas = null;
        m_MainData = null;
    }
    private void Combine(MapCombine.MapCombineInfo info)
    {
        if (m_MainData == null)
        {
            return;
        }
        // 读取文件
        string _filePath = Application.dataPath + "/Editor/MapCollideFiles/" + info.fileName + ".json";
        string _jsonData = string.Empty;
        using (StreamReader _sr = new StreamReader(_filePath))
        {
            _jsonData = _sr.ReadToEnd();
        }
        if (string.IsNullOrEmpty(_jsonData))
        {
            Debug.LogErrorFormat("{0} 文件无法读取.", info.fileName);
            return;
        }
        MapCollide _file = LitJson.JsonMapper.ToObject<MapCollide>(_jsonData);
        int _prevRowCount = m_MainData.Count;
        int _prevColumnCount = m_MainData[0].Count;
        int _curRowCount = _file.height;
        int _curColumnCount = _file.width;
        int _newRowCount = 0;
        int _newColumnCount = 0;
        // 填入的偏移R + 新地图的高度 与 之前地图的高度进行对比, 得到差值
        int _deltaRowCount = info.offsetY + _curRowCount - _prevRowCount;
        // 差值大于0, 则新建一个数组, 此数组为旧的R + 差值
        if (_deltaRowCount > 0)
        {
            _newRowCount = _prevRowCount + _deltaRowCount;
        }
        else
        {
            _newRowCount = _prevRowCount;
        }
        // 列同理
        int _deltaColumnCount = info.offsetX + _curColumnCount - _prevColumnCount;
        if (_deltaColumnCount > 0)
        {
            _newColumnCount = _prevColumnCount + _deltaColumnCount;
        }
        else
        {
            _newColumnCount = _prevColumnCount;
        }
        // 扩容
        for (int i = m_MainData.Count; i < _newRowCount; ++i)
        {
            List<int> _tmp = new List<int>();
            for (int j = 0; j < _prevColumnCount; ++j)
            {
                _tmp.Add(03);
            }
            m_MainData.Add(_tmp);
        }
        for (int i = 0; i < m_MainData.Count; ++i)
        {
            for (int j = _prevColumnCount; j < _newColumnCount; ++j)
            {
                m_MainData[i].Add(03);
            }
        }
        // 赋值
        for (int i = 0; i < _file.data.Length; ++i)
        {
            for (int j = 0; j < _file.data[i].Length; ++j)
            {
                m_MainData[i + info.offsetY][j + info.offsetX] = _file.data[i][j];
            }
        }
    }
    static void Export()
    {
        string path = EditorUtility.SaveFilePanel("",
                                                  "",
                                                  UnityEngine.SceneManagement.SceneManager.GetActiveScene().name,
                                                  "col");
        if (string.IsNullOrEmpty(path))
        {
            return;
        }
        if (File.Exists(path))
        {
            File.Delete(path);
        }
        float _navWidth;
        float _navHeight;
        float _maxWidth;
        float _maxHeight;
        Vector3[] _navVertices = NavMesh.CalculateTriangulation().vertices;
        if (_navVertices == null || _navVertices.Length <= 0)
        {
            return;
        }
        List<Vector3> _chkList = new List<Vector3>(_navVertices);
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.x > v2.x ? -1 : 1;
        });
        _navWidth = _chkList[0].x - _chkList[_chkList.Count - 1].x;
        _maxWidth = _navWidth + _chkList[_chkList.Count - 1].x;
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.z > v2.z ? -1 : 1;
        });
        _navHeight = _chkList[0].z - _chkList[_chkList.Count - 1].z;
        _maxHeight = _navHeight + _chkList[_chkList.Count - 1].z;
        int _outWidth = (int)(_maxWidth * 2) + 1;
        int _outHeight = (int)(_maxHeight * 2) + 1;
        WriteBytes(BitConverter.GetBytes((uint)(_outWidth)));
        WriteBytes(BitConverter.GetBytes((uint)(_outHeight)));
        Debug.LogFormat("地图宽度: {0}, 地图高度: {1}", _outWidth, _outHeight);
        float _column;
        float _row;
        int[][] _datas = new int[_outHeight][];
        for (int i = 0; i < _datas.Length; i++)
        {
            _datas[i] = new int[_outWidth];
        }
        //System.Text.StringBuilder _sb1 = new System.Text.StringBuilder();
        for (int r = 0; r < _outHeight; ++r)
        {
            for (int c = 0; c < _outWidth; ++c)
            {
                _column = c * .5f;
                _row = r * .5f;
                if (IsInNavmeshArea(_column, _row))
                {
                    _datas[r][c] = 00;
                    //_sb1.Append("0");
                }
                else
                {
                    _datas[r][c] = 03;
                    //_sb1.Append("#");
                }
            }
            //_sb1.Append("\r\n");
        }
        //using (StreamWriter _writer = new StreamWriter(Application.dataPath + "/aaa.txt"))
        //{
        //    _writer.Write(_sb1.ToString());
        //}
        for (int i = 0; i < _datas.Length; i++)
        {
            WriteBytes(_datas[i]);
        }
        WriteToFile(path);
    }
    private static bool IsInNavmeshArea(float column, float row)
    {
        int _mask = 1 << LayerMask.NameToLayer("Navmesh");
        return Physics.Raycast(new Vector3(column, 100, row), Vector3.down, 200, _mask)
            || Physics.Raycast(new Vector3(column + .5f, 100, row), Vector3.down, 200, _mask)
            || Physics.Raycast(new Vector3(column, 100, row + .5f), Vector3.down, 200, _mask)
            || Physics.Raycast(new Vector3(column + .5f, 100, row + .5f), Vector3.down, 200, _mask);
    }
    private static void WriteToFile(string path)
    {
        FileStream fs = File.Open(path, FileMode.CreateNew, FileAccess.ReadWrite);
        BinaryWriter bw = new BinaryWriter(fs);
        //将byte数组写入文件中
        bw.Write(_writedBytes, 0, _writedBytes.Length);
        bw.Flush();
        bw.Close();
        fs.Dispose();
        fs.Close();
        _writeIndex = 128;
        _writedBytes = null;
    }
    /// <summary>
    /// 写入一段字节数据
    /// </summary>
    /// <param name="vBytes"></param>
    private static void WriteBytes(byte[] vBytes)
    {
        Array.Resize(ref _writedBytes, _writeIndex + vBytes.Length);
        vBytes.CopyTo(_writedBytes, _writeIndex);
        _writeIndex = _writedBytes.Length;
    }
    /// <summary>
    /// 转整型数值数组为字节
    /// </summary>
    /// <param name="vInts"></param>
    /// <param name="vType"></param>
    private static void WriteBytes(int[] vInts)
    {
        int l = vInts.Length;
        byte[] vRst;
        int i;
        vRst = new byte[l];
        for (i = 0; i < l; i++)
        {
            Array.Copy(BitConverter.GetBytes((byte)vInts[i]), 0, vRst, i, 1);
        }
        WriteBytes(vRst);
    }
using UnityEngine;
using System.Collections.Generic;
using UnityEditor;
using System.IO;
using UnityEngine.AI;
using System;
public class NavMeshExport : EditorWindow
{
    static byte[] _writedBytes = null;
    /** 字节写入位置索引 */
    static int _writeIndex = 128;
    private static int[][] m_Datas;
    // 主文件
    private static List<List<int>> m_MainData = null;
    [MenuItem("美术工具/场景/合并布怪区")]
    static void Init()
    {
        var _window = CreateInstance<NavMeshExport>();
        _window.Show();
    }
    private void BuildCurData()
    {
        float _navWidth;
        float _navHeight;
        float _maxWidth;
        float _maxHeight;
        Vector3[] _navVertices = NavMesh.CalculateTriangulation().vertices;
        if (_navVertices == null || _navVertices.Length <= 0)
        {
            return;
        }
        List<Vector3> _chkList = new List<Vector3>(_navVertices);
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.x > v2.x ? -1 : 1;
        });
        _navWidth = _chkList[0].x - _chkList[_chkList.Count - 1].x;
        _maxWidth = _navWidth + _chkList[_chkList.Count - 1].x;
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.z > v2.z ? -1 : 1;
        });
        _navHeight = _chkList[0].z - _chkList[_chkList.Count - 1].z;
        _maxHeight = _navHeight + _chkList[_chkList.Count - 1].z;
        float _outWidth = (int)(_maxWidth * 2) + 1;
        float _outHeight = (int)(_maxHeight * 2) + 1;
        float _column;
        float _row;
        var _curData = new List<List<int>>();
        for (int r = 0; r < _outHeight; ++r)
        {
            List<int> _rowData = new List<int>();
            for (int c = 0; c < _outWidth; ++c)
            {
                _column = c * .5f;
                _row = r * .5f;
                if (IsInNavmeshArea(_column, _row))
                {
                    _rowData.Add(00);
                }
                else
                {
                    _rowData.Add(03);
                }
            }
            _curData.Add(_rowData);
        }
        MapCollide _file = new MapCollide();
        _file.width = _curData[0].Count;
        _file.height = _curData.Count;
        _file.data = new int[_curData.Count][];
        for (int r = 0; r < _curData.Count; ++r)
        {
            _file.data[r] = new int[_curData[r].Count];
            for (int c = 0; c < _curData[r].Count; ++c)
            {
                _file.data[r][c] = _curData[r][c];
            }
        }
        LitJson.JsonData _jsonData = LitJson.JsonMapper.ToJson(_file);
        string _dirPath = Application.dataPath + "/Editor/MapCollideFiles/";
        if (!Directory.Exists(_dirPath))
        {
            Directory.CreateDirectory(_dirPath);
        }
        string _filePath = _dirPath + UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + ".json";
        using (StreamWriter _sw = new StreamWriter(_filePath))
        {
            _sw.Write(_jsonData.ToString());
        }
        AssetDatabase.Refresh();
    }
    private void CombineFromFile()
    {
        string _inputPath = EditorUtility.OpenFilePanel("打开合并文件",
            Application.dataPath + "/Editor/MapCollideFiles/", "asset");
        if (string.IsNullOrEmpty(_inputPath))
        {
            return;
        }
        string _fileName = Path.GetFileNameWithoutExtension(_inputPath);
        string _configPath = "Assets/Editor/MapCollideFiles/" + _fileName + ".asset";
        MapCombine _config = AssetDatabase.LoadAssetAtPath<MapCombine>(_configPath);
        if (_config == null)
        {
            Debug.LogErrorFormat("{0} 文件无法读取.", _configPath);
            return;
        }
        string _mainFilePath = Application.dataPath + "/Editor/MapCollideFiles/" + _config.mainFileName + ".json";
        string _jsonData = string.Empty;
        using (StreamReader _sr = new StreamReader(_mainFilePath))
        {
            _jsonData = _sr.ReadToEnd();
        }
        if (string.IsNullOrEmpty(_jsonData))
        {
            Debug.LogErrorFormat("{0} 文件无法读取.", _config.mainFileName);
            return;
        }
        MapCollide _file = LitJson.JsonMapper.ToObject<MapCollide>(_jsonData);
        if (m_MainData == null)
        {
            m_MainData = new List<List<int>>();
        }
        else
        {
            m_MainData.Clear();
        }
        for (int i = 0; i < _file.height; ++i)
        {
            List<int> _row = new List<int>();
            for (int j = 0; j < _file.width; ++j)
            {
                _row.Add(_file.data[i][j]);
            }
            m_MainData.Add(_row);
        }
        for (int i = 0; i < _config.dataList.Count; ++i)
        {
            Combine(_config.dataList[i]);
        }
        _writedBytes = null;
        string _exportPath = EditorUtility.SaveFilePanel("",
                                                  "",
                                                  _config.mainFileName,
                                                  "col");
        if (string.IsNullOrEmpty(_exportPath))
        {
            return;
        }
        if (File.Exists(_exportPath))
        {
            File.Delete(_exportPath);
        }
        WriteBytes(BitConverter.GetBytes((uint)(m_MainData[0].Count)));
        WriteBytes(BitConverter.GetBytes((uint)(m_MainData.Count)));
        m_Datas = new int[m_MainData.Count][];
        for (int i = 0; i < m_Datas.Length; ++i)
        {
            m_Datas[i] = new int[m_MainData[i].Count];
        }
        for (int r = 0; r < m_MainData.Count; ++r)
        {
            for (int c = 0; c < m_MainData[r].Count; ++c)
            {
                m_Datas[r][c] = m_MainData[r][c];
            }
        }
        for (int i = 0; i < m_Datas.Length; i++)
        {
            WriteBytes(m_Datas[i]);
        }
        WriteToFile(_exportPath);
    }
    private Vector3 m_ChkPos;
    private void OnGUI()
    {
        if (GUILayout.Button("合并配置文件地图"))
        {
            CombineFromFile();
        }
        if (GUILayout.Button("生成当前地图的合并文件"))
        {
            BuildCurData();
        }
        GUILayout.Space(10);
        EditorGUILayout.BeginHorizontal();
        m_ChkPos = EditorGUILayout.Vector3Field("测试点", m_ChkPos);
        if (GUILayout.Button("测试"))
        {
            if (IsInNavmeshArea(m_ChkPos.x, m_ChkPos.z))
            {
                Debug.Log("正常点...........");
            }
            else
            {
                Debug.Log("障碍点...........");
            }
        }
        EditorGUILayout.EndHorizontal();
        if (GUILayout.Button("直接导出当前地图.col文件"))
        {
            Export();
        }
        if (m_Datas == null)
        {
            return;
        }
        Rect _rect = new Rect(0, 0, 2, 2);
        for (int i = 0; i < m_Datas.Length; ++i)
        {
            if (m_Datas[i] == null)
            {
                continue;
            }
            for (int j = 0; j < m_Datas[i].Length; ++j)
            {
                if (m_Datas[i][j] == 00)
                {
                    GUI.color = Color.green;
                }
                else if (m_Datas[i][j] == 03)
                {
                    GUI.color = Color.red;
                }
                _rect.position = new Vector2(j * 2 + 4, i * 2 + 72);
                GUI.Box(_rect, "");
            }
        }
    }
    private void OnDisable()
    {
        m_Datas = null;
        m_MainData = null;
    }
    private void Combine(MapCombine.MapCombineInfo info)
    {
        if (m_MainData == null)
        {
            return;
        }
        // 读取文件
        string _filePath = Application.dataPath + "/Editor/MapCollideFiles/" + info.fileName + ".json";
        string _jsonData = string.Empty;
        using (StreamReader _sr = new StreamReader(_filePath))
        {
            _jsonData = _sr.ReadToEnd();
        }
        if (string.IsNullOrEmpty(_jsonData))
        {
            Debug.LogErrorFormat("{0} 文件无法读取.", info.fileName);
            return;
        }
        MapCollide _file = LitJson.JsonMapper.ToObject<MapCollide>(_jsonData);
        int _prevRowCount = m_MainData.Count;
        int _prevColumnCount = m_MainData[0].Count;
        int _curRowCount = _file.height;
        int _curColumnCount = _file.width;
        int _newRowCount = 0;
        int _newColumnCount = 0;
        // 填入的偏移R + 新地图的高度 与 之前地图的高度进行对比, 得到差值
        int _deltaRowCount = info.offsetY + _curRowCount - _prevRowCount;
        // 差值大于0, 则新建一个数组, 此数组为旧的R + 差值
        if (_deltaRowCount > 0)
        {
            _newRowCount = _prevRowCount + _deltaRowCount;
        }
        else
        {
            _newRowCount = _prevRowCount;
        }
        // 列同理
        int _deltaColumnCount = info.offsetX + _curColumnCount - _prevColumnCount;
        if (_deltaColumnCount > 0)
        {
            _newColumnCount = _prevColumnCount + _deltaColumnCount;
        }
        else
        {
            _newColumnCount = _prevColumnCount;
        }
        // 扩容
        for (int i = m_MainData.Count; i < _newRowCount; ++i)
        {
            List<int> _tmp = new List<int>();
            for (int j = 0; j < _prevColumnCount; ++j)
            {
                _tmp.Add(03);
            }
            m_MainData.Add(_tmp);
        }
        for (int i = 0; i < m_MainData.Count; ++i)
        {
            for (int j = _prevColumnCount; j < _newColumnCount; ++j)
            {
                m_MainData[i].Add(03);
            }
        }
        // 赋值
        for (int i = 0; i < _file.data.Length; ++i)
        {
            for (int j = 0; j < _file.data[i].Length; ++j)
            {
                m_MainData[i + info.offsetY][j + info.offsetX] = _file.data[i][j];
            }
        }
    }
    static void Export()
    {
        string path = EditorUtility.SaveFilePanel("",
                                                  "",
                                                  UnityEngine.SceneManagement.SceneManager.GetActiveScene().name,
                                                  "col");
        if (string.IsNullOrEmpty(path))
        {
            return;
        }
        if (File.Exists(path))
        {
            File.Delete(path);
        }
        float _navWidth;
        float _navHeight;
        float _maxWidth;
        float _maxHeight;
        Vector3[] _navVertices = NavMesh.CalculateTriangulation().vertices;
        if (_navVertices == null || _navVertices.Length <= 0)
        {
            return;
        }
        List<Vector3> _chkList = new List<Vector3>(_navVertices);
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.x > v2.x ? -1 : 1;
        });
        _navWidth = _chkList[0].x - _chkList[_chkList.Count - 1].x;
        _maxWidth = _navWidth + _chkList[_chkList.Count - 1].x;
        _chkList.Sort((Vector3 v1, Vector3 v2) =>
        {
            return v1.z > v2.z ? -1 : 1;
        });
        _navHeight = _chkList[0].z - _chkList[_chkList.Count - 1].z;
        _maxHeight = _navHeight + _chkList[_chkList.Count - 1].z;
        int _outWidth = (int)(_maxWidth * 2) + 1;
        int _outHeight = (int)(_maxHeight * 2) + 1;
        WriteBytes(BitConverter.GetBytes((uint)(_outWidth)));
        WriteBytes(BitConverter.GetBytes((uint)(_outHeight)));
        Debug.LogFormat("地图宽度: {0}, 地图高度: {1}", _outWidth, _outHeight);
        float _column;
        float _row;
        int[][] _datas = new int[_outHeight][];
        for (int i = 0; i < _datas.Length; i++)
        {
            _datas[i] = new int[_outWidth];
        }
        //System.Text.StringBuilder _sb1 = new System.Text.StringBuilder();
        for (int r = 0; r < _outHeight; ++r)
        {
            for (int c = 0; c < _outWidth; ++c)
            {
                _column = c * .5f;
                _row = r * .5f;
                if (IsInNavmeshArea(_column, _row))
                {
                    _datas[r][c] = 00;
                    //_sb1.Append("0");
                }
                else
                {
                    _datas[r][c] = 03;
                    //_sb1.Append("#");
                }
            }
            //_sb1.Append("\r\n");
        }
        //using (StreamWriter _writer = new StreamWriter(Application.dataPath + "/aaa.txt"))
        //{
        //    _writer.Write(_sb1.ToString());
        //}
        for (int i = 0; i < _datas.Length; i++)
        {
            WriteBytes(_datas[i]);
        }
        WriteToFile(path);
    }
    private static bool IsInNavmeshArea(float column, float row)
    {
        int _mask = 1 << LayerMask.NameToLayer("Navmesh");
        return Physics.Raycast(new Vector3(column, 100, row), Vector3.down, 200, _mask)
            || Physics.Raycast(new Vector3(column + .5f, 100, row), Vector3.down, 200, _mask)
            || Physics.Raycast(new Vector3(column, 100, row + .5f), Vector3.down, 200, _mask)
            || Physics.Raycast(new Vector3(column + .5f, 100, row + .5f), Vector3.down, 200, _mask);
    }
    private static void WriteToFile(string path)
    {
        FileStream fs = File.Open(path, FileMode.CreateNew, FileAccess.ReadWrite);
        BinaryWriter bw = new BinaryWriter(fs);
        //将byte数组写入文件中
        bw.Write(_writedBytes, 0, _writedBytes.Length);
        bw.Flush();
        bw.Close();
        fs.Dispose();
        fs.Close();
        _writeIndex = 128;
        _writedBytes = null;
    }
    /// <summary>
    /// 写入一段字节数据
    /// </summary>
    /// <param name="vBytes"></param>
    private static void WriteBytes(byte[] vBytes)
    {
        Array.Resize(ref _writedBytes, _writeIndex + vBytes.Length);
        vBytes.CopyTo(_writedBytes, _writeIndex);
        _writeIndex = _writedBytes.Length;
    }
    /// <summary>
    /// 转整型数值数组为字节
    /// </summary>
    /// <param name="vInts"></param>
    /// <param name="vType"></param>
    private static void WriteBytes(int[] vInts)
    {
        int l = vInts.Length;
        byte[] vRst;
        int i;
        vRst = new byte[l];
        for (i = 0; i < l; i++)
        {
            Array.Copy(BitConverter.GetBytes((byte)vInts[i]), 0, vRst, i, 1);
        }
        WriteBytes(vRst);
    }
}