NewN_UAVPlane/Assets/Zion/Scripts/Adam/FiniteStateMachines/CircleDrawingState.cs

110 lines
3.5 KiB
C#
Raw 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 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;
}
}
}