Simulating Fighter Jet Physics (with addForce () )

Hello,
I’m trying to create a prototype of a jet fighter game. What I want to do is to control the thrust of the plane in such a way that I know exacly how long it will take to accelerate to a certain speed.

I know that I can control the velocity manually, but I prefer to stick to the built-in physics.

public float acceleration = 40; // meters per second squared
public float topSpeed = 1500; // km per hour - The terminal velocity of the plane??

private float thrust = 0;

void Update () {
    float speed = r.velocity.magnitude * 3.6f;
    print(speed + " km/h");

    if (Input.GetKey (KeyCode.Mouse0)) {
            thrust = 1; // if left mouse button held, then accelerate
        } else if (Input.GetKey(KeyCode.Mouse1)) {
            thrust = -2; // if right mouse button held, then deccelerate
        } else {
            thrust = 0; // if no mouse button pressed, don't accelerate
        }
}

void FixedUpdate () {
    r.AddRelativeForce(0, 0, acceleration * thrust, ForceMode.Acceleration);
}

I’ve set drag to 1 to prevent the plane from accelerating forever. However, the top speed I can reach is 150 km/h. It also takes way more time that around 4 seconds (as my acceleration should make it).

How can I set the terminal velocity of the plane to something specific (eg 1,500 km/h) and the acceleration realistic?

Should I mess around with the drag and mass values? Is the value passed into addForce () something else, and not acceleration?

Code examples are welcome.

Here is my code. It’s not as nice as it could be, but I think it has everything you want (even though it’s just for a regular character in a 2d platformer):

speed = rigidBody.velocity.x;
var maxSpeed = currentMaxSpeed;    
var acc = maxSpeed;
if(!MovingRight)
	acc *= -1;
if(!moving)
	acc = 0;		
if(Mathf.Abs(speed) > maxSpeed)
	acc = 0;

var dec = 4f;
if(speed < 0)
	dec *= -1;
if(Mathf.Abs(speed) < 1)
	dec = 0;

rigidBody.AddForce(new Vector2(acc-dec, 0f), ForceMode2D.Impulse);

Thanks to @Rostam24 , I was able to put together a script for my jet. I’ll post it here in case anyone needs something similar in the future.

using UnityEngine;
using System.Collections;

public class fighterjetPhysicsControllerScript : MonoBehaviour {

    public Rigidbody r;

    public float rollRate = 70;
    public float pitchRate = 50;


    // let me input in KM/H format
    public float _topSpeed = 1500f; // km/h
    public float _myAccel = 50;     // how many KM/H my plane gains each second
    public float _startSpeed = 0;

    // use M/S format for the script
    private float topSpeed;
    private float acceleration;
    private float myAccel;
    private float startSpeed;

    private float speed;

    private float thrust = 0;  

    public float gravityConstant = 9;

    public Vector3 com = Vector3.zero;

    private float returnKmSpeed(float value) {
        return value * 3.6f; // convert from M/S to KM/H
    }

    private float returnMSpeed(float value) {
        return value * 0.27777777777778f;  // convert from KM/H to M/S
    }

    void Start() {
        r.centerOfMass = com; // set center of mass

        topSpeed = returnMSpeed(_topSpeed);
        myAccel = returnMSpeed(_myAccel);
        startSpeed = returnMSpeed(_startSpeed);

        r.AddRelativeForce(0, 0, startSpeed, ForceMode.VelocityChange); // add a start speed (eg if plane starts mission in air
    }

    void Update()
    {
        speed = r.velocity.magnitude; // get speed
        print(returnKmSpeed (speed) + " km/h"); // print speed in KM/H format
        if (Input.GetKey(KeyCode.Mouse0))
        {
            thrust = 1; // if left mouse button held, then accelerate
        }
        else if (Input.GetKey(KeyCode.Mouse1))
        {
            thrust = -2; // if right mouse button held, then deccelerate
        }
        else
        {
            thrust = 0; // if no mouse button pressed, don't accelerate
        }

        acceleration = Mathf.Clamp (acceleration + (myAccel * thrust * Time.deltaTime), 0, topSpeed); // make sure not to go faster than top speed
    }

    void FixedUpdate()
    {
        r.AddRelativeTorque(Input.GetAxis("Vertical") * pitchRate * Time.fixedDeltaTime, 0, -Input.GetAxis("Horizontal") * rollRate * Time.fixedDeltaTime, ForceMode.Acceleration); // pitch and yaw

        r.drag =  1 + (Mathf.Abs (thrust) / topSpeed); // some fancy physics to set a terminal velocity
        r.AddRelativeForce(0, 0, acceleration, ForceMode.Acceleration); // the actual physics for acceleration 

        r.AddForce(0, -gravityConstant, 0); // my own gravity (disable gravity on the rigidbody component
        r.AddRelativeForce(0, Mathf.Clamp ((speed / topSpeed) * gravityConstant * 4, 0, gravityConstant), 0); // add lift based on speed, unitl lift 
        // is the same as downward force (about 1/4 of top speed)
    }
}