How to move the player while also allowing forces to affect itCorrectly Implementing a “Double Jump”How do I move a 2D top-down racing camera smoothly and show what's ahead of the player?Move a player in the opposite direction they are lookingCan not seem to adjust the speed of my CarHow can I handle multiple force in Unity?Constant orbit using Rigidbody in UnityHow am I supposed to timestep this gravitational simulatorImplementing acceleration in topdown 2d gameMove Camera After Player Moves Certain DistanceControlling a thrustered 2D space ship with angular rotation and max speed

Sort in WP_Query(), not filter? Is it possible?

aging parents with no investments

DOS, create pipe for stdin/stdout of command.com(or 4dos.com) in C or Batch?

OA final episode explanation

Does the average primeness of natural numbers tend to zero?

Can I interfere when another PC is about to be attacked?

Is it legal to have the "// (c) 2019 John Smith" header in all files when there are hundreds of contributors?

Can you lasso down a wizard who is using the Levitate spell?

Why do we use polarized capacitors?

What are the advantages and disadvantages of running one shots compared to campaigns?

Shall I use personal or official e-mail account when registering to external websites for work purpose?

How to deal with fear of taking dependencies

My colleague's body is amazing

I’m planning on buying a laser printer but concerned about the life cycle of toner in the machine

Finding files for which a command fails

I see my dog run

Add an angle to a sphere

Symmetry in quantum mechanics

"listening to me about as much as you're listening to this pole here"

Is it possible to make sharp wind that can cut stuff from afar?

How to handle columns with categorical data and many unique values

I am not able to install anything in ubuntu

Why was the "bread communication" in the arena of Catching Fire left out in the movie?

How to move the player while also allowing forces to affect it



How to move the player while also allowing forces to affect it


Correctly Implementing a “Double Jump”How do I move a 2D top-down racing camera smoothly and show what's ahead of the player?Move a player in the opposite direction they are lookingCan not seem to adjust the speed of my CarHow can I handle multiple force in Unity?Constant orbit using Rigidbody in UnityHow am I supposed to timestep this gravitational simulatorImplementing acceleration in topdown 2d gameMove Camera After Player Moves Certain DistanceControlling a thrustered 2D space ship with angular rotation and max speed






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








2












$begingroup$


For now, that's how I move the player:



rb.velocity = Vector2.right * input.x;


And I affect him a force while he is damaged by an entity:



rb.AddForce(Vector2.right * force);


It works fine, until I try to move while I'm damaged by an entity.
Since my velocity = input.x while I move, I can't affect any forces to it.
I've tried to summarize velocity:



rb.velocity+=Vector2.right * input.x;


But then I need to clamp the speed and if I clamp it, my force which is affected to player is also clamped.



How can I resolve this problem?










share|improve this question











