private Collision GetCollision(Vector2 closestPoint) { Collision collision; var ballInsidePaddle = boxCollider.bounds.Contains(ballTransform.position); if (ballInsidePaddle) { collision = new Collision { BallPosition = previousBallPosition, Point = previousClosestPoint, GameObject = gameObject }; } else { collision = new Collision { BallPosition = ballTransform.position, Point = closestPoint, GameObject = gameObject }; } return(collision); }
private static Vector2 CalculateNormalVector(Collision collision, Vector2 moveDirection) { var normalVector = (collision.Point - collision.BallPosition).normalized; if (Vector2.Dot(normalVector, moveDirection) < 0) { normalVector *= -1; } Debug.DrawLine(collision.Point - normalVector, collision.Point, Color.blue); return(normalVector); }
public static Vector2 CalculateNewDirection(Collision collision, Vector2 moveDirection) { var normal = CalculateNormalVector(collision, moveDirection); var oppositeMoveDirection = -moveDirection; var cosine = Vector2.Dot(normal, oppositeMoveDirection); var reducedNormal = normal * cosine; var verticalVector = reducedNormal - oppositeMoveDirection; var impulse = verticalVector * 2; return(oppositeMoveDirection + impulse); }