Mesh绘制空心圆柱体

下面是绘制一个圆柱体的代码,只需要挂载在空对象上就行了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]

public class DrawHuan : MonoBehaviour
{
    //分成的份数
    [SerializeField] int n = 36;
    //外圆半径
    [SerializeField] int maxr = 5;
    //内圆半径
    [SerializeField] int minr = 3;
    // Start is called before the first frame update
    void Start()
    {
        Mesh mesh = GetComponent<MeshFilter>().mesh;
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        meshRenderer.material = new Material(Shader.Find("Standard"));

        //点的集合
        List<Vector3> point = new List<Vector3>();
        //下标集合
        List<int> triangles = new List<int>();

        
        //每个角度对应的弧度
        float r = 2 * Mathf.PI / n;
        //上圆外侧的点个数
        var count = 0;
        //上圆环的点个数
        var scount = 0;
        //下圆环的点个数
        var xcount = 0;
        //上圆外侧的点
        for (int i = 0; i < n; i++)
        {
            float x = Mathf.Cos(i * r) * maxr;
            float z = Mathf.Sin(i * r) * maxr;
            point.Add(new Vector3(x, 2, z));
        }
        count = point.Count;
        //上圆内侧的点
        for (int i = 0; i < n; i++)
        {
            float m = Mathf.Cos(i * r) * minr;
            float w = Mathf.Sin(i * r) * minr;
            point.Add(new Vector3(m, 2, w));
        }
        //上圆环绘制
        for (int i = 0; i < n; i++)
        {
            triangles.Add(i + count);
            triangles.Add(i + 1);
            triangles.Add(i);
            triangles.Add(i);
            triangles.Add(i + count - 1);
            triangles.Add(i + count);
        }
        scount = point.Count;
        //下圆外侧的点
        for (int i = 0; i < n; i++)
        {
            float x = Mathf.Cos(i * r) * maxr;
            float z = Mathf.Sin(i * r) * maxr;
            point.Add(new Vector3(x, -4, z));
        }
        xcount = point.Count;
        //下圆内侧的点
        for (int i = 0; i < n; i++)
        {
            float m = Mathf.Cos(i * r) * minr;
            float w = Mathf.Sin(i * r) * minr;
            point.Add(new Vector3(m, -4, w));
        }
        //下圆环绘制
        for (int i = 0; i < n; i++)
        {
            triangles.Add(i + xcount);
            triangles.Add(i + scount);
            triangles.Add(i + scount + 1);
            triangles.Add(i + scount);
            triangles.Add(i + xcount);
            triangles.Add(i + xcount - 1);
        }
        //外侧墙壁绘制
        for (int i = 0; i < n; i++)
        {
            if (i == n - 1)
            {
                triangles.Add(i + scount);
                triangles.Add(i);
                triangles.Add(0);
                triangles.Add(i + scount);
                triangles.Add(0);
                triangles.Add(scount);
            }
            else
            {
                triangles.Add(i + scount);
                triangles.Add(i);
                triangles.Add(i + 1);
                triangles.Add(i + scount);
                triangles.Add(i + 1);
                triangles.Add(i + scount + 1);
            }
        }
        //内侧墙壁绘制
        for (int i = 0; i < n; i++)
        {
            if (i == n - 1)
            {
                triangles.Add(i + xcount);
                triangles.Add(count);
                triangles.Add(i + count);
                triangles.Add(i + xcount);
                triangles.Add(xcount);
                triangles.Add(count);
            }
            else
            {
                triangles.Add(i + xcount);
                triangles.Add(i + count + 1);
                triangles.Add(i + count);
                triangles.Add(i + xcount);
                triangles.Add(i + xcount + 1);
                triangles.Add(i + count + 1);
            }

        }
        //添加法线
        mesh.RecalculateNormals();
        mesh.vertices = point.ToArray();
        mesh.triangles = triangles.ToArray();
    }

    // Update is called once per frame
    void Update()
    {

    }
}

如果对您有帮助的话,点个小赞赞哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值