$endgroup$


















    2












    $begingroup$


    For now, that's how I move the player:



    rb.velocity = Vector2.right * input.x;


    And I affect him a force while he is damaged by an entity:



    rb.AddForce(Vector2.right * force);


    It works fine, until I try to move while I'm damaged by an entity.
    Since my velocity = input.x while I move, I can't affect any forces to it.
    I've tried to summarize velocity:



    rb.velocity+=Vector2.right * input.x;


    But then I need to clamp the speed and if I clamp it, my force which is affected to player is also clamped.



    How can I resolve this problem?










    share|improve this question











    $endgroup$














      2












      2








      2





      $begingroup$


      For now, that's how I move the player:



      rb.velocity = Vector2.right * input.x;


      And I affect him a force while he is damaged by an entity:



      rb.AddForce(Vector2.right * force);


      It works fine, until I try to move while I'm damaged by an entity.
      Since my velocity = input.x while I move, I can't affect any forces to it.
      I've tried to summarize velocity:



      rb.velocity+=Vector2.right * input.x;


      But then I need to clamp the speed and if I clamp it, my force which is affected to player is also clamped.



      How can I resolve this problem?










      share|improve this question











      $endgroup$




      For now, that's how I move the player:



      rb.velocity = Vector2.right * input.x;


      And I affect him a force while he is damaged by an entity:



      rb.AddForce(Vector2.right * force);


      It works fine, until I try to move while I'm damaged by an entity.
      Since my velocity = input.x while I move, I can't affect any forces to it.
      I've tried to summarize velocity:



      rb.velocity+=Vector2.right * input.x;


      But then I need to clamp the speed and if I clamp it, my force which is affected to player is also clamped.



      How can I resolve this problem?







      unity 2d physics rigidbody






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 1 hour ago









      Alex Myers

      343110




      343110










      asked 1 hour ago









      Basea BasiliaBasea Basilia

      275




      275




















          3 Answers
          3






          active

          oldest

          votes


















          1












          $begingroup$

          You're on the right track! This is something that usually the controller is responsible for. When you jump in a platformer you use a "isGrounded" variable to change how the controls behave while in the air right? You need a similar state for isKnockback. In most games when a player is knocked back, they have control striped from them for a certain amount of time. That or you treat it like being airborn where instead of setting velocity it will just apply a force to adjust the velocity. How you want to implement that control is a design choice, but there is no real physics based answer. The true physics based answer is implementing locomotion in the character's legs and that's not really useful for game physics. Another solution could be instead of applying a force, is to work with knockback at a velocity level like your movement. Apply a velocity, and reduce it by some amount each fixed update to simulate a knockback like effect. This is another common solution in the industry.






          share|improve this answer









          $endgroup$












          • $begingroup$
            Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
            $endgroup$
            – Basea Basilia
            1 hour ago










          • $begingroup$
            Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
            $endgroup$
            – gjh33
            51 mins ago


















          1












          $begingroup$

          I created a little demo game a few days ago which demonstrates different ways to move a player-character. It might help you to better understand which way of moving is the right one for your particular game.



          In general, you should use rigidbody.AddForce whenever feasible. It automatically takes care of managing multiple overlapping forces and ensures that the transfer of momentum on collisions is physically correct.



          If you don't want your character to be able to accelerate indefinitely, increase the "Linear Drag" value of the rigidbody. The drag force increases quadratically with the velocity, so at some point it will cancel out the acceleration and effectively limit the maximum speed. A larger drag value will result in shorter acceleration and deceleration times, making the controls feel more "tight", but also greatly limit the effect of collisions.



          If you want the character to have tight controls but also be affected by collisions, you could handle this the way the answer by gjh33 suggests. Have two different states in your player-controller. A regular state where the rigidbody has high drag and the player has full control force, and a "just got hit" state where you reduce the drag and the control force temporarily in order to make the character fly around in a temporary state of uncontrolled helplessness.



          I am looking forward to playing your game.






          share|improve this answer











          $endgroup$




















            0












            $begingroup$

            Myself, I like to solve this by thinking of all player movement as acceleration-based.



            I choose a target velocity using whatever complicated control logic I like, then ask the player avatar to accelerate toward that target, while respecting maximum acceleration rates I set.



            Then, depending on the avatar's state (on ground, on ice, in the air, in a knockback state), I can change those acceleration rates to make the control input have a sharper or less pronounced impact.



            Rigidbody2D body;

            void AccelerateTowards(Vector2 targetVelocity, float maxAccel, float maxDecel)

            var velocity = body.velocity;
            var deltaV = targetVelocity - velocity;

            // For best consistency, call this in FixedUpdate,
            // and deltaTime will automatically give fixedDeltaTime.
            var accel = deltaV / Time.deltaTime;
            var limit = Dot(deltaV, velocity) > 0f ? maxAccel : maxDecel;

            var force = body.mass * Vector2.ClampMagnitude(accel, limit);

            body.AddForce(force, ForceMode2D.Force);



            Separating acceleration & deceleration rates like this lets me give a sharper braking force, which tends to help the controls feel tight & responsive when stopping or changing directions, while keeping a smooth acceleration for getting up to speed. It also lets you penalize braking specifically when on ice or being knocked back.



            We can make a control state parameters object to hold the max speed, acceleration, and deceleration rates for our air, ground, ice, knockback states etc. and use this to adjust our control handling very flexibly:



            var controlState = GetCurrentControlState();

            var velocity = GetDesiredVelocityFromInput(controlState.maxSpeed);

            AccelerateTowards(
            velocity,
            controlState.maxAccel,
            controlState.maxDecel
            );





            share|improve this answer











            $endgroup$













              Your Answer





              StackExchange.ifUsing("editor", function ()
              return StackExchange.using("mathjaxEditing", function ()
              StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
              StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
              );
              );
              , "mathjax-editing");

              StackExchange.ifUsing("editor", function ()
              StackExchange.using("externalEditor", function ()
              StackExchange.using("snippets", function ()
              StackExchange.snippets.init();
              );
              );
              , "code-snippets");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "53"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgamedev.stackexchange.com%2fquestions%2f169839%2fhow-to-move-the-player-while-also-allowing-forces-to-affect-it%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1












              $begingroup$

              You're on the right track! This is something that usually the controller is responsible for. When you jump in a platformer you use a "isGrounded" variable to change how the controls behave while in the air right? You need a similar state for isKnockback. In most games when a player is knocked back, they have control striped from them for a certain amount of time. That or you treat it like being airborn where instead of setting velocity it will just apply a force to adjust the velocity. How you want to implement that control is a design choice, but there is no real physics based answer. The true physics based answer is implementing locomotion in the character's legs and that's not really useful for game physics. Another solution could be instead of applying a force, is to work with knockback at a velocity level like your movement. Apply a velocity, and reduce it by some amount each fixed update to simulate a knockback like effect. This is another common solution in the industry.






              share|improve this answer









              $endgroup$












              • $begingroup$
                Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
                $endgroup$
                – Basea Basilia
                1 hour ago










              • $begingroup$
                Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
                $endgroup$
                – gjh33
                51 mins ago















              1












              $begingroup$

              You're on the right track! This is something that usually the controller is responsible for. When you jump in a platformer you use a "isGrounded" variable to change how the controls behave while in the air right? You need a similar state for isKnockback. In most games when a player is knocked back, they have control striped from them for a certain amount of time. That or you treat it like being airborn where instead of setting velocity it will just apply a force to adjust the velocity. How you want to implement that control is a design choice, but there is no real physics based answer. The true physics based answer is implementing locomotion in the character's legs and that's not really useful for game physics. Another solution could be instead of applying a force, is to work with knockback at a velocity level like your movement. Apply a velocity, and reduce it by some amount each fixed update to simulate a knockback like effect. This is another common solution in the industry.






              share|improve this answer









              $endgroup$












              • $begingroup$
                Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
                $endgroup$
                – Basea Basilia
                1 hour ago










              • $begingroup$
                Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
                $endgroup$
                – gjh33
                51 mins ago













              1












              1








              1





              $begingroup$

              You're on the right track! This is something that usually the controller is responsible for. When you jump in a platformer you use a "isGrounded" variable to change how the controls behave while in the air right? You need a similar state for isKnockback. In most games when a player is knocked back, they have control striped from them for a certain amount of time. That or you treat it like being airborn where instead of setting velocity it will just apply a force to adjust the velocity. How you want to implement that control is a design choice, but there is no real physics based answer. The true physics based answer is implementing locomotion in the character's legs and that's not really useful for game physics. Another solution could be instead of applying a force, is to work with knockback at a velocity level like your movement. Apply a velocity, and reduce it by some amount each fixed update to simulate a knockback like effect. This is another common solution in the industry.






              share|improve this answer









              $endgroup$



              You're on the right track! This is something that usually the controller is responsible for. When you jump in a platformer you use a "isGrounded" variable to change how the controls behave while in the air right? You need a similar state for isKnockback. In most games when a player is knocked back, they have control striped from them for a certain amount of time. That or you treat it like being airborn where instead of setting velocity it will just apply a force to adjust the velocity. How you want to implement that control is a design choice, but there is no real physics based answer. The true physics based answer is implementing locomotion in the character's legs and that's not really useful for game physics. Another solution could be instead of applying a force, is to work with knockback at a velocity level like your movement. Apply a velocity, and reduce it by some amount each fixed update to simulate a knockback like effect. This is another common solution in the industry.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered 1 hour ago









              gjh33gjh33

              2064




              2064











              • $begingroup$
                Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
                $endgroup$
                – Basea Basilia
                1 hour ago










              • $begingroup$
                Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
                $endgroup$
                – gjh33
                51 mins ago
















              • $begingroup$
                Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
                $endgroup$
                – Basea Basilia
                1 hour ago










              • $begingroup$
                Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
                $endgroup$
                – gjh33
                51 mins ago















              $begingroup$
              Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
              $endgroup$
              – Basea Basilia
              1 hour ago




              $begingroup$
              Thank you, it's done by check true isKnockback when force is applied and check false when player will collide with ground next time, it works very fine
              $endgroup$
              – Basea Basilia
              1 hour ago












              $begingroup$
              Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
              $endgroup$
              – gjh33
              51 mins ago




              $begingroup$
              Glad to hear it. In general don't be afraid to fake physics in your games. Lots of engines have these awesome realistic physics, but in many game scenarios people just end up faking most of it :)
              $endgroup$
              – gjh33
              51 mins ago













              1












              $begingroup$

              I created a little demo game a few days ago which demonstrates different ways to move a player-character. It might help you to better understand which way of moving is the right one for your particular game.



              In general, you should use rigidbody.AddForce whenever feasible. It automatically takes care of managing multiple overlapping forces and ensures that the transfer of momentum on collisions is physically correct.



              If you don't want your character to be able to accelerate indefinitely, increase the "Linear Drag" value of the rigidbody. The drag force increases quadratically with the velocity, so at some point it will cancel out the acceleration and effectively limit the maximum speed. A larger drag value will result in shorter acceleration and deceleration times, making the controls feel more "tight", but also greatly limit the effect of collisions.



              If you want the character to have tight controls but also be affected by collisions, you could handle this the way the answer by gjh33 suggests. Have two different states in your player-controller. A regular state where the rigidbody has high drag and the player has full control force, and a "just got hit" state where you reduce the drag and the control force temporarily in order to make the character fly around in a temporary state of uncontrolled helplessness.



              I am looking forward to playing your game.






              share|improve this answer











              $endgroup$

















                1












                $begingroup$

                I created a little demo game a few days ago which demonstrates different ways to move a player-character. It might help you to better understand which way of moving is the right one for your particular game.



                In general, you should use rigidbody.AddForce whenever feasible. It automatically takes care of managing multiple overlapping forces and ensures that the transfer of momentum on collisions is physically correct.



                If you don't want your character to be able to accelerate indefinitely, increase the "Linear Drag" value of the rigidbody. The drag force increases quadratically with the velocity, so at some point it will cancel out the acceleration and effectively limit the maximum speed. A larger drag value will result in shorter acceleration and deceleration times, making the controls feel more "tight", but also greatly limit the effect of collisions.



                If you want the character to have tight controls but also be affected by collisions, you could handle this the way the answer by gjh33 suggests. Have two different states in your player-controller. A regular state where the rigidbody has high drag and the player has full control force, and a "just got hit" state where you reduce the drag and the control force temporarily in order to make the character fly around in a temporary state of uncontrolled helplessness.



                I am looking forward to playing your game.






                share|improve this answer











                $endgroup$















                  1












                  1








                  1





                  $begingroup$

                  I created a little demo game a few days ago which demonstrates different ways to move a player-character. It might help you to better understand which way of moving is the right one for your particular game.



                  In general, you should use rigidbody.AddForce whenever feasible. It automatically takes care of managing multiple overlapping forces and ensures that the transfer of momentum on collisions is physically correct.



                  If you don't want your character to be able to accelerate indefinitely, increase the "Linear Drag" value of the rigidbody. The drag force increases quadratically with the velocity, so at some point it will cancel out the acceleration and effectively limit the maximum speed. A larger drag value will result in shorter acceleration and deceleration times, making the controls feel more "tight", but also greatly limit the effect of collisions.



                  If you want the character to have tight controls but also be affected by collisions, you could handle this the way the answer by gjh33 suggests. Have two different states in your player-controller. A regular state where the rigidbody has high drag and the player has full control force, and a "just got hit" state where you reduce the drag and the control force temporarily in order to make the character fly around in a temporary state of uncontrolled helplessness.



                  I am looking forward to playing your game.






                  share|improve this answer











                  $endgroup$



                  I created a little demo game a few days ago which demonstrates different ways to move a player-character. It might help you to better understand which way of moving is the right one for your particular game.



                  In general, you should use rigidbody.AddForce whenever feasible. It automatically takes care of managing multiple overlapping forces and ensures that the transfer of momentum on collisions is physically correct.



                  If you don't want your character to be able to accelerate indefinitely, increase the "Linear Drag" value of the rigidbody. The drag force increases quadratically with the velocity, so at some point it will cancel out the acceleration and effectively limit the maximum speed. A larger drag value will result in shorter acceleration and deceleration times, making the controls feel more "tight", but also greatly limit the effect of collisions.



                  If you want the character to have tight controls but also be affected by collisions, you could handle this the way the answer by gjh33 suggests. Have two different states in your player-controller. A regular state where the rigidbody has high drag and the player has full control force, and a "just got hit" state where you reduce the drag and the control force temporarily in order to make the character fly around in a temporary state of uncontrolled helplessness.



                  I am looking forward to playing your game.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 20 mins ago

























                  answered 50 mins ago









                  PhilippPhilipp

                  81.8k19193243




                  81.8k19193243





















                      0












                      $begingroup$

                      Myself, I like to solve this by thinking of all player movement as acceleration-based.



                      I choose a target velocity using whatever complicated control logic I like, then ask the player avatar to accelerate toward that target, while respecting maximum acceleration rates I set.



                      Then, depending on the avatar's state (on ground, on ice, in the air, in a knockback state), I can change those acceleration rates to make the control input have a sharper or less pronounced impact.



                      Rigidbody2D body;

                      void AccelerateTowards(Vector2 targetVelocity, float maxAccel, float maxDecel)

                      var velocity = body.velocity;
                      var deltaV = targetVelocity - velocity;

                      // For best consistency, call this in FixedUpdate,
                      // and deltaTime will automatically give fixedDeltaTime.
                      var accel = deltaV / Time.deltaTime;
                      var limit = Dot(deltaV, velocity) > 0f ? maxAccel : maxDecel;

                      var force = body.mass * Vector2.ClampMagnitude(accel, limit);

                      body.AddForce(force, ForceMode2D.Force);



                      Separating acceleration & deceleration rates like this lets me give a sharper braking force, which tends to help the controls feel tight & responsive when stopping or changing directions, while keeping a smooth acceleration for getting up to speed. It also lets you penalize braking specifically when on ice or being knocked back.



                      We can make a control state parameters object to hold the max speed, acceleration, and deceleration rates for our air, ground, ice, knockback states etc. and use this to adjust our control handling very flexibly:



                      var controlState = GetCurrentControlState();

                      var velocity = GetDesiredVelocityFromInput(controlState.maxSpeed);

                      AccelerateTowards(
                      velocity,
                      controlState.maxAccel,
                      controlState.maxDecel
                      );





                      share|improve this answer











                      $endgroup$

















                        0












                        $begingroup$

                        Myself, I like to solve this by thinking of all player movement as acceleration-based.



                        I choose a target velocity using whatever complicated control logic I like, then ask the player avatar to accelerate toward that target, while respecting maximum acceleration rates I set.



                        Then, depending on the avatar's state (on ground, on ice, in the air, in a knockback state), I can change those acceleration rates to make the control input have a sharper or less pronounced impact.



                        Rigidbody2D body;

                        void AccelerateTowards(Vector2 targetVelocity, float maxAccel, float maxDecel)

                        var velocity = body.velocity;
                        var deltaV = targetVelocity - velocity;

                        // For best consistency, call this in FixedUpdate,
                        // and deltaTime will automatically give fixedDeltaTime.
                        var accel = deltaV / Time.deltaTime;
                        var limit = Dot(deltaV, velocity) > 0f ? maxAccel : maxDecel;

                        var force = body.mass * Vector2.ClampMagnitude(accel, limit);

                        body.AddForce(force, ForceMode2D.Force);



                        Separating acceleration & deceleration rates like this lets me give a sharper braking force, which tends to help the controls feel tight & responsive when stopping or changing directions, while keeping a smooth acceleration for getting up to speed. It also lets you penalize braking specifically when on ice or being knocked back.



                        We can make a control state parameters object to hold the max speed, acceleration, and deceleration rates for our air, ground, ice, knockback states etc. and use this to adjust our control handling very flexibly:



                        var controlState = GetCurrentControlState();

                        var velocity = GetDesiredVelocityFromInput(controlState.maxSpeed);

                        AccelerateTowards(
                        velocity,
                        controlState.maxAccel,
                        controlState.maxDecel
                        );





                        share|improve this answer











                        $endgroup$















                          0












                          0








                          0





                          $begingroup$

                          Myself, I like to solve this by thinking of all player movement as acceleration-based.



                          I choose a target velocity using whatever complicated control logic I like, then ask the player avatar to accelerate toward that target, while respecting maximum acceleration rates I set.



                          Then, depending on the avatar's state (on ground, on ice, in the air, in a knockback state), I can change those acceleration rates to make the control input have a sharper or less pronounced impact.



                          Rigidbody2D body;

                          void AccelerateTowards(Vector2 targetVelocity, float maxAccel, float maxDecel)

                          var velocity = body.velocity;
                          var deltaV = targetVelocity - velocity;

                          // For best consistency, call this in FixedUpdate,
                          // and deltaTime will automatically give fixedDeltaTime.
                          var accel = deltaV / Time.deltaTime;
                          var limit = Dot(deltaV, velocity) > 0f ? maxAccel : maxDecel;

                          var force = body.mass * Vector2.ClampMagnitude(accel, limit);

                          body.AddForce(force, ForceMode2D.Force);



                          Separating acceleration & deceleration rates like this lets me give a sharper braking force, which tends to help the controls feel tight & responsive when stopping or changing directions, while keeping a smooth acceleration for getting up to speed. It also lets you penalize braking specifically when on ice or being knocked back.



                          We can make a control state parameters object to hold the max speed, acceleration, and deceleration rates for our air, ground, ice, knockback states etc. and use this to adjust our control handling very flexibly:



                          var controlState = GetCurrentControlState();

                          var velocity = GetDesiredVelocityFromInput(controlState.maxSpeed);

                          AccelerateTowards(
                          velocity,
                          controlState.maxAccel,
                          controlState.maxDecel
                          );





                          share|improve this answer











                          $endgroup$



                          Myself, I like to solve this by thinking of all player movement as acceleration-based.



                          I choose a target velocity using whatever complicated control logic I like, then ask the player avatar to accelerate toward that target, while respecting maximum acceleration rates I set.



                          Then, depending on the avatar's state (on ground, on ice, in the air, in a knockback state), I can change those acceleration rates to make the control input have a sharper or less pronounced impact.



                          Rigidbody2D body;

                          void AccelerateTowards(Vector2 targetVelocity, float maxAccel, float maxDecel)

                          var velocity = body.velocity;
                          var deltaV = targetVelocity - velocity;

                          // For best consistency, call this in FixedUpdate,
                          // and deltaTime will automatically give fixedDeltaTime.
                          var accel = deltaV / Time.deltaTime;
                          var limit = Dot(deltaV, velocity) > 0f ? maxAccel : maxDecel;

                          var force = body.mass * Vector2.ClampMagnitude(accel, limit);

                          body.AddForce(force, ForceMode2D.Force);



                          Separating acceleration & deceleration rates like this lets me give a sharper braking force, which tends to help the controls feel tight & responsive when stopping or changing directions, while keeping a smooth acceleration for getting up to speed. It also lets you penalize braking specifically when on ice or being knocked back.



                          We can make a control state parameters object to hold the max speed, acceleration, and deceleration rates for our air, ground, ice, knockback states etc. and use this to adjust our control handling very flexibly:



                          var controlState = GetCurrentControlState();

                          var velocity = GetDesiredVelocityFromInput(controlState.maxSpeed);

                          AccelerateTowards(
                          velocity,
                          controlState.maxAccel,
                          controlState.maxDecel
                          );






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited 3 mins ago

























                          answered 16 mins ago









                          DMGregoryDMGregory

                          64.7k16115180




                          64.7k16115180



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Game Development Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              Use MathJax to format equations. MathJax reference.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgamedev.stackexchange.com%2fquestions%2f169839%2fhow-to-move-the-player-while-also-allowing-forces-to-affect-it%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Era Viking Índice Início da Era Viquingue | Cotidiano | Sociedade | Língua | Religião | A arte | As primeiras cidades | As viagens dos viquingues | Viquingues do Oeste e Leste | Fim da Era Viquingue | Fontes históricas | Referências Bibliografia | Ligações externas | Menu de navegação«Sverige då!»«Handel I vikingetid»«O que é Nórdico Antigo»Mito, magia e religião na volsunga saga Um olhar sobre a trajetória mítica do herói sigurd«Bonden var den verklige vikingen»«Vikingatiden»«Vikingatiden»«Vinland»«Guerreiras de Óðinn: As Valkyrjor na Mitologia Viking»1519-9053«Esculpindo símbolos e seres: A arte viking em pedras rúnicas»1679-9313Historia - Tema: VikingarnaAventura e Magia no Mundo das Sagas IslandesasEra Vikinge

                              What's the metal clinking sound at the end of credits in Avengers: Endgame?What makes Thanos so strong in Avengers: Endgame?Who is the character that appears at the end of Endgame?What happens to Mjolnir (Thor's hammer) at the end of Endgame?The People's Ages in Avengers: EndgameWhat did Nebula do in Avengers: Endgame?Messing with time in the Avengers: Endgame climaxAvengers: Endgame timelineWhat are the time-travel rules in Avengers Endgame?Why use this song in Avengers: Endgame Opening Logo Sequence?Peggy's age in Avengers Endgame

                              Are there legal definitions of ethnicities/races? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Legal definitions in the United StatesAre there truly legal limits on US interest rates?Are gender identity and sexual orientation federally protected?Why is there an apparent legal bias against digital services?What limits are there to the powers of individual judges in the United States legal system?Are women only scholarships legal under Irish / EU law?Is the term “race” defined by Public Law enacted by Congress of the United StatesIs there a legal definition of race in the US?Neighbors are spying for landlord on Renters is it legal?Are Protected Classes Bi-directional?