public int n = 20;//角的个数
public float r = 0.5f;//半径
void Start()
{
Mesh mesh = new Mesh();
VertexHelper vh = new VertexHelper();
float ang = 2 * Mathf.PI / n; //弧度
//面1
vh.AddVert(new Vector3(0, 1, 0), Color.white, new Vector2(0.5f, 0.5f));
for (int i = 0; i < n; i++)
{
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
//做点
vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, uvy));
if (i == 0)
{
//收尾
vh.AddTriangle(0, n, 1);
}
else
{
vh.AddTriangle(0, i, i + 1);
}
}
//面2
int next = 1 + n;
vh.AddVert(new Vector3(0, -1, 0), Color.white, new Vector2(0.5f, 0.5f));
for (int i = 0; i < n; i++)
{
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
float uvx = (x + r) / (2 * r);
float uvy = (y + r) / (2 * r);
vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, uvy));
if (i == 0)
{
vh.AddTriangle(0 + next, 1 + next, n + next);
}
else
{
vh.AddTriangle(0 + next, i + 1 + next, i + next);
}
}
//面3
next = (1 + n) * 2;
float nn = (float) n / 2;
int num = 0;
for (int i = 0; i <= n; i++)
{
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
float uvx = 0;
//计算UV的X值比例
if (i < nn)
{
//面3.1
uvx = (float) num / nn;
num++;
}
else if (i >= nn)
{
//面3.2
uvx = (float) num / nn;
num--;
}
if (i == n)
{
x = Mathf.Sin(ang * 0) * r;
y = Mathf.Cos(ang * 0) * r;
}
vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, 0));
vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, 1));
}
for (int i = 0; i < n; i++)
{
vh.AddTriangle(i * 2 + next, (i + 1) * 2 + 1 + next, i * 2 + 1 + next);
vh.AddTriangle(i * 2 + next, (i + 1) * 2 + next, (i + 1) * 2 + 1 + next);
}
vh.FillMesh(mesh);
mesh.RecalculateNormals();
GetComponent<MeshFilter>().mesh = mesh;
}