Files
Main/Assets/Editor/SplitTerrain/DataInfo/MyTerrainData.cs

155 lines
5.2 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using Thousandto.Core.Asset;
using System.IO;
using UnityEngine;
namespace Thousandto.Editor.Test
{
/// <summary>
/// 地形网格的详细信息:起始位置、尺寸、索引等
/// </summary>
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;
}
/// <summary>
///
/// </summary>
/// <param name="eraseBound">消除因扩展了一格造成的影响</param>
/// <returns></returns>
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;
}
}
}