网格编程02

生成一个平面

Gizmos

void OnDrawGizmos() 在程序一运行就执行,之后每帧都在执行并且画的图形只会在Scene窗口显示,Game窗口不会显示。
给一个空物体挂以下脚本即可生成一个X*Y的平面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;


[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class CS_02 : MonoBehaviour
{
    private Mesh mesh;
    private Vector3[] vertexs;//存储所有顶点
    private Vector2[] uv;
    private Vector3[] normals;
    public int X=3, Y=2;//面片个数(行*列)
    void Start()
    {
        mesh = new Mesh();

        MeshFilter filter = GetComponent<MeshFilter>();
        filter.mesh = mesh;
        mesh.name = "CS_02";
        //ToDo生成一个3*2的面片顶点4*3
        vertexs = new Vector3[(X + 1)*(Y + 1)];
        uv = new Vector2[vertexs.Length];
        normals = new Vector3[vertexs.Length];
        //GeneratePlane();
        StartCoroutine(GeneratePlane(mesh));
        Debug.Log("执行06");

        //mesh.triangles =
    }

    //private void GeneratePlane()
    //{
    //    for (int y = 0, i = 0; y < Y + 1; y++) 
    //    {
    //        for (int x = 0; x < X + 1; x++,i++) //X在内部,先生成行
    //        {
    //            vertexs[i] = new Vector3(x, y);//i范围0-11共12个数
    //        }
    //    }
    //}

    private IEnumerator GeneratePlane(Mesh mesh)
    {
        yield return GetVertices();
        mesh.vertices = vertexs;
        mesh.uv = uv;
        mesh.normals = normals;
        yield return  GetTriangles(mesh);
    }

    private IEnumerator GetVertices()
    {
        Debug.Log("执行01");
        for (int y = 0, i = 0; y < Y + 1; y++)
        {
            for (int x = 0; x < X + 1; x++, i++) //X在内部,先生成行
            {
                vertexs[i] = new Vector3(x, y);//i范围0-11共12个数
                uv[i] = new Vector2((float )x / X, (float)y / Y);//uv计算没有float会造成精度丢失
                normals[i] = GetNormal(y);
                yield return new WaitForSeconds(0.2f);
            }
        }
    }

    private Vector3 GetNormal(int y)//normal验证
    {
        if (y % 2 == 0) 
        {
            return Vector3.up;
        }
        else
        {
            return Vector3.down;
        }
    }

    private IEnumerator GetTriangles(Mesh mesh)
    {
        Debug.Log("执行07");
        int[] triangles = new int[X * Y * 6];//数组大小

        for (int startIndex = 0, y = 0, triangleIndex = 0; startIndex < vertexs.Length && y < Y && triangleIndex < triangles.Length; startIndex++) 
        {
            for (int x = 0; x < X; x++, startIndex++, triangleIndex += 6) 
            {
                //当前四边形的第一个三角形
                triangles[triangleIndex] = startIndex;
                triangles[triangleIndex + 1] = startIndex + X + 1;
                triangles[triangleIndex + 2] = startIndex + 1;
                mesh.triangles = triangles;//三角形为单位创建
                yield return new WaitForSeconds(0.2f);
                //当前四边形的第一个三角形
                triangles[triangleIndex + 3] = startIndex + X + 1;
                triangles[triangleIndex + 4] = startIndex + X + 2;
                triangles[triangleIndex + 5] = startIndex + 1;
                mesh.triangles = triangles;
                yield return new WaitForSeconds(0.2f);
            }
        }
    }

    private void OnDrawGizmos()//预览在game窗口中不存在
    {
        if (vertexs==null)
        {
            return;
        }
        for (int i = 0; i < vertexs.Length; i++) 
        {
            Gizmos.DrawSphere(vertexs[i], 0.1f);
        }
        //transform .TransformPoint  局部坐标转世界坐标
    }
}

zmj刘子渊

生成一个正方体

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class CS_03 : MonoBehaviour
{
    private Mesh mesh;
    private Vector3[] vertexs;
    private int[] triangle;
    void Start()
    {
        mesh = new Mesh();

        MeshFilter filter = GetComponent<MeshFilter>();
        filter.mesh = mesh;
        mesh.name = "CS_03";
        GenerateVextex();
        GenerateTriangle();
        mesh.vertices = vertexs;//赋值顶点下标
        mesh.triangles = triangle;//下标给三角形
    }

    private void GenerateVextex()//创建顶点
    {
        vertexs = new Vector3[8];
        vertexs[0] = new Vector3(-0.5f, -0.5f, -0.5f);//低面
        vertexs[1] = new Vector3(0.5f, -0.5f, -0.5f);
        vertexs[2] = new Vector3(-0.5f, -0.5f, 0.5f);
        vertexs[3] = new Vector3(0.5f, -0.5f, 0.5f);

        vertexs[4] = new Vector3(-0.5f, 0.5f, -0.5f);//上面
        vertexs[5] = new Vector3(0.5f, 0.5f, -0.5f);
        vertexs[6] = new Vector3(-0.5f, 0.5f, 0.5f);
        vertexs[7] = new Vector3(0.5f, 0.5f, 0.5f);
    }

    private void GenerateTriangle()//创建三角形
    {
        triangle = new int[36];
        //底面
        triangle[0] = 0;
        triangle[1] = 1;
        triangle[2] = 2;

        triangle[3] = 1;
        triangle[4] = 3;
        triangle[5] = 2;
        //前面
        triangle[6] = 0;
        triangle[7] = 4;
        triangle[8] = 5;

        triangle[9] = 5;
        triangle[10] = 1;
        triangle[11] = 0;
        //后面
        triangle[12] = 3;
        triangle[13] = 7;
        triangle[14] = 6;

        triangle[15] = 6;
        triangle[16] = 2;
        triangle[17] = 3;
        //左面
        triangle[18] = 6;
        triangle[19] = 4;
        triangle[20] = 0;

        triangle[21] = 6;
        triangle[22] = 0;
        triangle[23] = 2;
        //右面
        triangle[24] = 1;
        triangle[25] = 5;
        triangle[26] = 7;

        triangle[27] = 7;
        triangle[28] = 3;
        triangle[29] = 1;
        //上面
        triangle[30] = 6;
        triangle[31] = 7;
        triangle[32] = 4;

        triangle[33] = 7;
        triangle[34] = 5;
        triangle[35] = 4;
    }
    private void OnDrawGizmos()
    {
        if (vertexs == null)
        {
            return;
        }
        for (int i = 0; i < vertexs.Length; i++)
        {
            // Gizmos.DrawSphere(vertexs[i], 0.1f);//当前物体下的局部坐标
            Gizmos.DrawSphere(transform.TransformPoint(vertexs[i]), 0.1f);//转换世界坐标
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值