Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by SoshJam · Apr 05, 2019 at 11:23 PM · c#playerrigidbody2dmathplayer movement

Player rapidly accelerating instead of stopping

I am creating a 2D platformer and right now I have just the basics. I am relying on the built-in physics engine to move my player, but I've encountered a problem. Basically, you use the arrow keys to move left and right and Shift to run, and that works fine if you stop running before you stop moving. However if you let go of the arrow key before letting go of shift, the player will rapidly accelerate toward whichever direction you'd been moving in. Why is this happening?

Here's my code:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class PlayerController : MonoBehaviour {
 
     // declare variables
     public float walkSpeed, maxRunMultiplier, accelerationSpeed, deccelerationSpeed, jumpPower, wallJumpPower; // speed and stuff of things
     ...
     public float runMultiplier = 1; // for running
     bool running;
 
     Transform groundCheck, faceCheck, ceilingCheck;
     Animator anim;
     Rigidbody2D rig;
     Vector2 movementInput;
 
     void Start()
     {
         ...
     }
 
     void Update()
     {
         // get input
         GetInput();
 
         ...
 
         // assign new velocity
         Vector2 newVelocity = Vector2.zero;
         Vector2 curVelocity = rig.velocity; // for shorthand
 
         // left and right movement
         if (movementInput.x > 0.1f)
         {
             if (curVelocity.x <= walkSpeed)
             {
                 newVelocity.x = curVelocity.x + accelerationSpeed;
             }
             else
             {
                 newVelocity.x = walkSpeed;
             }
         }
         else if (movementInput.x < -0.1f)
         {
             if(curVelocity.x >= -walkSpeed)
             {
                 newVelocity.x = curVelocity.x - accelerationSpeed;
             }
             else
             {
                 newVelocity.x = -walkSpeed;
             }
         }
         else
         {
             if(curVelocity.x >= deccelerationSpeed)
             {
                 newVelocity.x = curVelocity.x - deccelerationSpeed;
             }
             else if (curVelocity.x <= -deccelerationSpeed)
             {
                 newVelocity.x = curVelocity.x + deccelerationSpeed;
             }
             else
             {
                 newVelocity.x = 0;
             }
         }
 
         newVelocity.x *= runMultiplier;
 
     ...
 
     // get input
     void GetInput()
     {
         // horizontal
         if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
         {
             if(!Input.GetKey(KeyCode.D) && !Input.GetKey(KeyCode.RightArrow))
             {
                 movementInput.x = -1;
             }
             else
             {
                 movementInput.x = 0;
             }
         }
         else if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
         {
             if (!Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.LeftArrow))
             {
                 movementInput.x = 1;
             }
             else
             {
                 movementInput.x = 0;
             }
         }
         else
         {
             movementInput.x = 0;
         }
 
         // run test
         if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
         {
             runMultiplier = maxRunMultiplier;
         }
         else
         {
             runMultiplier = 1;
         }
     }
 }
 

What's wrong with it? I'm guessing it has something to do with multiplying by the runVelocity, but I don't know.


UPDATE 1: I made it only multiply if the movementInput.x wasn't zero, and that sort of worked, but now if you hold shift, run in one direction, and run in the other as you let go of the first direction it still happens, accelerating you in the direction of the first direction. The code above changed from:

 newVelocity.x *= runMultiplier;

To this:

 if (movementInput.x < -0.5f || movementInput.x > 0.5f)
 {
     newVelocity.x *= runMultiplier;
 }

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
1
Best Answer

Answer by ShujoSLX · Apr 05, 2019 at 11:40 PM

i think you should use newVelocity.x = runMultiplier. What you are doing is multiplying the newVelocity with multiplier EVERY frame.

If newvelocity = 1 and run multiplier = 2. Eachframe it is going to do:

f1 - newvelocity = 1 * 2 = 2

f2 - newvelocity = 2 * 2 = 4

f3 - newvelocity = 4 * 2 = 8

...

Its accelerating because its exponential, you are forgetting the fact that everything on that function runs on every frame, So each frame the multiplication happens with the value of the product of the last frame.

The most simple solution is to no use multipliers in my opinion. Just assign values, so it assigns the same value all frames and it is only dependant of your bools. You can use differente values and do something like newVelocity = multiplier * baseVelocity, that would also keep it the same everyframe. It depends on what you need in the future on how to handle it, but is simple. Hope it helps.

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image SoshJam · Apr 05, 2019 at 11:55 PM 0
Share

But I set it to Vector2.zero at the very beginning of each frame though, so it would actually be like this:
walkspeed = 1 and runmultiplier = 2
f1 - newvelocity = 0, newvelocity = walkspeed = 1, newvelocity = walkspeed 2 = 2
f2 - newvelocity = 0, newvelocity = walkspeed = 1, newvelocity = walkspeed
2 = 2
f3 - newvelocity = 0, newvelocity = walkspeed = 1, newvelocity = walkspeed * 2 = 2
...
Wouldn't it?

avatar image SoshJam · Apr 06, 2019 at 02:16 PM 0
Share

Nevertheless, I tried it anyway and it worked like a charm. Thanks!

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

613 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Scripted Boundaries Not Working Correctly 0 Answers

I can't use Rigidbody2D in my scripts, I can't find rigidbody2d in my script 3 Answers

Why my character moves left when i press right key ? Controls are upside down? 2 Answers

Player hanging on objects. 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges