//你的圆是由若干个小三角型组成的
public int n = 1000;
public float r = 2;
// Start is called before the first frame update
void Start()
{
//画圆
Mesh mesh = new Mesh();
List<Vector3> v3 = new List<Vector3>();
List<int> triangles = new List<int>();
v3.Add(Vector3.zero);
//每一份的弧度
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;
v3.Add(new Vector3(x, 0, y));
triangles.Add(0);
triangles.Add(i + 1);
//vector2s.Add(new Vector2(x, y));
if (i == n - 1)
{
triangles.Add(1);
}
else
{
triangles.Add(i + 2);
}
}
mesh.vertices = v3.ToArray();
mesh.triangles = triangles.ToArray();
mesh.RecalculateNormals();
GetComponent<MeshFilter>().mesh = mesh;
}
这里的n是组成你圆形的三角形数量,r是这个圆的半径
写完上面的代码之后把他挂到一个空对象上或者一个cube上
通过上面的代码就可以获得一个圆形,如图下:
然后就是给这个贴图了,贴图的画需要用到算uv坐标了,如果你的脚本是挂载到一个cube上的话
那就先给那个cube附上图片,将图片直接拖拽到cube身上就可以,然后通过代码操作,代码如下
Vector2[] uvs = new Vector2[v3.Count];
for (int i = 0; i < v3.Count; i++)
{
uvs[i] = new Vector2(v3[i].x / r / 2 + 0.5f, v3[i].z / r / 2 + 0.5f);
}
mesh.uv = uvs;
这里的v3是你绘制这个圆的所有顶点的集合,通过下面的算法就可以做出下面的效果
如果挂载脚本的是空对象的话,在代码中可以加上这一行代码,如下
GetComponent<MeshRenderer>().material = Resources.Load<Material>("Materials/labu");
这一行代码的意思是把Resources下的Materials文件夹中的labu材质球给Mesh网格绘制出来的圆形贴上图片
最终代码是这样的,如下:
public int n = 1000;
public float r = 2;
// Start is called before the first frame update
void Start()
{
//画圆
Mesh mesh = new Mesh();
List<Vector3> v3 = new List<Vector3>();
List<int> triangles = new List<int>();
v3.Add(Vector3.zero);
//每一份的弧度
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;
v3.Add(new Vector3(x, 0, y));
triangles.Add(0);
triangles.Add(i + 1);
//vector2s.Add(new Vector2(x, y));
if (i == n - 1)
{
triangles.Add(1);
}
else
{
triangles.Add(i + 2);
}
}
Vector2[] uvs = new Vector2[v3.Count];
for (int i = 0; i < v3.Count; i++)
{
uvs[i] = new Vector2(v3[i].x / r / 2 + 0.5f, v3[i].z / r / 2 + 0.5f);
}
mesh.vertices = v3.ToArray();
mesh.uv = uvs;
mesh.triangles = triangles.ToArray();
mesh.RecalculateNormals();
//如果挂载脚本的是空对象可以使用这行代码
//GetComponent<MeshRenderer().material=Resources.Load<Material("Materials/labu");
GetComponent<MeshFilter>().mesh = mesh;
}
这就是完整的mesh网格绘制圆形并且贴图了