//自动添加 网格渲染组件
[RequireComponent(typeof(MeshRenderer))]
//自动添加网格数据组件
[RequireComponent (typeof(MeshFilter))]
public class Cylinder : MonoBehaviour
{
Mesh mesh;
VertexHelper vh;
//内部半径
float insideR=3;
//外部半径
float outerR=6;
float height = 15;
float num = 25;
//弧度
float angel;
// Start is called before the first frame update
void Start()
{
//new 一个新的网格
mesh=new Mesh();
//new 一个新的顶点帮助器
vh=new VertexHelper();
//弧度
angel = 2 * Mathf.PI / num;
//添加圆心
//底 圆心
vh.AddVert(Vector3.zero,Color.white,new Vector2(0,0));
//高圆心
vh.AddVert(new Vector3(0, height, 0), Color.white, new Vector2(0, 0));
for(int i=0;i<num;i++)
{
// 底 内圆
float x = Mathf.Cos(angel * i) * insideR;
float y = Mathf.Sin(angel * i) * insideR;
vh.AddVert(new Vector3(x, -height/2, y), Color.white, new Vector2(0,0));
vh.AddVert(new Vector3(x, height / 2, y), Color.white, new Vector2(0, 0));
//底 外圆
float x1 = Mathf.Cos(angel * i) * outerR;
float y1 = Mathf.Sin(angel * i) * outerR;
vh.AddVert(new Vector3(x1, -height / 2, y1), Color.white, new Vector2(0, 0));
vh.AddVert(new Vector3(x1, height / 2, y1), Color.white, new Vector2(0, 0));
if (i == num - 1)
{//底 圆
vh.AddTriangle(i * 4 + 2, (i + 1) * 4, 4);
vh.AddTriangle(i * 4 + 2, 4, 2);//高 圆
vh.AddTriangle(5, (i + 1) * 4 + 1, i * 4 + 2 + 1);
vh.AddTriangle(3, 5, i * 4 + 3);
//内壁vh.AddTriangle(3, (i + 1) * 4 - 1, (i + 1) * 4 - 2);
vh.AddTriangle(2, 3, (i + 1) * 4 - 2);
//外壁
vh.AddTriangle((i + 1) * 4, (i + 1) * 4 + 1, 5);
vh.AddTriangle((i + 1) * 4, 5, 4);}
else
{//底 圆
vh.AddTriangle(i * 4 + 2, (i + 1) * 4, (i + 1) * 4 + 4);
vh.AddTriangle(i * 4 + 2, (i + 1) * 4 + 4, (i + 1) * 4 + 2);
//高 圆
vh.AddTriangle((i + 1) * 4 + 5, (i + 1) * 4 + 1, i * 4 + 3);
vh.AddTriangle((i + 1) * 4 + 3, (i + 1) * 4 + 5, i * 4 + 3);
//内壁
vh.AddTriangle((i + 2) * 4 - 1, (i + 1) * 4 - 1, (i + 1) * 4 - 2);
vh.AddTriangle((i + 1) * 4 + 2, (i + 2) * 4 - 1, (i + 1) * 4 - 2);
//外壁
vh.AddTriangle((i + 1) * 4, (i + 1) * 4 + 1, (i + 2) * 4 + 1);
vh.AddTriangle((i + 1) * 4, (i + 2) * 4 + 1, (i + 1) * 4 + 4);
}
}
vh.FillMesh(mesh);
Material mat = new Material(Shader.Find("Standard"));
GetComponent<MeshRenderer>().material = mat;
GetComponent<MeshFilter>().mesh = mesh;
}