Home > Enterprise >  Unity 2D, rotate Vector2 to NEW Vector2 in animation
Unity 2D, rotate Vector2 to NEW Vector2 in animation

Time:07-13

My game is 2D from a top down-ish perspective, my character movement vector2 being fed into the animator blend to determine which direction my sprite faces: (example sprite)

Vector2 movement = new Vector2(Input.GetAxis("Horizontal"), 
                              Input.GetAxisRaw("Vertical"));
anim.SetFloat("hor", movement.x);
anim.SetFloat("ver", movement.y);

enter image description here

However, I would like my sprite to rotate to it's new target vector2 rather than instantly switch to it. So if I was facing right, and I pushed left, the movement vector2 would travel over time to a new movementTarget vector2, the sprite changing from facing right, to up, to left.

enter image description here

I cannot figure or find a way to do this and have been on it many hours. I've tried things like Vector3.RotateTowards and angles, but each approach I can't get what I'm looking for as this aspect of math just confuses me.

Could someone point me in the right direction?

Vector2 targetMovement = new Vector2(Input.GetAxis("Horizontal"), 
                              Input.GetAxisRaw("Vertical"));

if (targetMovement != movement) coroutine?????

I don't want to rotate the sprite image, or the object transform, just the movement Vector2 variable over time. So if I am facing right (1,0) and press left, I want the Vector to travel through (0,1 - up) then finally to (-1,0 - left) but gradually.

enter image description here

CodePudding user response:

Managed to do it like this. Unsure if best way?

float currAngle, targAngle;

Vector2 movement = new Vector2(Input.GetAxis("Horizontal"), 
                              Input.GetAxisRaw("Vertical"));

if (movement != Vector2.zero)
    targAngle = Mathf.Atan2(movement.y, movement.x) * Mathf.Rad2Deg;

if (Mathf.Abs(currAngle - targAngle) > 1f) {
    currAngle = Mathf.LerpAngle(currAngle, targAngle, 10f * Time.deltaTime);
    Vector2 newVec = new Vector2(Mathf.Cos(currAngle * Mathf.Deg2Rad), 
                                 Mathf.Sin(currAngle * Mathf.Deg2Rad));
    anim.SetFloat("hor", newVec.x);
    anim.SetFloat("ver", newVec.y);
    }
  • Related