矩形
1、在unity中创建一个空对象,分别添加网格碰撞器(Mesh Collider)、网格过滤器(Mesh Filter)、网格渲染器(Mesh Renderer)组件。
2、创建名为CreatMesh的C#脚本,脚本内容如下:
void Start()
{
Mesh mesh = new Mesh();
//给mesh网格添加顶点
List<Vector3> vertices = new List<Vector3>();
vertices.Add(new Vector3(0, 0, 0));
vertices.Add(new Vector3(0, 0, 1));
vertices.Add(new Vector3(1, 0, 1));
vertices.Add(new Vector3(1, 0, 0));
mesh.vertices = vertices.ToArray();
//给mesh网格添加绘制顺序
mesh.triangles = new int[] {
0,1,2,
2,3,0,
};
GetComponent<MeshFilter>().mesh = mesh;
}
3、将CreatMesh脚本挂载到空对象即可。
圆形
1、创建空对象同矩形步骤。
2、新建脚本,脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CreatMesh3 : MonoBehaviour
{
//分份
public int n = 20;
//半径
public float r = 5;
// Start is called before the first frame update
void Start()
{
VertexHelper vh = new VertexHelper();
Mesh mesh = new Mesh();
//把圆心存好
vh.AddVert(Vector3.zero, Color.white, new Vector2(0.5f, 0.5f));
//每份的弧度
float ang = 2 * Mathf.PI / n;
for (int i = 0; i < n; i++)
{
//对边
float x = Mathf.Sin(i * ang) * r;
//邻边
float y = Mathf.Cos(i * ang) * r;
//计算uv坐标
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
//添加顶点
vh.AddVert(new Vector3(x, 0, y), Color.white, new Vector2(uvx, uvy));
//添加绘制顺序
if(i==n-1)
{
vh.AddTriangle(0, i + 1, 1);
}
else
{
vh.AddTriangle(0, i + 1, i + 2);
}
}
vh.FillMesh(mesh);
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
3、将CreatMesh脚本挂载到空对象即可。
立方体
利用C#网格绘制一个简单的Cube,在unity中Cube是6个面组成,每个面又由两个三角形组成,进而得到利用三角形可以实现完整的立方体。
1、创建空对象同矩形步骤。
2、新建脚本,脚本如下:
(注:注意绘制顶点顺序,相机可视面顶点为顺时针,相机不可视面为逆时针绘制)
3、将CreatMesh脚本挂载到空对象即可。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cube : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
//给mesh网格添加顶点
List<Vector3> vertices = new List<Vector3>();
vertices.Add(new Vector3(0, 1, 0));
vertices.Add(new Vector3(0, 1, 1));
vertices.Add(new Vector3(1, 1, 1));
vertices.Add(new Vector3(1, 1, 0));
vertices.Add(new Vector3(0, 0, 0));
vertices.Add(new Vector3(0, 0, 1));
vertices.Add(new Vector3(1, 0, 1));
vertices.Add(new Vector3(1, 0, 0));
mesh.vertices = vertices.ToArray();
//给mesh网格添加绘制顺序
mesh.triangles = new int[] {
4,0,3,
3,7,4,
7,3,2,
7,2,6,
6,2,1,
6,1,5,
5,1,0,
5,0,4,
0,1,2,
0,2,3,
5,4,7,
7,6,5,
};
GetComponent<MeshFilter>().mesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
圆环
圆环和画圆形没有太大区别,就是画一大一小两个圆,两个圆之前的部分就是圆环,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestRing : MonoBehaviour
{
float ang;
float r1 = 5;
float r2 = 2;
public int num = 20;
// Start is called before the first frame update
void Start()
{
ang = 2 * Mathf.PI / num;
VertexHelper vh = new VertexHelper();
for (int i = 0; i < num; i++)
{
float uvx = (float)i / (num - 1);
float x = Mathf.Sin(i * ang) * r1;
float y = Mathf.Cos(i * ang) * r1;
vh.AddVert(new Vector3(x, y, 0), Color.white, new Vector2(uvx, 1));
float x0 = Mathf.Sin(i * ang) * r2;
float y0 = Mathf.Cos(i * ang) * r2;
vh.AddVert(new Vector3(x0, y0, 0), Color.white, new Vector2(uvx, 0));
if (i < num - 1)
{
vh.AddTriangle(i * 2, (i + 1) * 2, i * 2 + 1);
vh.AddTriangle(i * 2 + 1, (i + 1) * 2, (i + 1) * 2 + 1);
}
if (i == num - 1)
{
vh.AddTriangle(i * 2, 0, i * 2 + 1);
vh.AddTriangle(i * 2 + 1, 0, 1);
}
}
Mesh mesh = new Mesh();
vh.FillMesh(mesh);
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
球
球体展开是一张矩形,那么把一张矩形包起来就是球,unity中自带的Sphere是把一个Cube的四个角做了圆滑,捏出了一个球的形状
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Sphere : MonoBehaviour
{
public int num = 8;
public float r = 5;
// Start is called before the first frame update
void Start()
{
VertexHelper vh = new VertexHelper();
float ang = 2 * Mathf.PI / num;
for (int i = 0; i < num / 2 + 1; i++)
{
float y = Mathf.Cos(ang * i) * r;
float xr = Mathf.Sin(ang * i) * r;
float uvy = (float)i / (num / 2);
for (int j = 0; j < num; j++)
{
float x = Mathf.Sin(j * ang) * xr;
float z = Mathf.Cos(j * ang) * xr;
float uvx = (float)j / num;
vh.AddVert(new Vector3(x, y, z), Color.white, new Vector2(uvx, uvy));
if (j == num - 1)
{
float x0 = Mathf.Sin(0) * xr;
float z0 = Mathf.Cos(0) * xr;
vh.AddVert(new Vector3(x0, y, z0), Color.white, new Vector2(1, uvy));
}
if (i < num / 2)
{
vh.AddTriangle(i * (num + 1) + j, (i + 1) * (num + 1) + j, i * (num + 1) + j + 1);
vh.AddTriangle(i * (num + 1) + j + 1, (i + 1) * (num + 1) + j, (i + 1) * (num + 1) + j + 1);
}
}
}
Mesh mesh = new Mesh();
vh.FillMesh(mesh);
GetComponent<MeshFilter>().mesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}