渲染地形
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class ChunkMeshCreator : MonoBehaviour
{
private Tile[,] chunkTileDate;
private Vector2Int chunkPos;
private TerrainGenerator_01 m_Manager;
private MeshFilter m_MeshFilter;
private MeshRenderer m_MeshRenderer;
private Mesh m_Mesh;
private List<Vector3> m_Vertices;
private List<Vector2> m_UV;
private List<int> trianglesList;
private int vertCount;
private void Awake()
{
chunkTileDate = new Tile[64, 64];
m_MeshFilter = GetComponent<MeshFilter>();
m_MeshRenderer = GetComponent<MeshRenderer>();
}
public void SetTileDate(TerrainGenerator_01 _manager, Vector2Int _chunkPos)
{
m_Vertices = new List<Vector3>();
m_UV = new List<Vector2>();
trianglesList = new List<int>();
m_Manager = _manager;
chunkPos = _chunkPos;
for (int y = 0; y < 64; y++)
{
for (int x = 0; x < 64; x++)
{
if ((chunkPos.x * 64) + x >= 1000 || (chunkPos.y * 64) + y >= 1000)
{
continue;
}
chunkTileDate[x, y] = m_Manager.tileDate[(chunkPos.x * 64) + x, (chunkPos.y * 64) + y];
if (chunkTileDate[x, y] == null)
{
m_Vertices.Add(new Vector3(x - 0.5001f, y - 0.5001f, 0));
m_Vertices.Add(new Vector3(x - 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y - 0.5001f, 0));
m_UV.Add(new Vector2(0.5f, 0.5f));
m_UV.Add(new Vector2(0.5f, 1f));
m_UV.Add(new Vector2(1f, 1f));
m_UV.Add(new Vector2(1f, 0.5f));
}
else if (chunkTileDate[x, y].type==1)
{
m_Vertices.Add(new Vector3(x - 0.5001f, y - 0.5001f, 0));
m_Vertices.Add(new Vector3(x - 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y - 0.5001f, 0));
m_UV.Add(new Vector2(0f, 0.5f));
m_UV.Add(new Vector2(0f, 1f));
m_UV.Add(new Vector2(0.5f, 1f));
m_UV.Add(new Vector2(0.5f, 0.5f));
}
else if(chunkTileDate[x, y].type == 0)
{
m_Vertices.Add(new Vector3(x - 0.5001f, y - 0.5001f, 0));
m_Vertices.Add(new Vector3(x - 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y - 0.5001f, 0));
m_UV.Add(new Vector2(0.5f, 0.5f));
m_UV.Add(new Vector2(0.5f, 1f));
m_UV.Add(new Vector2(1f, 1f));
m_UV.Add(new Vector2(1f, 0.5f));
}
else if (chunkTileDate[x, y].type == 2)
{
m_Vertices.Add(new Vector3(x - 0.5001f, y - 0.5001f, 0));
m_Vertices.Add(new Vector3(x - 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y + 0.5001f, 0));
m_Vertices.Add(new Vector3(x + 0.5001f, y - 0.5001f, 0));
m_UV.Add(new Vector2(0f, 0f));
m_UV.Add(new Vector2(0f, 0.5f));
m_UV.Add(new Vector2(0.5f, 0.5f));
m_UV.Add(new Vector2(0.5f, 0f));
}
trianglesList.Add(vertCount);
trianglesList.Add(vertCount + 1);
trianglesList.Add(vertCount + 3);
trianglesList.Add(vertCount + 1);
trianglesList.Add(vertCount + 2);
trianglesList.Add(vertCount + 3);
vertCount += 4;
}
UpdateMesh();
}
}
/// <summary>
/// 从Gamemanager获取地形数据并显示
/// </summary>
void UpdateMesh()
{
m_Mesh = m_MeshFilter.mesh;
m_Mesh.Clear();
m_Mesh.vertices = m_Vertices.ToArray();
m_Mesh.subMeshCount = GetComponent<Renderer>().materials.Length;
m_Mesh.SetTriangles(trianglesList.ToArray(), 0);
m_Mesh.uv = m_UV.ToArray();
m_Mesh.RecalculateNormals();
}
}