How to put physics manipulation that is part of keyboards inputs inside a FixedUpdate ?

I have this code here that I put inside my Update function :

if(Input.GetKeyUp("w")){
			selected.rigidbody.AddForce(Vector3.up * speed, ForceMode.Impulse);
		}else if(Input.GetKeyUp("s")){
			selected.rigidbody.AddForce(-Vector3.up *speed, ForceMode.Impulse);
		}else if(Input.GetKeyUp("a")){
			if(mainCamera02.GetQuadranAngle() == 2){
				selected.rigidbody.AddForce(Vector3.forward * speed, ForceMode.Impulse);
			}else if(mainCamera02.GetQuadranAngle() == 3){
				selected.rigidbody.AddForce(Vector3.right * speed, ForceMode.Impulse);
			}else if(mainCamera02.GetQuadranAngle() == 4){
				selected.rigidbody.AddForce(-Vector3.forward * speed, ForceMode.Impulse);
			}else{
				selected.rigidbody.AddForce(-Vector3.right * speed, ForceMode.Impulse);
			}
		}else if(Input.GetKeyUp("d")){
			if(mainCamera02.GetQuadranAngle() == 2){
				selected.rigidbody.AddForce(-Vector3.forward * speed, ForceMode.Impulse);
			}else if(mainCamera02.GetQuadranAngle() == 3){
				selected.rigidbody.AddForce(-Vector3.right * speed, ForceMode.Impulse);
			}else if(mainCamera02.GetQuadranAngle() == 4){
				selected.rigidbody.AddForce(Vector3.forward * speed, ForceMode.Impulse);
			}else{
				selected.rigidbody.AddForce(Vector3.right * speed, ForceMode.Impulse);
			}
		}

In Unity, it is said that one should only put physics calculations inside the FixedUpdate function and let the game logic remains in the Update function. Here I have both inside the Update function. It’s a getkeyUp, so the AddForce is only executed once, but I can’t know for sure if it will impact on performance later. If yes, I would like to know how to separate the physics (all the AddForces functions) from the game logic (all the inputs executions), so I can place the physics inside a FixedUpdate function and place the game logic in the other ?

You can do that by initializing a vector and changing it according to the user input. After that you can use the same vector in the FixedUpdate() to move the player.

Here is the code:

Vector3 force;

void Start()
{
	force = new Vector3.Zero;
}

void Update()
{
	if(Input.GetKeyUp("w"))
	{
		force = Vector3.up * speed;
	}
	else if(Input.GetKeyUp("s"))
	{
		force = -Vector3.up * speed;
	}
	else if(Input.GetKeyUp("a"))
	{
		if(mainCamera02.GetQuadranAngle() == 2)
		{
			force = Vector3.forward * speed;
		}
		else if(mainCamera02.GetQuadranAngle() == 3)
		{
			force = Vector3.right * speed;
		}
		else if(mainCamera02.GetQuadranAngle() == 4)
		{
			force = -Vector3.forward * speed;
		}
		else
		{
			force = -Vector3.right * speed;
		}
	}
	else if(Input.GetKeyUp("d"))
	{
		if(mainCamera02.GetQuadranAngle() == 2)
		{
			force = -Vector3.forward * speed;
		}
		else if(mainCamera02.GetQuadranAngle() == 3)
		{
			force = -Vector3.right * speed;
		}
		else if(mainCamera02.GetQuadranAngle() == 4)
		{
			force = Vector3.forward * speed;
		}
		else
		{
			force = Vector3.right * speed;
		}
	}
}

void FixedUpdate()
{
	selected.rigidbody.AddForce(force, ForceMode.Impulse);
}

I don’t have Unity Editor in my iPhone (how unfortunate) so there might be some typos that might cause errors. Otherwise the code should be fine and work out of the box.

I found a way to make it work with jaakaappi’s code. Did you find another simpler way to solve this ?

private var pressed : boolean = false;

function Update(){
       if(cubeSelected){
		//Let's search for the speed of our cube
		var speed : float = selected.GetComponent(BaseCube).speed;
		
		if(!pressed){	
		
			//KEYBOARD INPUTS
			if(Input.GetKeyUp("w")){
				force = Vector3.up * speed;
				pressed = true;
			}else if(Input.GetKeyUp("s")){
				force = -Vector3.up *speed;
				pressed = true;
			}else if(Input.GetKeyUp("a")){
				if(mainCamera02.GetQuadranAngle() == 2){
					force = Vector3.forward * speed;
					pressed = true;
				}else if(mainCamera02.GetQuadranAngle() == 3){
					force = Vector3.right * speed;
					pressed = true;
				}else if(mainCamera02.GetQuadranAngle() == 4){
					force = -Vector3.forward * speed;
					pressed = true;
				}else{
					force = -Vector3.right * speed;
					pressed = true;
				}
			}else if(Input.GetKeyUp("d")){
				if(mainCamera02.GetQuadranAngle() == 2){
					force = -Vector3.forward * speed;
					pressed = true;
				}else if(mainCamera02.GetQuadranAngle() == 3){
					force = -Vector3.right * speed;
					pressed = true;
				}else if(mainCamera02.GetQuadranAngle() == 4){
					force = Vector3.forward * speed;
					pressed = true;
				}else{
					force = Vector3.right * speed;
					pressed = true;
				}
			}
		
		}
		
	}
}

function FixedUpdate(){
     if(cubeSelected){
		if(pressed){
			selected.rigidbody.AddForce(force, ForceMode.Impulse);
			pressed = false;
		}
	}
}