110 lines
3.5 KiB
C#
110 lines
3.5 KiB
C#
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<MeshFilter>();
|
||
var renderer = target.AddComponent<MeshRenderer>();
|
||
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<MeshCollider>();
|
||
|
||
}
|
||
|
||
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;
|
||
}
|
||
}
|
||
} |