70 lines
2.4 KiB
C#
70 lines
2.4 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
namespace BF
|
||
{
|
||
|
||
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
|
||
public class SkillSectorMesh : MonoBehaviour
|
||
{
|
||
public float Radius = 1; //外半径
|
||
public float InnerRadius = 0; //内半径
|
||
public float AngleDegree = 360; //扇形或扇面的角度
|
||
public int Segments = 60; //分割数
|
||
|
||
private MeshFilter meshFilter;
|
||
|
||
void Start()
|
||
{
|
||
meshFilter = GetComponent<MeshFilter>();
|
||
}
|
||
|
||
Mesh CreateMesh(float radius, float innerradius,float angledegree,int segments)
|
||
{
|
||
int verticesCount = segments * 2 + 2; // 因为vertices(顶点)的个数与triangles(索引三角形顶点数)必须匹配
|
||
Vector3[] vertices = new Vector3[verticesCount];
|
||
float angleCur = Mathf.Deg2Rad * (angledegree/2 + 90);
|
||
float angledelta = (Mathf.Deg2Rad * angledegree) / segments;
|
||
|
||
for(int i = 0; i < verticesCount; i += 2)
|
||
{
|
||
float cosA = Mathf.Cos(angleCur);
|
||
float sinA = Mathf.Sin(angleCur);
|
||
vertices[i] = new Vector3(radius * cosA, 0, radius * sinA);
|
||
vertices[i + 1] = new Vector3(innerradius * cosA, 0, innerradius * sinA);
|
||
angleCur -= angledelta;
|
||
}
|
||
|
||
int triangleCount = segments * 6;
|
||
int[] triangles = new int[triangleCount];
|
||
for(int i = 0, vi = 0; i < triangleCount; i += 6, vi += 2)
|
||
{
|
||
triangles[i] = vi;
|
||
triangles[i + 1] = vi + 3;
|
||
triangles[i + 2] = vi + 1;
|
||
triangles[i + 3] = vi + 2;
|
||
triangles[i + 4] = vi + 3;
|
||
triangles[i + 5] = vi;
|
||
}
|
||
|
||
//uv:
|
||
Vector2[] uvs = new Vector2[verticesCount];
|
||
for (int i = 0; i < verticesCount; i++)
|
||
{
|
||
uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);
|
||
}
|
||
|
||
Mesh mesh = new Mesh();
|
||
mesh.vertices = vertices;
|
||
mesh.triangles = triangles;
|
||
mesh.uv = uvs;
|
||
return mesh;
|
||
}
|
||
|
||
public void RefreshMesh()
|
||
{
|
||
meshFilter.mesh = CreateMesh(Radius, InnerRadius, AngleDegree, Segments);
|
||
}
|
||
}
|
||
} |