using System.Collections; using UnityEngine; [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))] public class Grid : MonoBehaviour { public int xSize, ySize; private Vector3[] vertices; private Mesh mesh; private void Awake() { StartCoroutine(Generate()); } IEnumerator Generate() { WaitForSeconds wait = new WaitForSeconds(0.05f); GetComponent<MeshFilter>().mesh = mesh = new Mesh(); mesh.name = "Procedural Grid"; //xSize ySize是网格的数量,顶点的个数要多一维度 vertices = new Vector3[(xSize + 1) * (ySize + 1)]; Vector2[] uv = new Vector2[vertices.Length]; Vector4[] tangents = new Vector4[vertices.Length]; Vector4 tangent = new Vector4(1f, 0, 0, -1f); for (int i = 0, y = 0; y <= ySize; y++) { for (int x = 0; x <= xSize; x++, i++) { //顶点位置 vertices[i] = new Vector3(x, y); //对应顶点的uv坐标 uv[i] = new Vector2((float)x / xSize, (float)y / ySize); //平面来说默认的切线做标牌 tangents[i] = tangent; } } mesh.vertices = vertices; mesh.uv = uv; //设置网格三角形,以每一个格子为单位,6个组成一个格子(两个三角形) int[] triangles = new int[xSize * ySize * 6]; for (int ti = 0, vi = 0, y = 0; y < ySize; y++, vi++) { for (int x = 0; x < xSize; x++, ti += 6, vi++) { //顺时针方向 triangles[ti] = vi; triangles[ti + 3] = triangles[ti + 2] = vi + 1; triangles[ti + 4] = triangles[ti + 1] = vi + xSize + 1; triangles[ti + 5] = vi + xSize + 2; mesh.triangles = triangles; mesh.RecalculateNormals();//每次都要重新计算法线 yield return wait; } } } private void OnDrawGizmos() { if (vertices == null) return; Gizmos.matrix = this.transform.localToWorldMatrix; Gizmos.color = Color.black; for (int i = 0; i < vertices.Length; i++) { Gizmos.DrawSphere(vertices[i], 0.1f); } } }
一、生成xSize * ySize个网格子,需要比它们多一维度的顶点。
二、每一个格子,两个三角形,所以需要6个位置来描述这个格子,序号要顺时针不然或被认为是背面从而被剪裁。