130 lines
3.9 KiB
C#
130 lines
3.9 KiB
C#
using UnityEngine;
|
||
//============================================================
|
||
//支持中文,文件使用UTF-8编码
|
||
//@author JiphuTzu
|
||
//@create 20220910
|
||
//@company Umawerse
|
||
//
|
||
//@description:
|
||
//============================================================
|
||
namespace Umawerse.FiniteStateMachines
|
||
{
|
||
public class LineDrawingState : DrawingState
|
||
{
|
||
private LineRenderer _line;
|
||
public LineDrawingState(ToolsBootstrap root) : base(root, StateName.line, 2, 99)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
|
||
protected override void OnTap(Vector3 pos)
|
||
{
|
||
AddPoint(pos);
|
||
}
|
||
|
||
protected override void OnDoubleTap(Vector3 pos)
|
||
{
|
||
AddPoint(pos);
|
||
}
|
||
|
||
protected override void UpdatePreview(Vector3 pos)
|
||
{
|
||
var vs = new Vector3[vertices.Count + 1];
|
||
//var h = vertices[0].y > pos.y ? vertices[0].y : pos.y;
|
||
for (var i = 0; i < vertices.Count; i++)
|
||
{
|
||
vs[i] = vertices[i];//new Vector3(vertices[i].x, h, vertices[i].z);
|
||
//target.transform.GetChild(i).position = vs[i];
|
||
}
|
||
|
||
vs[vertices.Count] = pos;//new Vector3(pos.x, h, pos.z);
|
||
_line.positionCount = vs.Length;
|
||
_line.SetPositions(vs);
|
||
_line.material.SetFloat("_Cnt", GetLength(vs) / 3);
|
||
}
|
||
|
||
public override void Init()
|
||
{
|
||
base.Init();
|
||
_line = target.AddComponent<LineRenderer>();
|
||
_line.sortingOrder = -1;
|
||
_line.startWidth = 3f;
|
||
_line.endWidth = 3f;
|
||
_line.numCornerVertices = 3;
|
||
|
||
_line.material = root.solidLineMaterial;
|
||
_line.material.color = Color.green;
|
||
}
|
||
|
||
public override void Complete()
|
||
{
|
||
_line.positionCount = vertices.Count;
|
||
var vs = vertices.ToArray();
|
||
_line.SetPositions(vs);
|
||
_line.material.SetFloat("_Cnt", GetLength(vs) / 3);
|
||
var lineMesh = new Mesh();
|
||
_line.BakeMesh(lineMesh, true);
|
||
target.AddComponent<MeshCollider>().sharedMesh = lineMesh;
|
||
//
|
||
}
|
||
|
||
public override void AddPoint(Vector3 position, bool showImmediately = true)
|
||
{
|
||
Vector3 tempY;
|
||
if (root.isDistance)
|
||
{
|
||
tempY = new Vector3(position.x, 580f, position.z);
|
||
}
|
||
else
|
||
{
|
||
tempY = position + Vector3.up * 50f;
|
||
}
|
||
vertices.Add(tempY);
|
||
|
||
//if (showImmediately)
|
||
//{
|
||
// var h = vertices[0].y > position.y ? vertices[0].y : position.y;
|
||
// for (int i = 0; i < vertices.Count; i++)
|
||
// {
|
||
// var v = vertices[i];
|
||
// v.y = h;
|
||
// vertices[i] = v;
|
||
// if (i < target.transform.childCount)
|
||
// target.transform.GetChild(i).localPosition = v;
|
||
// }
|
||
//}
|
||
|
||
var linePoint = Object.Instantiate(root.linePointPrefab, target.transform);
|
||
linePoint.transform.localPosition = vertices[vertices.Count - 1];
|
||
|
||
|
||
_line.positionCount = vertices.Count;
|
||
var vs = vertices.ToArray();
|
||
_line.SetPositions(vs);
|
||
}
|
||
|
||
private void CorrectDirection()
|
||
{
|
||
var index = vertices.Count - 1;
|
||
var last = index - 1;
|
||
var dir = vertices[index] - vertices[last];
|
||
dir.y = 0;
|
||
dir.Normalize();
|
||
target.transform.GetChild(index).GetChild(1).forward = dir;
|
||
target.transform.GetChild(last).GetChild(1).forward = dir;
|
||
}
|
||
|
||
private float GetLength(Vector3[] vs)
|
||
{
|
||
var length = 0f;
|
||
for (var i = 1; i < vs.Length; i++)
|
||
{
|
||
length += Vector3.Distance(vs[i], vs[i - 1]);
|
||
}
|
||
return length;
|
||
}
|
||
}
|
||
}
|