using Thousandto.Core.Asset; using System.IO; using UnityEngine; namespace Thousandto.Editor.Test { /// /// 地形网格的详细信息:起始位置、尺寸、索引等 /// public class MyTerrainData { public float StartX { get; set; } public float StartZ { get; set; } //Z方向为width public float Width { get; set; } //X方向为height public float Height { get; set; } public float PixelScaleX1000 { get; set; } //control图的uv的offset public Vector2 Offset { get; set; } public Vector3 TerrainSize { get; set; } //是否Z方向边界 public bool IsRightBound { get; set; } //是否X方向边界 public bool IsBottomBound { get; set; } public string Index { get; set; } public string TerrainName { get; set; } public bool MoreLeft { get { return StartZ > 0; } } public bool MoreRight { get { return !IsRightBound; } } public bool MoreTop { get { return StartX > 0; } } public bool MoreBottom { get { return !IsBottomBound; } } private Rect _rect; private bool _hasSetRect = false; public Rect Rect { get { if (!_hasSetRect) { _rect = GetRectSize(); _hasSetRect = true; } return _rect; } } public MyTerrainData() { } public MyTerrainData(string name) { TerrainName = name; } /// /// /// /// 消除因扩展了一格造成的影响 /// public string CombineToFileName(bool eraseBound = false) { //index_zXxXwidthXheith_scale_isRight_isBottom var fileName = string.Format("{2}_{8}x{9}_{0}x{1}x{4}x{5}_{3}_{6}_{7}_{10}x{11}x{12}", StartZ, StartX, Index, PixelScaleX1000, Width, Height, IsRightBound, IsBottomBound, Offset.x, Offset.y, TerrainSize.x, TerrainSize.y, TerrainSize.z); if(eraseBound) { fileName = string.Format("{2}_{8}x{9}_{0}x{1}x{4}x{5}_{3}_{6}_{7}_{10}x{11}x{12}", MoreLeft ? StartZ + 1: StartZ, MoreTop ? StartX + 1 : StartX, Index, PixelScaleX1000, MoreRight ? Width - 1 : Width, MoreBottom ? Height - 1 : Height, IsRightBound, IsBottomBound, Offset.x, Offset.y, TerrainSize.x, TerrainSize.y, TerrainSize.z); fileName = TerrainName + "_" + fileName; //这里需要重新计算索引 var data = CreateTerrainDataFromFileName(fileName, false); data.Index = "" + Utils.CalcIndex(data.GetCenterPos(), TerrainConfigDefine.BLOCK_SIZE); return data.CombineToFileName(); } fileName = TerrainName + "_" + fileName; return fileName; } public static MyTerrainData CreateTerrainDataFromFileName(string filePath, bool checkFileName = true) { UnityEngine.Debug.Log("CreateTerrainDataFromFile: " + filePath); MyTerrainData data = new MyTerrainData(""); var fileName = filePath; if(checkFileName) fileName = Path.GetFileNameWithoutExtension(filePath); var dataArray = fileName.Split('_'); var offsetArray = dataArray[2].Split('x'); var boundDataArray = dataArray[3].Split('x'); Vector2 offset = new Vector2(float.Parse(offsetArray[0]), float.Parse(offsetArray[1])); data.Offset = offset; data.TerrainName = dataArray[0]; data.Index = dataArray[1]; data.StartZ = float.Parse(boundDataArray[0]); data.StartX = float.Parse(boundDataArray[1]); data.Width = float.Parse(boundDataArray[2]); data.Height = float.Parse(boundDataArray[3]); data.PixelScaleX1000 = float.Parse(dataArray[4]); data.IsRightBound = bool.Parse(dataArray[5]); data.IsBottomBound = bool.Parse(dataArray[6]); var terrainSizeStrArray = dataArray[7].Split('x'); Vector3 terrainSize = new Vector3(float.Parse(terrainSizeStrArray[0]), float.Parse(terrainSizeStrArray[1]), float.Parse(terrainSizeStrArray[2])); data.TerrainSize = terrainSize; return data; } public Rect GetRectSize() { float pixelScale = PixelScaleX1000 / 1000f; float posX = StartX * pixelScale; float posY = StartZ * pixelScale; //x方向是width,所以这里要写反 float height = (Width - StartZ) * pixelScale; float width = (Height - StartX) * pixelScale; return new Rect(posX, posY, width, height); } public Vector2 GetCenterPos() { var rect = GetRectSize(); var centerPos2D = (rect.min + rect.max) / 2; return centerPos2D; } } }