- Home /
Top-down player rotation using rigidbody
I am trying to create a top-down character controller using the rigidbody physics system, but I am running into several problems with collision.
Currently I'm trying to get the player to rotate in the direction it's moving. Rotating the player with something like Slerp works fine until you run into a wall, the player starts twitching, trying to get back to the right rotation. I want to make it rotate using AddTorque as this will fix my physics problem, but as it stands I cant find a good way to do it. The main issue is to get the player to stop rotating when the desired angle is reached. Also, I don't really know how to get the player to take the shortest path to the desired angle.
My code currently looks like this, here I'm still using the Slerp. (because... well, I can't even get a basic AddTorque script off the ground... :/ )
private Vector2 movement;
public float speed;
private Vector2 inputDirection;
private float targetAngle;
public float rotateSpeed;
private Quaternion q;
void Start () // Use this for initialization
{
}
void Update () // Update is called once per frame
{
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxisRaw ("Horizontal");
float moveVertical = Input.GetAxisRaw ("Vertical");
inputDirection = new Vector2(moveHorizontal, moveVertical);
if (inputDirection != Vector2.zero)
{
rigidbody2D.AddForce(inputDirection.normalized * speed);
}
if(rigidbody2D.velocity != Vector2.zero)
{
movement = rigidbody2D.velocity;
targetAngle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg - 90;
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, 0, targetAngle), rotateSpeed * Time.deltaTime);
}
}
I hope that somebody can help me with this since my quest for a working solution has not been successful thus far.