728x90
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreatePoly : MonoBehaviour
{
Mesh mesh;
public Vector3[] polygonPoints;
public int[] polygonTriangles;
public bool isFilled;
public int polygonSides;
public float polygonRadius;
public float centerRadius;
private void Start()
{
mesh = new Mesh();
this.GetComponent<MeshFilter>().mesh = mesh;
}
private void Update()
{
if (isFilled)
{
DrawFilled(polygonSides, polygonRadius);
}
else
{
DrawHollow(polygonSides, polygonRadius, centerRadius);
}
}
private void DrawFilled(int sides, float radius)
{
polygonPoints = GetCircumferencePoints(sides, radius).ToArray();
polygonTriangles = DrawFilledTriangles(polygonPoints);
mesh.Clear();
mesh.vertices = polygonPoints;
mesh.triangles = polygonTriangles;
}
private void DrawHollow(int sides, float outerRadius, float inneRadius)
{
List<Vector3> pointsList = new List<Vector3>();
List<Vector3> outerPoints = GetCircumferencePoints(sides, outerRadius);
pointsList.AddRange(outerPoints);
List<Vector3> innerPoints = GetCircumferencePoints(sides, inneRadius);
pointsList.AddRange(innerPoints);
polygonPoints = pointsList.ToArray();
polygonTriangles = DrawHollowTriangles(polygonPoints);
mesh.Clear();
mesh.vertices = polygonPoints;
mesh.triangles = polygonTriangles;
}
private int[] DrawHollowTriangles(Vector3[] points)
{
int sides = points.Length / 2;
int triangleAmount = sides * 2;
List<int> newTriangles = new List<int>();
for(int i = 0; i < sides; i++)
{
int outerIndex = i;
int innerIndex = i + sides;
newTriangles.Add(outerIndex);
newTriangles.Add(innerIndex);
newTriangles.Add((i + 1) % sides);
newTriangles.Add(outerIndex);
newTriangles.Add(sides + ((sides + i - 1) % sides));
newTriangles.Add(outerIndex + sides);
}
return newTriangles.ToArray();
}
private List<Vector3> GetCircumferencePoints(int sides, float radius)
{
List<Vector3> points = new List<Vector3>();
float circumferenceProgressPerStep = (float)1 / sides;
float TAU = 2 * Mathf.PI;
float radianProgressPerStep = circumferenceProgressPerStep * TAU;
for (int i = 0; i < sides; i++)
{
float currentRadian = radianProgressPerStep * i;
points.Add(new Vector3(Mathf.Cos(currentRadian) * radius, Mathf.Sin(currentRadian) * radius, 0));
}
return points;
}
private int[] DrawFilledTriangles(Vector3[] points)
{
int triangleAmount = points.Length - 2;
List<int> newTriangles = new List<int>();
for (int i = 0; i < triangleAmount; i++)
{
newTriangles.Add(0);
newTriangles.Add(i + 2);
newTriangles.Add(i + 1);
}
return newTriangles.ToArray();
}
}
728x90
'기타 기술 > C#' 카테고리의 다른 글
범위내에 오브젝트 찾기 (0) | 2023.10.04 |
---|---|
게임 배속 주기 (0) | 2023.09.17 |
모든 프로젝트의 기본 소스 (0) | 2023.08.22 |
NavMeshAgent 기본값 (0) | 2023.08.19 |
ResourceManager (0) | 2023.08.12 |