- Home /
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 ?
Answer by jaakaappi · Jul 09, 2013 at 08:58 AM
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.
Hey ! Thank you for the answer, but I don't search a way to apply the force at any frame. I want only to apply once the speed to the rigidbody each time I press a key.
I posted a new answer, because I found a new way to make it work, but I don't know if it's the most efficient one... Would you check it for me and see if there is a better way to solve this ?
Thanks !
Answer by Karavans Games · Jul 11, 2013 at 07:25 PM
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;
}
}
}
Your answer
Follow this Question
Related Questions
what are the single joystick prefab's inputs for the input manager 1 Answer
New Input System how to set a variable for context callback? 1 Answer
Pressing 'A' on controller when setting custom inputs ingame will reselect the menu button 0 Answers
How to detect inputs with New Input System while game is unfocused? 1 Answer