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(); _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().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); root.wrjManager.currentWRJ.wayPoints = vertices; } 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; } } }