- Home /
Why does my character jump higher sometimes?
I have two ways to control the jump of my character. One is using the "up" key and the otherone is clicking in a button i have in a canvas. With the first one the bug doesn't show up but with the second it does. I dont know why. It just jumps higher like if it was doing a double or a triple jump. This bug ocurs when jumping and colliding with a wall but sometimes it just happens when jumping from the normal ground.
My code:
 public class NinjaController : MonoBehaviour
 {
     public static NinjaController ninja;
     public bool canJump=true;
     public int points;
     private bool stopped=false, afterJump=true;
     private float prevJumpY;
     void Start()
     {
         points = 0;
         ninja = this;
     }
     // Update is called once per frame
     void Update()
     {
         if((afterJump&&(transform.position.y-prevJumpY)>0.185f)||transform.position.y<=prevJumpY) //Stops "going forward force" until reaches certain high
         {
             afterJump = false;
             stopped = false;
             prevJumpY = -999999999;
         }
         if(!stopped)
         {
             gameObject.GetComponent<Animator>().SetBool("Stopped", false);
             gameObject.transform.Translate(1.5f * Time.deltaTime, 0, 0);
         }else
         { 
             gameObject.GetComponent<Animator>().SetBool("Stopped", true);
         }
             
         Quaternion rotation = new Quaternion();
         gameObject.transform.rotation = rotation;
         
         if (canJump&&Input.GetKeyDown("up")) //Using this the bug doesn't show up
         {
             jump();
         }
     }
     private void OnCollisionEnter2D(Collision2D collision)
     {
         if (collision.transform.tag == "Ground")
         {
             canJump = true;
         }
         if(collision.transform.tag=="Wall")
         {
             canJump = true;
             stopped = true;
         }
         if(collision.transform.tag=="Top")
         {
             canJump = false;
         }
         if (collision.transform.tag == "Lava")
         {
             if (PlayerPrefs.HasKey("HighScore"))
             {
                 if(PlayerPrefs.GetInt("HighScore") <points)
                 {
                     PlayerPrefs.SetInt("HighScore", points);
                 }
             }
             else
             {
                 PlayerPrefs.SetInt("HighScore", points);
             }
             SceneManager.LoadScene("MainMenu");
             Destroy(gameObject);
         }
         if (collision.transform.tag == "Coin")
             points++;
     }
     public void jump()
     {
         prevJumpY = transform.position.y;
         canJump = false;
         afterJump = true;
         gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 395));
     }
 
     public Vector3 CameraFollower()
     {
         Vector3 pos = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, -10);
         return pos;
     }
     public Vector3 whereIsPlayerFull()
     {
         
         return gameObject.transform.position;
     }
 }
 
The button code:
 public class JumpButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
 {
     private bool pressed = false;
     private void Update()
     {
         if (NinjaController.ninja != null)
             if (NinjaController.ninja.canJump && pressed)
             {
                 NinjaController.ninja.jump();
             }
     }
     public void OnPointerDown(PointerEventData eventData)
     {
         pressed = true;
     }
 
     public void OnPointerUp(PointerEventData eventData)
     {
         pressed = false;
     }
 
 }
 
Answer by kylecat6330 · Jul 03, 2020 at 03:24 PM
I have had a similar issue at one point or another. The best way I found to fix it is to clamp the y velocity.
Add a Debug.Log(gameObject.GetComponent<Rigidbody2D>().velocity.y); to your script so that you can determine what the velocity should be versus the velocity when it bugs. Decide on what you want your maximum y velocity to be and then add this to the end of your update function.
 gameObject.GetComponent<Rigidbody2D>().velocity = new Vector2(gameObject.GetComponent<Rigidbody2D>().velocity.x, Mathf.Clamp(gameObject.GetComponent<Rigidbody2D>().velocity.y, -MaxVelocity, MaxVelocity));
Your answer
 
 
             Follow this Question
Related Questions
Programmatically add rigidbody2d 2 Answers
How can I make two objects with rigid bodies that won't displace each other? 2 Answers
How to create a solid object in the canvas? 0 Answers
rigidbody2D : X velocity is slowed down when I jump. 1 Answer
How can I increase or decrease jump speed while keeping the jump arc the same? 1 Answer
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                