コード例 #1
0
    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);
                    }
                }
            }
        }
    }
コード例 #2
0
    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);
    }