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