GameObject[] CreateSubMeshes(MapData data, int patchSize, float size, float yOffset, out MeshCollider[] clds) { int xCount, zCount; if (data.xCount < patchSize) { this.patchSize = data.xCount; xCount = 1; zCount = 1; } else { this.patchSize = patchSize; xCount = data.xCount / patchSize; zCount = data.zCount / patchSize; } int count = xCount * zCount; GameObject[] result = new GameObject[count]; clds = new MeshCollider[count]; int i = 0; Vector3 meshOffset = GetOffset() + new Vector3(0, yOffset, 0); for (int z = 0; z < zCount; z++) { for (int x = 0; x < xCount; x++) { Mesh subMesh = CreateSubMesh(data, x * patchSize, z * patchSize, patchSize, patchSize, size, meshOffset); GameObject obj = new GameObject(); obj.name = string.Format("subMesh_{0}_{1}", x, z); MeshFilter meshFilter = obj.AddComponent<MeshFilter>(); meshFilter.mesh = subMesh; meshFilter.sharedMesh.UploadMeshData(false); MeshRenderer rd = obj.AddComponent<MeshRenderer>(); rd.material = lineMaterial; GameObject cldObj = new GameObject(obj.name + "_cld"); cldObj.transform.parent = obj.transform; MeshCollider cld = cldObj.AddComponent<MeshCollider>(); Mesh mesh = GridmeshCreator.CreateGridMesh(patchSize, patchSize, new Vector3(x * patchSize, 0, z * patchSize) + GetOffset(), patchSize, patchSize); GridmeshCreator.SetHeight(mesh, data.GetEdgeHeights(x * patchSize, z * patchSize, patchSize, patchSize)); cld.sharedMesh = mesh; cld.sharedMesh.UploadMeshData(false); clds[i] = cld; result[i] = obj; i++; } } return result; }