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

``````

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)
}
}
``````