using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class TestCircle : MonoBehaviour
{
private MeshFilter meshFilter;
[ExecuteInEditMode]
private void Awake()
{
tempSegments = Segments;
tempRadius = Radius;
if (Segments <= 0)
{
}
else
{
meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = CreatCircle();
}
}
private void Update()
{
if (tempSegments != Segments || tempRadius != Radius)
{
Awake();
}
}
private float tempRadius = 5;
private int tempSegments = 4;
[Range(1, 10)]
public float Radius = 5; //半径
[Range(1,200)]
public int Segments = 4; //分割数 360/Segments
Mesh CreatCircle()
{
Mesh mesh = new Mesh();
float dregrees = -Mathf.PI * 2 / Segments; //每段弧度
print(Mathf.Cos(dregrees));
Vector3 tr = transform.position;
List<Vector3> vector3s = new List<Vector3>();
vector3s.Add(new Vector3(tr.x, tr.y, tr.z));
for (int i = 0; i < Segments ; i++)
{
vector3s.Add(new Vector3(tr.x + Radius * Mathf.Cos(dregrees * i), tr.y + Radius * Mathf.Sin(dregrees * i), tr.z));
}
List<int> triangles = new List<int>();
for (int i = 0; i < Segments - 1; i++)
{
triangles.Add(0);
triangles.Add(i + 1);
triangles.Add(i + 2);
}
triangles.Add(0);
triangles.Add(Segments);
triangles.Add(1);
List<Vector2> uvs = new List<Vector2>();
for (int i = 0; i < vector3s.Count; i++)
{
//uvs.Add(Vector2.zero);
uvs.Add(new Vector2((vector3s[i].x- tr.x) / Radius / 2 + 0.5f,
(vector3s[i].y - tr.y) / Radius / 2 + 0.5f));
}
mesh.vertices = vector3s.ToArray();
mesh.triangles = triangles.ToArray();
mesh.uv = uvs.ToArray(); ;
return mesh;
}
void OnDrawGizmos()
{
Gizmos.color = Color.gray;
DrawMesh();
}
void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
DrawMesh();
}
private void DrawMesh()
{
if (Segments <= 0)
{
}
else
{
Mesh mesh = CreatCircle();
int[] tris = mesh.triangles;
//画三角形
for (int i = 0; i < tris.Length / 3; i++)
{
Gizmos.DrawLine(mesh.vertices[tris[i * 3]], mesh.vertices[tris[i * 3 + 1]]);
Gizmos.DrawLine(mesh.vertices[tris[i * 3 + 1]], mesh.vertices[tris[i * 3 + 2]]);
Gizmos.DrawLine(mesh.vertices[tris[i * 3 + 2]], mesh.vertices[tris[i * 3]]);
}
//在每个顶点处画球
for (int i = 0; i < mesh.vertices.Length; i++)
{
Gizmos.DrawSphere(mesh.vertices[i], 0.2f);
}
}
}
}