How to Unity ECS 1.0 generated mesh


In Unity's Entity Component System (ECS), you can generate a mesh using a few different approaches. Here are two options:

  1. Using a MeshFilter and MeshRenderer component:
  • Add a MeshFilter component to your entity. This component will hold the mesh data.
  • Add a MeshRenderer component to your entity. This component will render the mesh data.
  • Use the MeshFilter.mesh property to assign a Mesh object to the entity.
  • Use the Mesh object to set the vertices, triangles, and other properties of the mesh.

Here is an example of how to create a simple cube mesh using this approach:

Entity entity = entityManager.CreateEntity();

// Add a MeshFilter component to the entity
MeshFilter meshFilter = entityManager.AddComponent<MeshFilter>(entity);

// Create a new Mesh object and assign it to the MeshFilter
Mesh mesh = new Mesh();
meshFilter.mesh = mesh;

// Set the vertices and triangles of the mesh
Vector3[] vertices = {
    new Vector3(-1, -1, 0),
    new Vector3(-1, 1, 0),
    new Vector3(1, 1, 0),
    new Vector3(1, -1, 0)
};
int[] triangles = { 0, 1, 2, 0, 2, 3 };
mesh.vertices = vertices;
mesh.triangles = triangles;

// Add a MeshRenderer component to the entity
entityManager.AddComponent<MeshRenderer>(entity);


  1. Using a custom IComponentData and IJob:
  • Create a custom component that holds the data needed to generate the mesh, such as the vertices and triangles.
  • Create a custom job that generates the mesh using the data from the component and assigns it to a MeshFilter component on the entity.
  • Use the IJobForEach interface to schedule the job for execution.
Here is an example of how to create a simple cube mesh using this approach: 

// Define a custom component to hold the mesh data
public struct CubeMeshData : IComponentData
{
    public Vector3[] vertices;
    public int[] triangles;
}

// Define a custom job to generate the mesh
public struct GenerateCubeMeshJob : IJobForEach<CubeMeshData, MeshFilter>
{
    public void Execute(ref CubeMeshData meshData, ref MeshFilter meshFilter)
    {
        // Create a new Mesh object and assign it to the MeshFilter
        Mesh mesh = new Mesh();
        meshFilter.mesh = mesh;

        // Set the vertices and triangles of the mesh using the data from the component
        mesh.vertices = meshData.vertices;
        mesh.triangles = meshData.triangles;
    }
}

// Schedule the job for execution
Entity entity = entityManager.CreateEntity();
entityManager.AddComponentData(entity, new CubeMeshData
{
    vertices = new Vector3[] {
        new Vector3(-1, -1, 0),
        new Vector3(-1, 1, 0),
        new Vector3(1, 1, 0),
        new Vector3(1, -1, 0)
    },
    triangles = new int[] { 0, 1, 2, 0,