private void FindVertices() { foreach (var vertex in _vertices) { var previousPoint = _obstaclePoints[(int)TrueMod(vertex.ObstaclePointIndex - 1, _obstaclePoints.Count)]; var pointOne = vertex.StartingPosition; var pointTwo = vertex.IsInsideCorner ? pointOne + vertex.Normal * 0.3f : pointOne - vertex.Tangent * 0.3f; var pointThree = previousPoint.StartingPosition; var pointFour = vertex.IsInsideCorner ? pointThree + previousPoint.Normal * 0.3f : pointThree + previousPoint.Tangent * 0.3f; var intersection = IntersectionMaths.FindIntersection(pointOne, pointTwo, pointThree, pointFour); if (intersection.HasValue) { _debugIntersections.Add(new[] { pointOne, pointTwo }); _debugIntersections.Add(new[] { pointThree, pointFour }); var intersectProjected = (pointTwo + pointFour) / 2.0f; vertex.SetVertexValues((intersectProjected - intersection.Value).normalized, intersection.Value); vertex.EvaluateProjectedPoint(_vertexWayPointScalar); } else { if (vertex.IsInsideCorner) { var previousOffset = previousPoint.StartingPosition + previousPoint.Normal * .001f; var previousPointHit = Physics2D.Raycast(previousOffset, previousPoint.Tangent); var previousPointDistance = Vector2.Distance(previousPointHit.point, previousOffset); var cornerOffset = vertex.StartingPosition + vertex.Normal * .001f; var cornerHit = Physics2D.Raycast(cornerOffset, -vertex.Tangent); var cornerPointDistance = Vector2.Distance(cornerHit.point, cornerOffset); var moveDistance = 0f; if (cornerPointDistance < previousPointDistance) { moveDistance = previousPointDistance - cornerPointDistance; vertex.StartingPosition += vertex.Tangent * moveDistance; } else { moveDistance = cornerPointDistance - previousPointDistance; previousPoint.StartingPosition -= previousPoint.Tangent * moveDistance; } pointOne = vertex.StartingPosition; pointTwo = pointOne + vertex.Normal * 0.3f; pointThree = previousPoint.StartingPosition; pointFour = pointThree + previousPoint.Normal * 0.3f; intersection = IntersectionMaths.FindIntersection(pointOne, pointTwo, pointThree, pointFour); if (intersection.HasValue) { _debugIntersections.Add(new[] { pointOne, pointTwo }); _debugIntersections.Add(new[] { pointThree, pointFour }); var intersectProjected = (pointTwo + pointFour) / 2.0f; vertex.SetVertexValues((intersectProjected - intersection.Value).normalized, intersection.Value); vertex.EvaluateProjectedPoint(_vertexWayPointScalar); } } } } }
public Queue <IUnit> GetIntersectionsRelativeTo(IUnit firstUnit) { var possibleIntersections = new List <IUnit>(); var firstStartCheckPoint = firstUnit.Transform.position; foreach (var unit in _units) { if (unit == firstUnit || unit == null || !BoundaryHelper.OnScreen(unit.Transform.position) || unit.Transform.gameObject.activeInHierarchy == false || unit.KillHandler.KillPoint.HasValue || unit.AngleDefinition.IntersectionPoint != Vector2.zero && BoundaryHelper.ContainedInObstacleCollider(unit.AngleDefinition.IntersectionPoint)) { continue; } var firstRearCheckPoint = firstUnit.AngleDefinition.RearPointRelative; var rearPoint = unit.AngleDefinition.RearPointRelative; var forwardPoint = unit.AngleDefinition.ForwardPointRelative; if (IntersectionMaths.IsIntersecting(firstStartCheckPoint, firstRearCheckPoint, rearPoint, forwardPoint)) { var intersect = IntersectionMaths.FindIntersection(firstStartCheckPoint, firstRearCheckPoint, rearPoint, forwardPoint); if (intersect != null) { var directionThroughKillPoint = (unit.KillHandler.GetFauxKillPoint() - (Vector2)unit.Transform.position).normalized; if (possibleIntersections.Any(t => Vector2.Distance(intersect.Value, t.AngleDefinition.IntersectionPoint) < 1f)) { continue; } if (!NodeGrid.Instance.NodeFromWorldPosition(intersect.Value).IsWalkable || !BoundaryHelper.OnScreen(intersect.Value) || BoundaryHelper.ContainedInObstacleCollider(intersect.Value)) { continue; } if (Vector2.Distance(unit.Transform.position, intersect.Value) < 2f || Vector2.Distance(unit.Transform.position, firstStartCheckPoint) < 1f || Vector2.Distance(firstUnit.Transform.position, intersect.Value) < 1f) { continue; } unit.AngleDefinition.SetIntersectionPoint(intersect.Value); possibleIntersections.Add(unit); } } } if (possibleIntersections.Count <= 0) { return(null); } var orderedIntersections = possibleIntersections.OrderBy(t => Vector2.Distance(firstStartCheckPoint, t.AngleDefinition.IntersectionPoint)); var intersectOrder = new Queue <IUnit>(); for (var i = 0; i < orderedIntersections.Count(); i++) { intersectOrder.Enqueue(orderedIntersections.ElementAt(i)); } return(intersectOrder.Count > 0 ? intersectOrder : null); }