- Home /
Move an object in a specific angle
I'm making a simple 2d brick breaker game, I have a paddle, a ball and some bricks. The ball hits the paddle in certain angle and physics determine the angle the ball should bounce back, but what I want to do, is set up the paddle to give certain angle to the ball depending on tg he part of the paddle the ball hit. in the picture attached I show the angle I want the ball to bounce off the paddle depending on the part of the paddle the ball hit (fig 1). In fig 2 the lines represent the normal behaviour of the ball bouncing off the paddle, and the dashed line represents what I want to achieve. in fig 3 I show the same principle but this time reshaping the paddle's collider. Still not what I want. I thought about giving the ball certain angle of bounce regardless of the angle it had before it hit the paddle, but can't figure a way to do this, specially detecting what part of the paddle the ball hit. Thanks in advance.
Answer by troien · Nov 30, 2017 at 08:38 PM
To do this, I would calculate an angle based on the distance we hit from the center. To do that:
To calculate an angle, we need the following information.
a: the x/y position of the center of the pad
b: The x/y point of the hit (i.e. where the ball hit the pad)
c: the width of the pad / 2 (i.e. half the pads width)
maxAngle: the angle at which the ball should go out if it hits the far right of the pad.
Then
float delta = b.x - a.x;
float percentage = delta / c; // value between -1 and 1
float angle = percentage * maxAngle;
The output of this would be an angle between -maxAngle at the far left and maxAngle at the far right. (so an angle of 0 is straight up at the center of the pad)
To get the point the ball hit, you could use OnCollisionEnter and the given contacts (which is usually just 1 point). (or OnCollisionEnter2D)
Answer by Buckslice · Nov 30, 2017 at 08:49 PM
Something like this might work. Basically when the ball hits paddle check the collision point and send it in a direction away from the paddles center going through that point.
Rigidbody rb; // balls rigidbody
// in the ball script
void OnCollisionEnter(Collision collision) {
if (collision.gameObject.CompareTag("Paddle")) {
// assuming paddles position is at center
Vector3 paddleCenter = collision.collider.transform.position;
// get first contact point
Vector3 point = collision.contacts[0].point;
rb.velocity = (point - paddleCenter).normalized * rb.velocity.magnitude;
}
}