private void UpdateLines() { //Vector2? localLimit = Limit != null ? (Vector2?)Limit.GetWidthLimits() - Vector2.one * transform.position.x : null; //if (DefaultLimiter != null) //{ // var dLimit = DefaultLimiter.GetWidthLimits() - Vector2.one * transform.position.x; // if (Target is ForNode) // { // print(localLimit); // } // localLimit = localLimit == null ? dLimit : new Vector2(Mathf.Min(localLimit.Value.x,dLimit.x), Mathf.Max(localLimit.Value.y, dLimit.y)); //} GizmoPoints.Clear(); GizmoLines.Clear(); //if(localLimit.HasValue) // GizmoLines.Add(new KeyValuePair<Vector2, ColoredVector>(transform.position - Vector3.right * localLimit.Value.x, new ColoredVector(transform.position = Vector3.right * localLimit.Value.y,Color.gray))); lineRenderer.positionCount = 6; lineRenderer.useWorldSpace = false; Vector2 targetPosition = transform.InverseTransformPoint(EnterPoint.position); Vector3[] positions = new Vector3[7]; positions[0] = Vector2.zero; //Начало positions[1] = ExitDirection * MarginLineDistance; //Точка выхода Vector2?defLim = DefaultLimiter != null ? new Vector2?(DefaultLimiter.GetWidthLimits() - Vector2.one * transform.position.x) : null; Vector2?localLimit = Limit != null ? new Vector2(Limit.GetWidthLimits().x - transform.position.x, defLim.HasValue ? defLim.Value.y : 0) : defLim; float? yBottom = null; if (localLimit.HasValue) { if (positions[1].x > 0) { positions[1].x = Mathf.Max(localLimit.Value.y, positions[1].x); } else if (positions[1].x < 0) { positions[1].x = Mathf.Min(localLimit.Value.x, positions[1].x); } } if (YLimiter != null) { yBottom = YLimiter.GetBottom().y - FlowBuilder.g_Margin * FlowBuilder.g_LineDistance - transform.position.y; } positions[5] = targetPosition + ((Vector2)EnterPoint.up).normalized * MarginLineDistance; //Точка входа positions[6] = targetPosition; //Конец if (positions[6].y < positions[0].y && Mathf.Abs(positions[6].x - positions[0].x) < 5) { positions[1] = Utils.NanVector2; positions[2] = Utils.NanVector2; positions[3] = Utils.NanVector2; positions[4] = Utils.NanVector2; positions[5] = Utils.NanVector2; } else { if (positions[5].y > ExitDirection.y * MarginLineDistance) //Если точка входа выше точки выхода { if (ExitDirection.x > 0) //Если выходит справа { positions[2] = new Vector2(positions[1].x, yBottom.HasValue ? yBottom.Value : positions[1].y); positions[3] = new Vector2(localLimit.HasValue ? localLimit.Value.x : -MarginLineDistance * 5, positions[2].y); if (!Pathfinding) { positions[4] = new Vector2(localLimit.HasValue ? localLimit.Value.x : -MarginLineDistance * 5, positions[5].y); } else { //positions[4] = new Vector2(localLimit.HasValue ? localLimit.Value.x : -MarginLineDistance * 5, positions[5].y); positions[4] = new Vector2(float.NaN, 0); } } else { positions[2] = new Vector2(localLimit.HasValue ? localLimit.Value.x : -MarginLineDistance * 5, positions[1].y); positions[3] = new Vector2(localLimit.HasValue ? localLimit.Value.x : -MarginLineDistance * 5, positions[5].y); positions[4] = new Vector2(float.NaN, 0); } if (Limit != null) { GizmoLines.Add(new KeyValuePair <Vector2, ColoredVector>(new Vector2(Limit.GetWidthLimits().x, transform.position.y), new ColoredVector(new Vector2(Limit.GetWidthLimits().y, transform.position.y), Color.yellow))); GizmoLines.Add(new KeyValuePair <Vector2, ColoredVector>(new Vector2(localLimit.Value.x + transform.position.x, transform.position.y - 10), new ColoredVector(new Vector2(localLimit.Value.y + transform.position.x, transform.position.y - 10), Color.magenta))); } } else { float minX = positions[1].x; if (Math.Abs(ExitDirection.x) < 0.0001f) //Если выходит снизу { if (localLimit.HasValue && localLimit.Value.y > minX) // Есть ограничение и правое ограничение больше точки выхода { minX = localLimit.Value.y; //Сдвигаем Х вправо до ограничения } } else if (ExitDirection.x > 0) //Выходит справа { if (localLimit.HasValue && localLimit.Value.y > minX) // Есть ограничение и правое ограничение больше точки выхода { minX = localLimit.Value.y; //Сдвигаем Х вправо до ограничения } if (positions[6].x > minX) //Если точка входа правее точки выхода { minX = positions[6].x; //Сдвигаем Х до точки входа } } else //Выходит слева { if (localLimit.HasValue && localLimit.Value.x < minX)//Если ограничение слева левее точки выхода { minX = localLimit.Value.x; //Сдвигаем Х до левого ограничения } if (positions[6].x < minX) //Если точка входа левее точки выхода { minX = positions[6].x; //Сдвигаем Х до точки входа } } positions[2] = new Vector2(minX, positions[1].y); positions[3] = new Vector2(minX, positions[5].y); positions[4] = new Vector2(float.NaN, 0); } } positions = positions.Where(p => !float.IsNaN(p.x)).ToArray(); //clean up for (int i = 1; i < positions.Length - 1; i++) { if ((Math.Abs(positions[i].x - positions[i - 1].x) < Tolerance && Math.Abs(positions[i].x - positions[i + 1].x) < Tolerance) || (Math.Abs(positions[i].y - positions[i - 1].y) < Tolerance && Math.Abs(positions[i].y - positions[i + 1].y) < Tolerance)) { positions[i] = Utils.NanVector2; } } positions = positions.Where(p => !float.IsNaN(p.x)).Select(x => transform.TransformPoint(x)).ToArray(); if (Pathfinding) { List <Vector3> corrected = new List <Vector3>(positions); bool uncorrectable = false; for (int i = corrected.Count - 2; i > 0; i--) { RaycastHit2D hit; Node node; int c = 0; do { hit = Physics2D.Raycast(corrected[i], Vector2.up, 1, UIController.NodesMask); if (hit.transform != null && (node = hit.transform.GetComponent <Node>()) != null) { GizmoPoints.Add(new ColoredVector(hit.point, Color.red)); GizmoLines.Add(new KeyValuePair <Vector2, ColoredVector>(corrected[i], new ColoredVector(corrected[i + 1], Color.red))); if (i == corrected.Count - 2 || i == 1) { uncorrectable = true; break; } var bound = node.GetBound(corrected[i + 1] - corrected[i]); corrected[i] = (Vector2)node.transform.position + bound + bound.normalized * MarginLineDistance; if (!CorrectWay(corrected, i, i + 1)) { corrected[i] = (Vector2)node.transform.position - (bound + bound.normalized * MarginLineDistance); CorrectWay(corrected, i, i + 1); } } } while (hit.transform != null && hit.transform.GetComponent <Node>() != null && c++ < 5); } if (!uncorrectable && CorrectWay(corrected, 1, corrected.Count - 2)) { positions = corrected.ToArray(); } } if (UIController.Attach) { Attached = null; for (int i = 0; i < positions.Length; i++) { AttachLine?check = CastToAttach(positions[i]); if (check != null) { Array.Resize(ref positions, i + 2); positions[i + 1] = check.Value.ConnectPoint; Attached = check.Value.Link; break; } } } positions = positions.Select(x => transform.InverseTransformPoint(x)).ToArray(); for (int i = 0; i < positions.Length; i++) { positions[i].z = 0; } lineRenderer.positionCount = positions.Length; lineRenderer.SetPositions(positions); if (edgeCollider2D != null) { edgeCollider2D.points = positions.Select(x => (Vector2)x).ToArray(); } }