- Home /

# Diagonal Speed

Hey guys, I'm stuck with the "crossing the square" bug. When I walk on diagonal the speed increases. I readed all stuff I found about, but still not able to fix it. I coded by myself the movement, and I'm not using axis for reasons. So, can anyone help me? The code:

```
using UnityEngine;
using System.Collections;
public class PlayerMovement : MonoBehaviour {
Animator anim;
private CharacterController playerController;
public float speed = 10.0F;
public float runSpeed = 20.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
public float rotationSpeed = 5.0f;
private float vSpeed = 0.0f;
void Start(){
anim = GetComponent<Animator> ();
}
void Update() {
playerController = GetComponent<CharacterController> ();
//Directions
Vector3 yForward = Camera.main.transform.forward;
yForward.y = 0.0f;
Quaternion rotationForward = Quaternion.LookRotation (yForward);
Vector3 yRight = Camera.main.transform.right;
yRight.y = 0.0f;
Quaternion rotationRight = Quaternion.LookRotation (yRight);
Vector3 yLeft = Camera.main.transform.right * -1f;
yLeft.y = 0.0f;
Quaternion rotationLeft = Quaternion.LookRotation (yLeft);
Vector3 yBackward = Camera.main.transform.forward * -1f;
yBackward.y = 0.0f;
Quaternion rotationBackward = Quaternion.LookRotation (yBackward);
vSpeed -= gravity * Time.deltaTime;
Vector3 yDownward = Vector3.down;
yDownward.x = 0.0f;
yDownward.z = 0.0f;
//Movement
if (playerController.isGrounded){
vSpeed = 0.0f;
if (Input.GetButton ("Forward")) {
transform.rotation = Quaternion.Lerp (transform.rotation, rotationForward, rotationSpeed * Time.deltaTime);
Vector3 forward = transform.TransformDirection (Vector3.forward);
playerController.Move (forward * Time.deltaTime * speed);
}
if (Input.GetButton ("Right")) {
transform.rotation = Quaternion.Lerp (transform.rotation, rotationRight, rotationSpeed * Time.deltaTime);
Vector3 forward = transform.TransformDirection (Vector3.forward);
playerController.Move (forward * Time.deltaTime * speed);
}
if (Input.GetButton ("Left")) {
transform.rotation = Quaternion.Lerp (transform.rotation, rotationLeft, rotationSpeed * Time.deltaTime);
Vector3 forward = transform.TransformDirection (Vector3.forward);
playerController.Move (forward * Time.deltaTime * speed);
}
if (Input.GetButton ("Backward")) {
transform.rotation = Quaternion.Lerp (transform.rotation, rotationBackward, rotationSpeed * Time.deltaTime);
Vector3 forward = transform.TransformDirection (Vector3.forward);
playerController.Move (forward * Time.deltaTime * speed);
}
//Animation
float playerSpeed = playerController.velocity.magnitude;
anim.SetFloat ("Speed", playerSpeed);
}
playerController.Move (yDownward);
}
}
```

Sorry for any mistakes, eng not my native Thank you all

### People who like this

Have a Vector3 "moveVector" and assign a value to it according to user input. This can be done multiple times (once for forward, once for right, for example). At the end of the input phase, and when no other factors hould affect the movement vector, use movector.normalized to get values from -1 to 1 for the xyz axis. Use this normalized Vector to actually move your character via Transform.Translate, playerController.Move or whatever you use.

For the case of analog controls (and general efficiency), it can also be advantageous to only normalize the direction when necessary. Namely, if moveVector.sqrMagnitude is greater than 1, normalize it.

Do you have any example? Sorry, it's not clear to me

```
private Vector3 moveVector;
void Update() {
moveVector = Vector3.zero;
if (Input.GetButton ("Forward")) {
moveVector += transform.forward;
}
if (Input.GetButton ("Left")) {
moveVector -= transform.right;
}
playerController.Move (moveVector.normalized * Time.deltaTime * speed);
}
```

### Your answer

### Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.