# Setting time of the jump

I have this simple script that makes player jump when he starts pressing space.

For now player can jump for a certain height, the problem is as height gets longer, jump time also gets longer and that’s not what I want, I want to make that time constant, no matter what height of jump is and no matter how strong gravity force is.

There is a trick to decrease jump time by increasing gravity when player has jumped, but that makes more problems then solutions, jump height will be shorter and I don’t know how much should I increase gravity force to make the time of the jump to be a value determined by jumpTime.

Here’s the code (part of it):

``````using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

public float speed      = 1.0f;
public float jumpHeight = 1.5f;
public float jumpTime   = 1f;
public float gravity    = 10f;

Vector3 InputAxis = Vector3.zero;
Rigidbody rig;

//First frame
void Start() {

//Init rig
rig = GetComponent<Rigidbody>();

//Disable Physics.gravity on this object
rig.useGravity = false;

}

//void Update() {...} //sets the inputAxis value

//Physics frame
void FixedUpdate() {

//Initialize velocity change vector
Vector3 velocityChange = Vector3.zero;

//Calculate jump velocity
//InputAxis.y is only 1.0 when space is pressed down (GetKeyDown), otherwise it's 0.0
velocityChange.y = Mathf.Sqrt(InputAxis.y * jumpHeight * 2 * gravity);

if(velocityChange.y > 0)  //If player has jumped
rig.AddForce(0, -gravity * jumpTime, 0, ForceMode.Acceleration); //not working...
else

//Reset input axis
InputAxis.Set(0, 0, 0);

}
}
``````

After spending some time on wiki reading about uniformly accelerated motion, I found this nice formula for calculating gravity: a = (2 * s) / ( t ^ 2)

So in my case: a is gravity, s is jump height and t is jump time divided by 2.

By calculating velocity (v = sqrt(2 * a * s)) and passing it to addForce (ForceMode.VelocityChange) every time the space key is pressed down.

Using that I get quite precise results ( ± around 5% ) for jump time.

It could be more precise if I decrease fixed timestep ( bad idea ) and class that I created for counting time is totally dependent on Time.timeSinceLevelLoad (float) so perhaps that floating point precision may be a little issue in some cases.

And its important to note that the gravity calculated by this formula must be in that last AddForce (ForceMode.Acceleration) function.