using System.Collections.Generic; using System.Linq; using UnityEngine; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class CircleGenerator : MonoBehaviour { [Range(1, 200)] public int NodeCount = 3; public int Details = 150; public float Radius = 20.0f; [Range(0, 1)] public float AngleVariation = 0.5f; public float RadiusVariation = 2f; private Random random = new Random(); private float RandomCoefficient(float multiplier) => 2 * (Random.value - 0.5f) * multiplier; public void Generate() { Vector3 center = new Vector3(0, 0, 0); Mesh mesh = new Mesh(); var maxAngleVariation = AngleVariation * Mathf.PI * 2 / Details; var vertices = new List(); for (int i = 0; i < Details; i++) { var angle = i * Mathf.PI * 2 / Details + RandomCoefficient(maxAngleVariation); var radius = Radius + RandomCoefficient(RadiusVariation); Vector3 direction = new Vector3(Mathf.Sin(angle), 0, Mathf.Cos(angle)); vertices.Add(direction * radius); } var triangles = new List(); for (int i = 0; i < Details - 2; i++) { triangles.Add(0); triangles.Add(i); triangles.Add(i + 1); } var normals = new List(); for (int i = 0; i < Details; i++) { normals.Add(-Vector3.forward); } mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.normals = normals.ToArray(); var mf = GetComponent(); mf.mesh = mesh; } }