using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class TestRing : MonoBehaviour
{
private MeshFilter meshFilter;
[ExecuteInEditMode]
private void Awake()
{
tempSegments = Segments;
tempRadiusSmall = radiusSmall;
tempRadiusBig = radiusBig;
if (Segments <= 0)
{
}
else
{
meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = CreatRing();
}
}
[Range(5,10)]
public float radiusBig = 5;
[Range(1, 5)]
public float radiusSmall = 4;
[Range(10, 200)]
public int Segments = 50;
private int tempSegments = 0;
private float tempRadiusBig = 0;
private float tempRadiusSmall = 0;
private void Update()
{
if (tempSegments != Segments || tempRadiusSmall != radiusSmall|| tempRadiusBig!= radiusBig)
{
Awake();
}
}
Mesh CreatRing()
{
// 0 1 2 3 4 5 3段时
///{0,1,3} +1 +3
///{0,3,2} +3 +2
///{2,3,5} +1 +3
///{2,5,4} +3 +2
///4,5,1 固定
///4,1,0 固定
/// 0 1 2 3 4 5 6 7 4段时
///{0,1,3} +1 +3
///{0,3,2} +3 +2
///{2,3,5} +1 +3
///{2,5,4} +3 +2
///4,5,7 +1 +3
///4,7,6 +3 +2
///6,7,1 固定
///6,1,0 固定
Mesh mesh = new Mesh();
float dregrees = -Mathf.PI * 2 / Segments; //每段弧度
print(Mathf.Cos(dregrees));
Vector3 tr = transform.position;
List<Vector3> vector3s = new List<Vector3>();
for (int i = 0; i < Segments; i++)
{
vector3s.Add(new Vector3(tr.x + radiusSmall * Mathf.Cos(dregrees * i), tr.y + radiusSmall * Mathf.Sin(dregrees * i), tr.z));
vector3s.Add(new Vector3(tr.x + radiusBig * Mathf.Cos(dregrees * i), tr.y + radiusBig * Mathf.Sin(dregrees * i), tr.z));
}
List<int> triangles = new List<int>();
for (int i = 0; i < (Segments-1)*2; i+=2)
{
triangles.Add(i);
triangles.Add(i + 1);
triangles.Add(i + 3);
triangles.Add(i);
triangles.Add(i + 3);
triangles.Add(i + 2);
}
triangles.Add(Segments*2-2);
triangles.Add(Segments * 2 - 1);
triangles.Add(1);
triangles.Add(Segments * 2 - 2);
triangles.Add(1);
triangles.Add(0);
List<Vector2> uvs = new List<Vector2>();
for (int i = 0; i < vector3s.Count; i++)
{
if (i % 2 == 0)//内圆
{
//radiusSmall/radiusBig
uvs.Add(new Vector2((vector3s[i].x - tr.x) / radiusBig / 2 + 0.5f,
(vector3s[i].y - tr.y) / radiusBig / 2 + 0.5f));
}
else//外圆
{
uvs.Add(new Vector2((vector3s[i].x - tr.x) / radiusBig / 2 + 0.5f,
(vector3s[i].y - tr.y) / radiusBig / 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 = CreatRing();
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);
}
}
}
}