- Home /
Procedurally Generating a Non-Contiguous Mesh
I'm generating a mesh as a "grid" of individual cells. Each of these cells can move independently. I'm able to generate the mesh and update the vertices to move the individual cells, but it leaves a stretched-out texture between adjacent cells when they're not next to each other.
Is there a way to procedurally generate a mesh and move pieces independently? (while keeping the performance benefits of generating a mesh over using a separate MeshRenderer for each cell)
It's also completely possible I've done something terribly wrong in my code. I've tried generating the entire grid as a single mesh, and the current version creates a mesh for each cell and combines them using CombineMeshes. Both have had about the same results. This is the code I'm using to generate the mesh for an individual cell:
var meshVertices = new List<Vector3>();
var meshNormals = new List<Vector3>();
var meshUVs = new List<Vector2>();
var meshTris = new List<int>();
//Cell vertices
meshVertices.Add(new Vector3(xMin, 0, zMin));
meshVertices.Add(new Vector3(xMax, 0, zMin));
meshVertices.Add(new Vector3(xMin, 0, zMax));
meshVertices.Add(new Vector3(xMax, 0, zMax));
//Normals for each vertex
meshNormals.Add(Vector3.up);
meshNormals.Add(Vector3.up);
meshNormals.Add(Vector3.up);
meshNormals.Add(Vector3.up);
//UVs for each vertex
meshUVs.Add(new Vector2(0, 0));
meshUVs.Add(new Vector2(1, 0));
meshUVs.Add(new Vector2(0, 1));
meshUVs.Add(new Vector2(1, 1));
//Vertex indices for the triangles
meshTris.Add(0);
meshTris.Add(2);
meshTris.Add(3);
meshTris.Add(0);
meshTris.Add(3);
meshTris.Add(1);
var mesh = new Mesh
{
vertices = meshVertices.ToArray(),
triangles = meshTris.ToArray(),
normals = meshNormals.ToArray(),
uv = meshUVs.ToArray(),
};
return new CombineInstance
{
mesh = mesh,
};
Once all the cells are created, I combine them like so:
var mesh = new Mesh();
mesh.CombineMeshes(cellCombineInstances.ToArray());
mesh.RecalculateBounds();
var meshObject = new GameObject("GridMesh");
meshObject.transform.parent = this.transform;
meshObject.transform.position = this.transform.position;
meshObject.transform.localScale = Vector3.one;
meshObject.transform.localRotation = Quaternion.identity;
meshObject.transform.localPosition = Vector3.zero;
var mat = new Material(this.CellMaterial);
meshObject.AddComponent<MeshRenderer>();
meshObject.renderer.material = mat;
var meshFilter = meshObject.AddComponent<MeshFilter>();
meshFilter.mesh = mesh;
When I move the vertices, I use:
for (var i = 0; i < 4; i++)
{
//startVertex is determined elsewhere, but it's the index of the first vertex for an individual cell
var vertex = vertices[startVertex + i];
//The x and z coordinates can also change, but for now I'm only concerned with the y-axis.
vertex.y = newPosition.y;
vertices[startVertex + i] = vertex;
}