Ace
Ace

Reputation: 123

Unity 2D: Rigidbody2D 'addforce' works vertically but not horizontally?

EDIT! So I loaded up a FRESH PROJECT, created a circle and added my script to it. When I hit start the circle launches off at a 45 degree angle, it works perfectly fine. I also tried adding a horizontal addforce on another object in my original project and it resulted in a jittery teleport to the right.

Something is broken inside my project related to horizontal force... What could it be?!

This has driven me and a bud mad for 24 hours now and I've searched high and low but have not found any similar problems or applicable solutions.

I'm developing a mario-style side scroller game and the concept is simple: Hit the box, a coin pops out with vertical and horizontal force. This is the ONLY code so far in the script attached to the coin.

void Start()
{
 forceUp = new Vector2(0, upForce);
 forceSide = new Vector2(sideForce, 0);
 GetComponent<Rigidbody2D>().AddForce(forceUp, ForceMode2D.Impulse);
 GetComponent<Rigidbody2D>().AddForce(forceSide, ForceMode2D.Impulse);
}

This is the code that instantiates the coin in the box script:

private void OnCollisionEnter2D(Collision2D collision)
 
{
 RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 1.0f, layerMask);
 
 if (!isOpen && hit.collider != null)
 {
     isOpened();
     Instantiate(openPrize, new Vector3(transform.position.x, transform.position.y+1.0f, transform.position.z), transform.rotation);
 }
}

problem is: The coin will pop "up" a distance directly related to the value I plug into the "up force" variable.

The coin will not move horizontally at all. If I jack the horizontal variable up to some stupid number like 5000, it will teleport a short distance to the side.

the animator of the prefab has "Apply root motion" enabled.

Upvotes: 1

Views: 1319

Answers (2)

Ace
Ace

Reputation: 123

I figured it out... There is a setting in the animator of the prefab im using called "Apply root motion". I have never used it, dunno what it does but it was checked by default in the asset i imported and that was somehow stopping the movement. Thanks for your help!

Upvotes: 2

m123
m123

Reputation: 3152

I think your forcemode is probably not right.

Docs:

Apply the impulse force instantly. [...] This mode is useful for applying forces that happen instantly, such as forces from explosions or collisions.

Probabaly ForceMode2D.Force is better.

This mode is useful for setting up realistic physics where it takes more force to move heavier objects.

But maybe it's because you apply to forces at once. Try this:

// Force up
await Task.Delay(TimeSpan.FromSeconds(1));
// Force side

Upvotes: 0

Related Questions