I'm struggling with how to get the ball to change the bounce based on where it hits on the paddle. Normally in a pong game, the angle changes, depending on how far from center the ball bounces, and which direction of the center it bounces. I managed to do something like that:

//rb = rigidbody, velOnPaddleHit = predefined float
float dist = transform.position.x - paddle.position.x;
dist = transform.position.x > paddle.position.x ? dist : -dist;
dist /= paddle.localScale.x/2;
dist *= velOnPaddleHit;
rb.addForce(dist, 0,0);

But it's just not working / it's weird. Can anyone help me?

Edit: Here's the video showing this kind of behaviour. When the ball hits the left side of the paddle, it goes left, the velocity doesn't matter


  • \$\begingroup\$ Apparently there is a mistake in your code. You supplied "-dist" explicitly, as dist in not an abs value, it will retain its + or - sign, so no need to provide -dist, otherwise -(-dist) will become +dist. Just use dist only \$\endgroup\$ Mar 5 '16 at 21:37
  • \$\begingroup\$ Did you read the post? I'm checking whether the ball is on the right or on the left side of the paddle. \$\endgroup\$ Mar 6 '16 at 0:03
  • \$\begingroup\$ What are you doing after finding that? Modifying dist variable by +ve or -ve, which you are not suppose to do \$\endgroup\$ Mar 6 '16 at 0:16

Calculate the dot product of the ball's position, relative to the center of the paddle, and a fixed reference direction:

enter image description here

Both vectors must be normalized. While bouncing, invert the y-component of the ball's velocity and use the dot product to adjust the x-component.

enter image description here

  • \$\begingroup\$ Sorry, im an amateur, i couldn't understand a word you said :( but it seems that youre trying to tell me how to calculate the distance from the canter of the paddle to the ball, but i've done that (transform.position.x - paddle.position.x). I just need the distance on the x axis \$\endgroup\$ Mar 5 '16 at 18:35
  • \$\begingroup\$ @MateuszSowiński, this uses the same vector, but not the length. This compares the ball<>paddle angle (cyan) to the paddle's "right" (red). This calculation will produce -1 on the left edge of the paddle, 0 in the middle, and +1 on the right edge. You can scale that by some factor and then add it directly to velocity.x. \$\endgroup\$
    – Jon
    Mar 5 '16 at 22:55
  • \$\begingroup\$ Yes i'm aware of that but what i'm trying to do is actually change the x velocity but leave the magnitude so i would need to decrease the y velocity. I'm still figuring how to do that using phitagorean therom, and i think im close \$\endgroup\$ Mar 6 '16 at 0:07
  • \$\begingroup\$ @MateuszSowiński, you can normalize the modified velocity vector, making its' magnitude 1.0f. Then, multiply that unit-vector by the desired magnitude. \$\endgroup\$
    – Jon
    Mar 6 '16 at 3:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.