参考:https://springdong.blog.csdn.net/article/details/77369734这位大佬的文章
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GridDraw : MonoBehaviour
{
void Start()
{
Generate();
}
public int sizeX;
public int sizeY;
private Mesh mesh;
private Vector3[] vertices;
private void Generate()
{
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "MyMesh";
vertices = new Vector3[(sizeX + 1) * (sizeY + 1)];
//每个顶点都有对应的Uv坐标
Vector2[] uv = new Vector2[vertices.Length];
//切线向量(切线空间下),
//切线空间坐标轴是什么?
//切线空间下 z轴为其法线向量,x轴为顶点切线,最后y轴由x和z的叉乘得到,为什么要设置tangent的w分向量?
//叉乘Cross会得到两个垂直于x和y的向量,而w向量用于判断是这个向量其中一个
Vector4[] tangent = new Vector4[vertices.Length];
for (int i = 0, y = 0; y <= sizeY; y++)
{
for (int x = 0; x <= sizeX; x++, i++)
{
vertices[i] = new Vector3(x, y);
uv[i] = new Vector2((float)x / sizeX, (float)y / sizeY);
tangent[i] = new Vector4(1, 0, 0, -1);
}
}
int[] triangles = new int[sizeX * sizeY * 6];
for (int index = 0, count = 0, y = 0; y < sizeY; y++, count++)
{
//一行
for (int x = 0; x < sizeX; x++, index += 6, count++)
{
//将index换为0,count换为0 得到的是一个正方形网格
//然后绘制一行,最后绘制全部网格
//triangle_1
triangles[index] = count;
triangles[index + 1] = sizeX + 1 + count;
triangles[index + 2] = count + 1;
//triangle_2
triangles[index + 3] = count + 1;
triangles[index + 4] = sizeX + 1 + count;
triangles[index + 5] = sizeX + 2 + count;
}
}
//必须先设置顶点
//顶点下面三个均依赖于顶点
mesh.vertices = vertices;
mesh.tangents = tangent;
mesh.uv = uv;
mesh.triangles = triangles;
mesh.RecalculateNormals();
}
private void OnDrawGizmos()
{
if (vertices == null) return;
Gizmos.color = Color.black;
for (int i = 0; i < vertices.Length; i++)
{
Gizmos.DrawSphere(vertices[i], 0.1f);
}
}
}