- 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
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.$$anonymous$$ove 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.sqr$$anonymous$$agnitude 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.$$anonymous$$ove (moveVector.normalized * Time.deltaTime * speed);
}