使用程序创建Grid网格
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个网格子,需要比它们多一维度的顶点。

02-grid-indices.png


二、每一个格子,两个三角形,所以需要6个位置来描述这个格子,序号要顺时针不然或被认为是背面从而被剪裁。

03-quad.png


首页 我的博客
粤ICP备17103704号