c1_unity/Assets/Scripts/Component/Mesh/SkillSectorMesh.cs
2023-04-03 11:04:31 +08:00

70 lines
2.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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