thathurtabit
thathurtabit

Reputation: 608

Unity: RigidBody2D, how to move GameObject in straight lines (no curves)

Unity movement in straight lines

Hello all, I'm very new to and very confused by Unity.

I'm creating a top-down, gravity-free test game, similar to PacMan (i.e. think of the movement of characters in straight lines).

Currently, I'm trying to move an object in straight lines (without curvature) (see image).

My GameObject has RigidBody2D attached, as well as Linear, Angular and Gravity set to 0.

I'm currently controlling my GameObject by adding force:

private Rigidbody2D _playerRB2D;
public float _speed;

private void FixedUpdate()
{
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");
    Vector2 movement = new Vector2(moveHorizontal, moveVertical);

    _playerRB2D.AddForce(movement * _speed);
}

The idea is that the game object won't get to slow down, so is constantly in motion (in straight lines). Collision with objects is obviously important too!

Any help or information to look at will help a lot, thank you!

Upvotes: 1

Views: 2124

Answers (2)

LilianSchall
LilianSchall

Reputation: 11

The idea is basically to reset the force being applied on the rigidBody2D on each changed direction. In fact, you would have to test if the direction input from horizontal is greater than vertical for x axis, and the inverse for y axis , and thus if it is true, change the opposite to 0f. You would have normally:

Vector2 movement = new Vector2(moveHorizontal < moveVertical ? moveHorizontal: 0f, moveVertical < moveHorizontal ? moveVertical: 0f);
_playerRB2D.velocity = movement * speed;

Edit: By testing the input value, you can move your RigidBody2D with a analogic controller, and thus being straight as you wished !

Upvotes: 1

R Astra
R Astra

Reputation: 469

Unity has a built-in physics engine that calculates movement based on velocity (and collisions, etc.) By using Rigidbody2D.AddForce, you are adding to your rigidbody's velocity. This means that if you press the up arrow and then the right arrow, the velocity from pressing the up arrow remains, causing a diagonal velocity and curved path. If you want straight lines, you can use Rigidbody2D.velocity or just use Transform.translate.

_playerRB2D.velocity = movement * _speed;

Edit: You said that collisions were important, so keep the rigidbody

or remove the rigidbody2D component and use

transform.Translate(movement * _speed);

Upvotes: 1

Related Questions