using UnityEngine; //============================================================ //支持中文,文件使用UTF-8编码 //@author JiphuTzu //@create 20220910 //@company Umawerse // //@description: //============================================================ namespace Umawerse.FiniteStateMachines { public class CircleDrawingState : DrawingState { private int _segments = 60; public CircleDrawingState(ToolsBootstrap root) : base(root, StateName.circle, 2, 2) { } protected override void OnTap(Vector3 pos) { AddPoint(pos); } protected override void OnDoubleTap(Vector3 pos) { //AddPoint(pos); } protected override void UpdatePreview(Vector3 pos) { } public override void Complete() { var filter = target.AddComponent(); var renderer = target.AddComponent(); renderer.material = root.ployMaterial; renderer.material.color = Color.green; var radius = Vector3.Distance(vertices[0], vertices[1]); var mesh = CreateMesh(radius, _segments); filter.mesh = mesh; // var mc = target.AddComponent(); } public override void AddPoint(Vector3 position, bool showImmediately = true) { vertices.Add(position); if (vertices.Count == 1) target.transform.position = position; if (!showImmediately) return; var circlePoint = Object.Instantiate(root.circlePointPrefab, target.transform); circlePoint.transform.position = position; if (vertices.Count == 2) { //var radius = Vector3.Distance(vertices[0], vertices[1]); //_currentMeshFilter.mesh = CreateMesh(radius, _segments); Complete(); } } private Mesh CreateMesh(float radius, int segments) { //vertices: var verticesCount = segments + 1; var vertices = new Vector3[verticesCount]; var uvs = new Vector2[verticesCount]; vertices[0] = Vector3.zero; var radian = Mathf.PI * 2; var delta = radian / segments; for (var i = 1; i < verticesCount; i++) { var x = Mathf.Cos(radian); var y = Mathf.Sin(radian); vertices[i] = new Vector3(radius * x, 0, radius * y); uvs[i] = new Vector2(x / 2 + 0.5f, y / 2 + 0.5f); radian -= delta; } //triangles var triangleCount = segments * 3; var triangles = new int[triangleCount]; for (int i = 0, vi = 1; i <= triangleCount - 1; i += 3, vi++) //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理 { triangles[i] = 0; triangles[i + 1] = vi; triangles[i + 2] = vi + 1; } triangles[triangleCount - 3] = 0; triangles[triangleCount - 2] = verticesCount - 1; triangles[triangleCount - 1] = 1; //为了完成闭环,将最后一个三角形单独拎出来 //负载属性与mesh var mesh = new Mesh { name = "Circle", vertices = vertices, triangles = triangles, uv = uvs }; return mesh; } } }