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(); } 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); } } }