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 =;
	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 =;

		//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);

		//Add velocity change
		rig.AddForce(velocityChange, ForceMode.VelocityChange);

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

		//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.