一.Mesh基础
Mesh 类是对象网格几何体的基本脚本接口(手册:使用 Mesh 类 - Unity 手册),unity中的物体都是通过网格过滤器(Mesh Filter)和网格渲染器(Mesh Renderer)组合绘制出来的
二.Mesh应用
我们可以看出,unity中的物体是由任意个小三角形组成的一个物体,如下图:
那么,我们来绘制一个三角形,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreatSan : MonoBehaviour
{
void Start()
{
Mesh mesh = new Mesh();
//给Mesh网格添加顶点
List<Vector3> vers = new List<Vector3>();
vers.Add(Vector3.zero);
vers.Add(Vector3.up);
vers.Add(Vector3.right);
mesh.vertices = vers.ToArray();
//给Mesh网格添加绘制顺序
List<int> tris = new List<int>();
tris.Add(0);
tris.Add(1);
tris.Add(2);
mesh.triangles = tris.ToArray();
GetComponent<MeshFilter>().mesh = mesh;
}
}
运行效果如下:
那么,我们可以根据绘制任意个三角形来组成不同的物体, 我们拿正方体距举例,一个正方体有六个面,每个面都是由两个三角形组成的,那么,绘制一个面需要四个顶点,所以,一个正方体就有24个顶点、12个三角形组成(有些顶点可以共用,所以,实际是8个顶点),如下图:
下面是绘制一个正方体的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateMesh : MonoBehaviour
{
void Start()
{
//创建一个Mesh类
Mesh mesh=new Mesh();
//存放正方体的各个顶点坐标
List<Vector3> vers = new List<Vector3>();
vers.Add(new Vector3(0, 0, 0));
vers.Add(new Vector3(0, 0, 5));
vers.Add(new Vector3(5, 0, 5));
vers.Add(new Vector3(5, 0, 0));
vers.Add(new Vector3(0, 5, 0));
vers.Add(new Vector3(0, 5, 5));
vers.Add(new Vector3(5, 5, 5));
vers.Add(new Vector3(5, 5, 0));
GetComponent<MeshFilter>().mesh = mesh;
//赋值
mesh.vertices = vers.ToArray();
//存放读取的顶点坐标的顺序
mesh.triangles = new int[]
{
0, 1, 2,
0, 2, 3,
5, 4, 7,
5, 7, 6,
4, 0, 3,
4, 3, 7,
6, 2, 1,
6, 1, 5,
5, 1, 0,
5, 0, 4,
7, 3, 2,
7, 2, 6
};
GetComponent<MeshCollider>().sharedMesh = mesh;
}
}
以上代码运行效果如下:
这个正方体看起来有些怪,所以,我们再加一句代码:
运行效果:
这次比之前好看了一些,但是还是有瑕疵,就这样吧
三.Mesh应用拓展
我们再举个例子,用Mesh绘制一个球出来,在unity中,一个球体也是由多个三角形绘制而成的,
所以,我们的基本图形还是三角形,话不多说,直接上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateMeshSphere : MonoBehaviour
{
//一个球的份数,份数越大,这个圆越圆
public int n = 20;
//球的半径
public float r = 5;
void Start()
{
Mesh mesh = new Mesh();
//球的一份的弧度
float ang = 2 * Mathf.PI / n;
//存放球的各个顶点坐标
List<Vector3> vers = new List<Vector3>();
//存放读取的顶点坐标的顺序
List<int> tris = new List<int>();
for (int i = 0; i < n/2+1; i++)
{
float xr = Mathf.Sin(i * ang) * r;
float y = Mathf.Cos(i * ang) * r;
for (int j = 0; j < n; j++)
{
float x = Mathf.Sin(j * ang) * xr;
float z = Mathf.Cos(j * ang) * xr;
vers.Add(new Vector3(x, y, z));
if (j==n-1)
{
float x0 = Mathf.Sin(0) * xr;
float z0 = Mathf.Cos(0) * xr;
vers.Add(new Vector3(x0, y, z0));
}
if (i<n/2&&j<n)
{
tris.Add(i * (n + 1) + j);
tris.Add(i * (n + 1) + j + 1);
tris.Add((i + 1) * (n + 1) + j);
tris.Add((i + 1) * (n + 1) + j);
tris.Add(i * (n + 1) + j + 1);
tris.Add((i + 1) * (n + 1) + j + 1);
}
}
}
//赋值
mesh.vertices = vers.ToArray();
mesh.triangles = tris.ToArray();
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
}
运行效果: