Пример #1
0
    private Vector2 GetOverlapPositionForStriker(Striker striker, CollisionSide colSide, RaycastHit2D rayHit, Vector2 actualPos, float radius)
    {
        Vector2 startPos           = actualPos;
        Vector2 newDirectionVector = new Vector2();

        switch (colSide)
        {
        case CollisionSide.Bottom:
            newDirectionVector = striker.transform.up;
            break;

        case CollisionSide.Top:
            newDirectionVector = striker.transform.up * -1;
            break;

        case CollisionSide.Left:
            newDirectionVector = striker.transform.right;
            break;

        case CollisionSide.Right:
            newDirectionVector = striker.transform.right * -1;
            break;
        }

        BoxCollider2D boxCollider = rayHit.collider as BoxCollider2D;
        float         fromCenterToBorderHorizontally = boxCollider.size.x * boxCollider.transform.localScale.x / 2;
        float         fromCenterToBorderVertically   = boxCollider.size.y * boxCollider.transform.localScale.y / 2;

        Vector2 a          = (Vector2)boxCollider.bounds.center + fromCenterToBorderHorizontally * (Vector2)striker.transform.right * -1;
        Vector2 b          = (Vector2)boxCollider.bounds.center + fromCenterToBorderHorizontally * (Vector2)striker.transform.right;
        Vector2 c          = (Vector2)boxCollider.bounds.center + fromCenterToBorderVertically * (Vector2)striker.transform.up;
        Vector2 d          = (Vector2)boxCollider.bounds.center + fromCenterToBorderVertically * (Vector2)striker.transform.up * -1;
        Vector2 e          = new Vector2();
        Vector2 f          = new Vector2();
        float   distToMove = 0;

        switch (colSide)
        {
        case CollisionSide.Bottom:
        case CollisionSide.Top:
            e          = actualPos + newDirectionVector * 10;
            f          = actualPos - newDirectionVector * 10;
            actualPos  = Math2D.GetIntersectionPointCoordinates(a, b, e, f);
            distToMove = radius + fromCenterToBorderVertically + distToMoveOnOverlap;
            break;

        case CollisionSide.Left:
        case CollisionSide.Right:
            e          = actualPos + newDirectionVector * 10;
            f          = actualPos - newDirectionVector * 10;
            actualPos  = Math2D.GetIntersectionPointCoordinates(c, d, e, f);
            distToMove = radius + fromCenterToBorderHorizontally + distToMoveOnOverlap;
            break;
        }
        Vector2 newPos = actualPos + newDirectionVector * distToMove;

        Debug.DrawLine(startPos, newPos, Color.white, 4);
        return(newPos);
    }