- Home /
Movement inverts when changing direction
Hello!
Having an annoying issue when moving my player around a scene. When facing right the up and down buttons work as they should, but when I face left the up and down buttons are inverted.
void movement ()
{
position = transform.TransformDirection(Vector3.right)*speed;
if(Input.GetKey(KeyCode.LeftArrow))
{
transform.eulerAngles = new Vector3(0,180);
FacingRight= false;
{
controller.Move(position * Time.deltaTime);
}
}
if (Input.GetKey (KeyCode.RightArrow))
{
transform.eulerAngles = new Vector3 (0,0);
FacingRight = true;
{
controller.Move (position * Time.deltaTime);
}
}
if (Input.GetKey (KeyCode.DownArrow))
{
controller.Move(-transform.forward * speed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.UpArrow))
{
controller.Move(transform.forward * speed * Time.deltaTime);
}
}
I tried using transform.Translate instead of controller.Move for the up and down arrows. While it did move correctly, It caused the player to move through objects/ colliders didn't interact with the object.
Any help would be greatly appreciated
Answer by Nanity · Jul 07, 2015 at 07:37 AM
Is this 2D or 3D? Because with this code you limit your movement to one axis. Try this for 3D movement on a plane:
void movement ()
{
float turnspeed = 30.0f; //play with this value
if(Input.GetKey(KeyCode.LeftArrow))
{
FacingRight = false;
transform.rotation *= Quaternion.AngleAxis(turnspeed*Time.deltaTime,Vector3.up);
}
if (Input.GetKey (KeyCode.RightArrow))
{
FacingRight = true;
transform.rotation *= Quaternion.AngleAxis(-turnspeed*Time.deltaTime,Vector3.up);
}
if (Input.GetKey (KeyCode.DownArrow))
{
controller.Move(-transform.forward * speed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.UpArrow))
{
controller.Move(transform.forward * speed * Time.deltaTime);
}
}
If left and right are wrong, swap the minus from the turnspeed.
Sorry about the confusion, It is in 3d but what I'm going for is Castle crashers/Scott pilgrim 2d sort of movement. So the player will either be facing right of left; and moving left, right, toward, and away from the camera.
Then it should be:
void movement ()
{
if(Input.Get$$anonymous$$ey($$anonymous$$eyCode.LeftArrow))
{
FacingRight = false;
transform.rotation = LookRotation(Vector3.left, Vector3.up);
controller.$$anonymous$$ove(Vector3.left * speed * Time.deltaTime);
}
if (Input.Get$$anonymous$$ey ($$anonymous$$eyCode.RightArrow))
{
FacingRight = true;
transform.rotation = LookRotation(Vector3.right, Vector3.up);
controller.$$anonymous$$ove(Vector3.right * speed * Time.deltaTime);
}
if (Input.Get$$anonymous$$ey ($$anonymous$$eyCode.DownArrow))
{
controller.$$anonymous$$ove(Vector3.back * speed * Time.deltaTime);
}
if (Input.Get$$anonymous$$ey ($$anonymous$$eyCode.UpArrow))
{
controller.$$anonymous$$ove(Vector3.forward * speed * Time.deltaTime);
}
}
You may have to rotate your scene and camera according to the axis of the world.