实现效果如图所示:(其实这就是一个gameobject展示出来的效果,如果想完成两万个小立方体的效果,可以拼接这个K02 )
unity中新建一个空物体,加上组件MeshRenderer和MeshFilter
新建一个材质球createMesh拖入meshrenderer中
代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class CreateMesh : MonoBehaviour {
public float Length = 1; //长方体的长
public float Width = 1; //长方体的宽
public float Heigth = 1; //长方体的高
private MeshFilter meshFilter;
List<Vector3> lstVertices = new List<Vector3>();
List<int> lstIndices = new List<int>();
List<Vector3> lstNormals = new List<Vector3>();
void Start()
{
meshFilter = GetComponent<MeshFilter>();
//旧版本,一个立方体
//meshFilter.mesh = OnCreateMesh(Length, Width, Heigth);
一个正方体不包含法线
//meshFilter.mesh = OnCreateMeshSmipleNONormal(Length, Width, Heigth);
//最完整的方法,10*10*10个立方体mesh新方法包含法线
OnCreateNewMeshNormal();
}
//最完整的方法,10*10*10个立方体mesh新方法包含法线
private void OnCreateNewMeshNormal()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
for (int k = 0; k < 10; k++)
{
OnCreateTriangles(Length, Width, Heigth, new Vector3(i * 2, j * 2, k * 2));
}
}
}
//负载属性与mesh
Mesh mesh = new Mesh();
mesh.vertices = lstVertices.ToArray();
mesh.triangles = lstIndices.ToArray();
mesh.normals = lstNormals.ToArray();
meshFilter.mesh = mesh;
}
void OnCreateTriangles(float length, float width, float heigth, Vector3 trans)
{
Vector3[] vertices = new Vector3[4 * 6]; //顶点数(每个面4个点,六个面)
Vector3[] normals = new Vector3[4 * 6]; //法线 (每个面4个点,六个面)
vertices[0] = new Vector3(0, 0, 0); //前面的左下角的点
normals[0] = new Vector3(0, 0, -1);
vertices[1] = new Vector3(0, heigth, 0); //前面的左上角的点
normals[1] = new Vector3(0, 0, -1); ;
vertices[2] = new Vector3(length, 0, 0); //前面的右下角的点
normals[2] = new Vector3(0, 0, -1); ;
vertices[3] = new Vector3(length, heigth, 0); //前面的右上角的点
normals[3] = new Vector3(0, 0, -1); ;
vertices[4] = new Vector3(length, 0, width); //后面的右下角的点
normals[4] = new Vector3(0, 0, 1);
vertices[5] = new Vector3(length, heigth, width); //后面的右上角的点
normals[5] = new Vector3(0, 0, 1);
vertices[6] = new Vector3(0, 0, width); //后面的左下角的点
normals[6] = new Vector3(0, 0, 1);
vertices[7] = new Vector3(0, heigth, width); //后面的左上角的点
normals[7] = new Vector3(0, 0, 1);
vertices[8] = vertices[6]; //左
normals[8] = new Vector3(-1, 0, 0);
vertices[9] = vertices[7];
normals[9] = new Vector3(-1, 0, 0);
vertices[10] = vertices[0];
normals[10] = new Vector3(-1, 0, 0);
vertices[11] = vertices[1];
normals[11] = new Vector3(-1, 0, 0);
vertices[12] = vertices[2]; //右
normals[12] = new Vector3(1, 0, 0);
vertices[13] = vertices[3];
normals[13] = new Vector3(1, 0, 0);
vertices[14] = vertices[4];
normals[14] = new Vector3(1, 0, 0);
vertices[15] = vertices[5];
normals[15] = new Vector3(1, 0, 0);
vertices[16] = vertices[1]; //上
normals[16] = new Vector3(0, 1, 0);
vertices[17] = vertices[7];
normals[17] = new Vector3(0, 1, 0);
vertices[18] = vertices[3];
normals[18] = new Vector3(0, 1, 0);
vertices[19] = vertices[5];
normals[19] = new Vector3(0, 1, 0);
vertices[20] = vertices[2]; //下
normals[20] = new Vector3(0, -1, 0);
vertices[21] = vertices[4];
normals[21] = new Vector3(0, -1, 0);
vertices[22] = vertices[0];
normals[22] = new Vector3(0, -1, 0);
vertices[23] = vertices[6];
normals[23] = new Vector3(0, -1, 0);
int nStartIndex = lstVertices.Count;
for(int i = 0; i < vertices.Length; i++)
{
lstVertices.Add(vertices[i] + trans);
}
lstNormals.AddRange(normals);
//triangles(索引三角形、必须):
int triangles_cout = 6 * 2 * 3; //索引三角形的索引点个数
int[] triangles = new int[triangles_cout]; //索引三角形数组
for (int i = 0, vi = 0; i < triangles_cout; i += 6, vi += 4)
{
triangles[i] = vi;
triangles[i + 1] = vi + 1;
triangles[i + 2] = vi + 2;
triangles[i + 3] = vi + 3;
triangles[i + 4] = vi + 2;
triangles[i + 5] = vi + 1;
}
//int[] triangles2 = new int[6 * 2 * 3] {1,0,2, 3,1,2,
// 3,2,4, 4,5,3,
// 6,7,4, 7,5,4,
// 7,6,1, 6,0,1,
// 7,1,3, 3,5,7,
// 0,6,2, 6,4,2}; //索引三角形数组
for (int i = 0; i < triangles.Length; i++)
{
lstIndices.Add(triangles[i] + nStartIndex);
}
}
//没有法线,一个立方体,没有重复的点
Mesh OnCreateMeshSmipleNONormal(float length, float width, float heigth)
{
//vertices(顶点、必须):
int vertices_count = 4 * 6; //顶点数(每个面4个点,六个面)
Vector3[] vertices = new Vector3[vertices_count];
vertices[0] = new Vector3(0, 0, 0); //前面的左下角的点
vertices[1] = new Vector3(0, heigth, 0); //前面的左上角的点
vertices[2] = new Vector3(length, 0, 0); //前面的右下角的点
vertices[3] = new Vector3(length, heigth, 0); //前面的右上角的点
vertices[4] = new Vector3(length, 0, width); //后面的右下角的点
vertices[5] = new Vector3(length, heigth, width); //后面的右上角的点
vertices[6] = new Vector3(0, 0, width); //后面的左下角的点
vertices[7] = new Vector3(0, heigth, width); //后面的左上角的点
int[] triangles2 = new int[6 * 2 * 3] {1,0,2, 3,1,2,
3,2,4, 4,5,3,
6,7,4, 7,5,4,
7,6,1, 6,0,1,
7,1,3, 3,5,7,
0,6,2, 6,4,2}; //索引三角形数组
//uv:
//.........
//负载属性与mesh
Mesh mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles2;
return mesh;
}
//最原始,重复点,无法线
Mesh OnCreateMesh(float length, float width, float heigth)
{
//vertices(顶点、必须):
int vertices_count = 4 * 6; //顶点数(每个面4个点,六个面)
Vector3[] vertices = new Vector3[vertices_count];
vertices[0] = new Vector3(0, 0, 0); //前面的左下角的点
vertices[1] = new Vector3(0, heigth, 0); //前面的左上角的点
vertices[2] = new Vector3(length, 0, 0); //前面的右下角的点
vertices[3] = new Vector3(length, heigth, 0); //前面的右上角的点
vertices[4] = new Vector3(length, 0, width); //后面的右下角的点
vertices[5] = new Vector3(length, heigth, width); //后面的右上角的点
vertices[6] = new Vector3(0, 0, width); //后面的左下角的点
vertices[7] = new Vector3(0, heigth, width); //后面的左上角的点
vertices[8] = vertices[6]; //左
vertices[9] = vertices[7];
vertices[10] = vertices[0];
vertices[11] = vertices[1];
vertices[12] = vertices[2]; //右
vertices[13] = vertices[3];
vertices[14] = vertices[4];
vertices[15] = vertices[5];
vertices[16] = vertices[1]; //上
vertices[17] = vertices[7];
vertices[18] = vertices[3];
vertices[19] = vertices[5];
vertices[20] = vertices[2]; //下
vertices[21] = vertices[4];
vertices[22] = vertices[0];
vertices[23] = vertices[6];
//triangles(索引三角形、必须):
int 分割三角形数 = 6 * 2;
int triangles_cout = 分割三角形数 * 3; //索引三角形的索引点个数
int[] triangles = new int[triangles_cout]; //索引三角形数组
for (int i = 0, vi = 0; i < triangles_cout; i += 6, vi += 4)
{
triangles[i] = vi;
triangles[i + 1] = vi + 1;
triangles[i + 2] = vi + 2;
triangles[i + 3] = vi + 3;
triangles[i + 4] = vi + 2;
triangles[i + 5] = vi + 1;
}
//uv:
//.........
//负载属性与mesh
Mesh mesh = new Mesh();
mesh.vertices = vertices;
mesh.triangles = triangles;
return mesh;
}
}