using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//必須要挂載到有<meshFilter>的物體上
//同一個物體隻有一個mesh,繪制不同的mesh要分到不同的物體上
public class DrawPlayerIndicator : MonoBehaviour
{
public float Radius = 0.3f; //外圈的半徑
public float Thickness = 0.05f; //厚度,外圈半徑減去内圈半徑
public float Depth = 1.0f; //厚度
public float NumberOfSides = 60.0f; //由多少個面組成
public float DrawArchDegrees = 360.0f; //要繪畫多長
public Material archMaterial = null;
private List<Vector3> vertexList = new List<Vector3>();
private List<int> triangleList = new List<int>();
private List<Vector2> uvList = new List<Vector2>();
// Start is called before the first frame update
void Start()
{
GenerateVertex();
}
void GenerateVertex()
{
//頂點坐标
vertexList.Clear();
float incrementAngle = DrawArchDegrees / NumberOfSides;
//小于等于是因為n+1條線才能組成n個面
for (int i = 0; i <= NumberOfSides; i++)
{
float angle = 180 - i * incrementAngle;
float innerX = (Radius - Thickness) * Mathf.Cos(angle * Mathf.Deg2Rad);
float innerZ = (Radius - Thickness) * Mathf.Sin(angle * Mathf.Deg2Rad);
vertexList.Add(new Vector3(innerX, 0, innerZ));
float outsideX = Radius * Mathf.Cos(angle * Mathf.Deg2Rad);
float outsideZ = Radius * Mathf.Sin(angle * Mathf.Deg2Rad);
vertexList.Add(new Vector3(outsideX, 0, outsideZ));
}
//三角形索引
triangleList.Clear();
int direction = 1;
for (int i = 0; i < NumberOfSides * 2; i++)
{
int[] triangleIndexs = getTriangleIndexs(i, direction);
direction *= -1;
for (int j = 0; j < triangleIndexs.Length; j++)
{
triangleList.Add(triangleIndexs[j]);
}
}
//UV索引
uvList.Clear();
for (int i = 0; i <= NumberOfSides; i++)
{
float angle = 180 - i * incrementAngle;
float littleX = (1.0f / NumberOfSides) * i;
uvList.Add(new Vector2(littleX, 0));
float bigX = (1.0f / NumberOfSides) * i;
uvList.Add(new Vector2(bigX, 1));
}
Mesh mesh = new Mesh()
{
vertices = vertexList.ToArray(),
uv = uvList.ToArray(),
triangles = triangleList.ToArray(),
};
mesh.RecalculateNormals();
gameObject.AddComponent<MeshFilter>().mesh = mesh;
gameObject.AddComponent<MeshRenderer>().material = archMaterial;
}
int[] getTriangleIndexs(int index, int direction)
{
int[] triangleIndexs = new int[3] { 0, 1, 2 };
for (int i = 0; i < triangleIndexs.Length; i++)
{
triangleIndexs[i] += index;
}
if (direction == -1)
{
int temp = triangleIndexs[0];
triangleIndexs[0] = triangleIndexs[2];
triangleIndexs[2] = temp;
}
return triangleIndexs;
}
//繪制圓環
void Update()
{
//ToDrawSectorSolid(transform, transform.localPosition, 60, 3);
}
}