Player's rotation gets stuck when pressing two movement keys together
So I'm making a simple game, where the player controls a car that can only turn around on the X-axis, while the textures of the world are constantly moving, so that it creates an effect that the car is moving forward while in fact it isn't. I also added a feature via Quaternion.Slerp that turns the car on the Y-axis, so that it would create an effect of an actual turning car, just like a real-life car would turn. The problem is that the Y-axis rotation can get stuck on a set angle if I press two buttons together, so it looks like the car is drifting non-stop. Obviously I don't want that, however I don't really know how to fix that. I've tried looking up an answer but i came up empty.
public class PlayerController : MonoBehaviour
{
public Quaternion currentAngle;
Quaternion targetAngleBegining = Quaternion.Euler(0f, 0f, 0f);
Quaternion targetAngleEndRight = Quaternion.Euler(0f, 30.0f, 0f);
Quaternion targetAngleEndLeft = Quaternion.Euler(0f, -30.0f, 0f);
private float xTurnLimit = 8.0f;
public float turnSpeed;
private void Start()
{
currentAngle = targetAngleBegining;
}
private void Update()
{
MovePlayer();
ClampPlayerTurn();
}
private void MovePlayer()
{
Vector3 rotationOrigin = Vector3.zero;
float playerMovement = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * playerMovement * turnSpeed * Time.deltaTime, Space.World);
if(Input.GetKeyDown(KeyCode.D))
{
if(currentAngle.eulerAngles.y==targetAngleBegining.eulerAngles.y)
{
currentAngle = targetAngleEndRight;
}
else
{
currentAngle = targetAngleBegining;
}
}
if(Input.GetKeyUp(KeyCode.D))
{
if (currentAngle.eulerAngles.y == targetAngleEndRight.eulerAngles.y)
{
currentAngle = targetAngleBegining;
}
else
{
currentAngle = targetAngleEndRight;
}
}
if(Input.GetKeyDown(KeyCode.A))
{
if(currentAngle.eulerAngles.y==targetAngleBegining.eulerAngles.y)
{
currentAngle = targetAngleEndLeft;
}
else
{
currentAngle = targetAngleBegining;
}
}
if (Input.GetKeyUp(KeyCode.A))
{
if (currentAngle.eulerAngles.y == targetAngleEndLeft.eulerAngles.y)
{
currentAngle = targetAngleBegining;
}
else
{
currentAngle = targetAngleEndLeft;
}
}
this.transform.rotation = Quaternion.Slerp(this.transform.rotation, currentAngle, 0.010f);
}
private void ClampPlayerTurn()
{
if(transform.position.x < -xTurnLimit)
{
transform.position = new Vector3(-xTurnLimit, transform.position.y, transform.position.z);
}
else if(transform.position.x > xTurnLimit)
{
transform.position = new Vector3(xTurnLimit, transform.position.y, transform.position.z);
}
}
}
Here's my code. It's not pretty, but it works somehow. I'm always open to suggestions and criticism. Thanks in advance if you've replaied to my question.
Your answer
![](https://koobas.hobune.stream/wayback/20220613035802im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Camera Rotation Around Player 1 Answer
Making the player the camera's axis of rotation. 0 Answers
Some problems with handmade basic player controller 0 Answers
LookAt() not working? 2 Answers