0
点赞
收藏
分享

微信扫一扫

Unity中使用Mesh绘制圆环/空心圆,可调节圆环角度与位置

幺幺零 2023-08-16 阅读 49

public class MeshDrawRing : MonoBehaviour

{

   public Material mat;

   public Transform go;

   public float radius = 6;            //外半径  

   public float innerRadius = 3;       //内半径

   public int segments = 60;           //分割数  

   public int angleDegree = 360;       //扇形或扇面的角度


   private void Start()

   {

       transform.eulerAngles = Vector3.left * 90;

   }


   private void Update()

   {

       DrawRing(radius, innerRadius, segments, angleDegree, go.position);

   }


   /// <summary>

   /// 画圆环

   /// </summary>

   /// <param name="radius">圆半径</param>

   /// <param name="innerRadius">内圆半径</param>

   /// <param name="segments">圆的分割数</param>

   /// <param name="angleDegree">圆覆盖的角度</param>

   /// <param name="centerCircle">圆心坐标</param>

   void DrawRing(float radius, float innerRadius, int segments, int angleDegree, Vector3 centerCircle)

   {

       gameObject.AddComponent<MeshFilter>();

       gameObject.AddComponent<MeshRenderer>();

       gameObject.GetComponent<MeshRenderer>().material = mat;

       //顶点

       Vector3[] vertices = new Vector3[segments * 2];

       angleDegree = Mathf.Clamp(angleDegree, 0, 360);

       float deltaAngle = Mathf.Deg2Rad * angleDegree / segments;

       float currentAngle = 0;

       for (int i = 0; i < vertices.Length; i += 2)

       {

           float cosA = Mathf.Cos(currentAngle);

           float sinA = Mathf.Sin(currentAngle);

           vertices[i] = new Vector3(cosA * innerRadius + centerCircle.x, sinA * innerRadius + centerCircle.y, 0);

           vertices[i + 1] = new Vector3(cosA * radius + centerCircle.x, sinA * radius + centerCircle.y, 0);

           currentAngle += deltaAngle;

       }

       //三角形

       int[] triangles = new int[segments * 6];

       for (int i = 0, j = 0; i < segments * 6; i += 6, j += 2)

       {

           triangles[i] = j;

           triangles[i + 1] = (j + 1) % vertices.Length;

           triangles[i + 2] = (j + 3) % vertices.Length;

           triangles[i + 3] = j;

           triangles[i + 4] = (j + 3) % vertices.Length;

           triangles[i + 5] = (j + 2) % vertices.Length;

       }

       //uv:

       Vector2[] uvs = new Vector2[vertices.Length];

       for (int i = 0; i < vertices.Length; i++)

       {

           uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);

       }

       Mesh mesh = GetComponent<MeshFilter>().mesh;

       mesh.Clear();

       mesh.vertices = vertices;

       mesh.triangles = triangles;

       mesh.uv = uvs;

   }

}

举报

相关推荐

0 条评论