- Home /
Jumping doesn't work properly everytime
Hi! I'm trying to make my character jump using a rigidbody component, but sometimes the jump works and sometimes it doesn't, in a few cases the character will perform a very very small jump for some reason which I don't know why. I used the update section to grab the input from the player and the fixed update to apply the force, but I'm probably still missing something.
Here's a gif showing the issue in action: https://i.imgur.com/Nq6Pd1w.gif
And here's the code I'm using to control my character:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewPlayerController : MonoBehaviour
{
[SerializeField]
float moveSpeed = 10f;
Vector3 newPosition;
Vector3 movementVector;
Rigidbody rb;
[SerializeField]
float remainingJumps = 1f;
bool executeJump = false;
private void Start()
{
//get object rigidbody reference
rb = gameObject.GetComponent<Rigidbody>();
}
private void Update()
{
//update axis
float vAxis = Input.GetAxis("Vertical");
float hAxis = Input.GetAxis("Horizontal");
//update vectors
newPosition = new Vector3(hAxis, 0.0f, vAxis);
movementVector = new Vector3(hAxis * moveSpeed, rb.velocity.y, vAxis * moveSpeed);
//look at movement direction
transform.LookAt(newPosition + transform.position);
//ignore this
//transform.Translate(newPosition * moveSpeed * Time.deltaTime, Space.World);
if(Input.GetButtonDown("Jump") && remainingJumps > 0)
{
remainingJumps = remainingJumps - 1;
executeJump = true;
}
}
private void FixedUpdate()
{
rb.velocity = movementVector;
if(executeJump)
{
executeJump = false;
rb.velocity = new Vector3(rb.velocity.x, 0, rb.velocity.z);
rb.AddForce(new Vector3(0, 10, 0), ForceMode.Impulse);
}
}
}
The documentations say you should not alter Rigidbody.velocity directly, it can cause issues. The usual approach is to apply forces to the Rigidbody rather than accessing the velocity field. If you need an instantaneous force, you can use Force$$anonymous$$ode.Impulse, just like you did at the jump.
Following the documentations, it says that Input should go to Update, and Rigidbody movement should go to FixedUpdate. So i suggest using Rigidbody.AddForce(movementVector) with the y being 0 at the start of FixedUpdate.
Keep in $$anonymous$$d that i tried to strictly follow Unity Docs here, but you can make it work with Update too (just don't forget to multiply with Time.deltaTime, otherwise high FPS will cause faster movement).
Your answer