效果如图:
我们首先需要设置所需要连接的点,以及渲染的面。
void Start()
{
Mesh mesh = new Mesh();
this.GetComponent<MeshFilter>().mesh = mesh;
List<Vector3> vector3s = new List<Vector3>();//顶点坐标
vector3s.Add(new Vector3(0, 0, 0));
vector3s.Add(new Vector3(0, 1, 0));
vector3s.Add(new Vector3(1, 1, 0));
vector3s.Add(new Vector3(1, 0, 0));
vector3s.Add(new Vector3(1, 0, 1));
vector3s.Add(new Vector3(1, 1, 1));
vector3s.Add(new Vector3(0, 1, 1));
vector3s.Add(new Vector3(0, 0, 1));
mesh.vertices = vector3s.ToArray();//渲染顺序
mesh.triangles = new int[] {
0, 1, 2,
0, 2, 3,
3, 2, 5,
3, 5, 4,
4, 5, 6,
4, 6, 7,
7, 6, 1,
7, 1, 0,
0, 4, 7,
0, 3, 4,
1, 6, 5,
1, 5, 2
};
}
现在绘制出的正方体没有法线的缘故会导致有些不完整,无法受到光亮影响以及形状等其他因素;
我们在代码下方加上一行:mesh.RecalculateNormals();,它会去自动给我们添加法线并重新计算法线。
如上所致,我们渲染出来的正方体是个没有材质的正方体,所以我们去给他赋一个贴图,通过Uv坐标进行渲染。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshSan : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
List<Vector2> vector2s = new List<Vector2>();//贴图坐标
vector2s.Add(new Vector2(0, 0));
vector2s.Add(new Vector2(1, 0));
vector2s.Add(new Vector2(1, 1));
vector2s.Add(new Vector2(0, 1));
vector2s.Add(new Vector2(0, 0));
vector2s.Add(new Vector2(1, 0));
vector2s.Add(new Vector2(1, 1));
vector2s.Add(new Vector2(0, 1));
mesh.uv = vector2s.ToArray();
}
// Update is called once per frame
void Update()
{
}
}
这样我们带有材质的正方体就绘制完成了。
整体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MeshSan : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
this.GetComponent<MeshFilter>().mesh = mesh;
List<Vector3> vector3s = new List<Vector3>();//顶点坐标
vector3s.Add(new Vector3(0, 0, 0));
vector3s.Add(new Vector3(0, 1, 0));
vector3s.Add(new Vector3(1, 1, 0));
vector3s.Add(new Vector3(1, 0, 0));
vector3s.Add(new Vector3(1, 0, 1));
vector3s.Add(new Vector3(1, 1, 1));
vector3s.Add(new Vector3(0, 1, 1));
vector3s.Add(new Vector3(0, 0, 1));
mesh.vertices = vector3s.ToArray();//渲染顺序
mesh.triangles = new int[] {
0, 1, 2,
0, 2, 3,
3, 2, 5,
3, 5, 4,
4, 5, 6,
4, 6, 7,
7, 6, 1,
7, 1, 0,
0, 4, 7,
0, 3, 4,
1, 6, 5,
1, 5, 2
};
mesh.RecalculateNormals();//重新计算法线
List<Vector2> vector2s = new List<Vector2>();//贴图坐标
vector2s.Add(new Vector2(0, 0));
vector2s.Add(new Vector2(1, 0));
vector2s.Add(new Vector2(1, 1));
vector2s.Add(new Vector2(0, 1));
vector2s.Add(new Vector2(0, 0));
vector2s.Add(new Vector2(1, 0));
vector2s.Add(new Vector2(1, 1));
vector2s.Add(new Vector2(0, 1));
mesh.uv = vector2s.ToArray();
}
// Update is called once per frame
void Update()
{
}
}