using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class TiledMeshGenerator : MonoBehaviour { public Mesh originalMesh; // 原始 Mesh public int tileX = 2; // X 轴上的平铺次数 public int tileY = 2; // Y 轴上的平铺次数 void Start() { if (originalMesh == null) { Debug.LogError("请分配一个原始 Mesh!"); return; } Mesh tiledMesh = CreateTiledMesh(); GetComponent().mesh = tiledMesh; } Mesh CreateTiledMesh() { Mesh mesh = new Mesh(); Vector3[] originalVertices = originalMesh.vertices; int[] originalTriangles = originalMesh.triangles; Vector2[] originalUVs = originalMesh.uv; int numOriginalVertices = originalVertices.Length; int numOriginalTriangles = originalTriangles.Length; int numNewVertices = numOriginalVertices * tileX * tileY; int numNewTriangles = numOriginalTriangles * tileX * tileY; Vector3[] newVertices = new Vector3[numNewVertices]; int[] newTriangles = new int[numNewTriangles]; Vector2[] newUVs = new Vector2[numNewVertices]; int vertexIndex = 0; int triangleIndex = 0; for (int y = 0; y < tileY; y++) { for (int x = 0; x < tileX; x++) { // 复制顶点 for (int i = 0; i < numOriginalVertices; i++) { newVertices[vertexIndex] = originalVertices[i] + new Vector3(x, y, 0); newUVs[vertexIndex] = originalUVs[i]; vertexIndex++; } // 复制三角形 for (int i = 0; i < numOriginalTriangles; i += 3) { newTriangles[triangleIndex] = originalTriangles[i] + (x + y * tileX) * numOriginalVertices; newTriangles[triangleIndex + 1] = originalTriangles[i + 1] + (x + y * tileX) * numOriginalVertices; newTriangles[triangleIndex + 2] = originalTriangles[i + 2] + (x + y * tileX) * numOriginalVertices; triangleIndex += 3; } } } mesh.vertices = newVertices; mesh.triangles = newTriangles; mesh.uv = newUVs; mesh.RecalculateNormals(); return mesh; } }