生成一个平面
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 局部坐标转世界坐标
}
}
生成一个正方体
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);//转换世界坐标
}
}
}