# Question Moving the Player Diagonally

Discussion in 'Animation' started by omern92, Dec 28, 2023.

1. ### omern92

Joined:
May 31, 2022
Posts:
4
Hi all,
I have the following snippet (see below) for moving the Player around according to inputs via Unity's new Input System.
I have the following problem/question:
I want the player to move smoothly from forward to left/right.
I have animations for Running, and Running fast, but they are forward only.

So I tried to manipulate it via code with:
Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);

Although it does the work, I don't know if it's the best practice and a good method, because I read that Lerp
is overused unnecessarily and that it consumes a lot of resources.

Code (CSharp):
1.     private void Update()
2.     {
3.         // Read the input vector from the "Movement" action
5.
6.         // Convert the input vector to a direction vector in world space
7.         Vector3 direction = new Vector3(inputVector.x, 0, inputVector.y);
8.
9.         // Move the player in the input direction if there is input
10.         if (direction.magnitude > 0.01f)
11.         {
12.             // Update the last direction to the input direction
13.             lastDirection = direction.normalized;
14.
15.             // Update the last non-zero direction to the input direction
16.             if (lastDirection.magnitude > 0.01f)
17.             {
18.                 lastNonZeroDirection = lastDirection;
19.             }
20.
21.             //// Animation Sector ////
22.             anim.SetBool("IsMoving", true);
23.             moveTime += Time.deltaTime;
24.             anim.SetFloat("MoveTime", moveTime);
25.
26.             while (moveTime > 1.9f)
27.             {
28.                 moveTime = 1.9f;
29.             }
30.             // Move the player in the input direction
31.             transform.position += lastDirection * speed * moveTime * Time.deltaTime;
32.         }
33.         else
34.         {
35.             //// Animation Sector ////
36.             anim.SetBool("IsMoving", false);
37.             moveTime = 1f;
38.             anim.SetFloat("MoveTime", moveTime);
39.         }
40.
41.         // Rotate the player towards the last direction or last non-zero direction if there is no input
42.         if (lastDirection.magnitude > 0.01f)
43.         {
44.             // Calculate the target rotation based on the last direction
45.             float angle = Mathf.Atan2(lastDirection.x, lastDirection.z) * Mathf.Rad2Deg;
46.             Quaternion targetRotation = Quaternion.Euler(0, angle, 0);
47.
48.             // Interpolate between the current rotation and the target rotation
49.             transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);
50.         }
51.         else if (lastNonZeroDirection.magnitude > 0.01f)
52.         {
53.             // Calculate the target rotation based on the last non-zero direction
54.             float angle = Mathf.Atan2(lastNonZeroDirection.x, lastNonZeroDirection.z) * Mathf.Rad2Deg;
55.             Quaternion targetRotation = Quaternion.Euler(0, angle, 0);
56.
57.             // Interpolate between the current rotation and the target rotation
58.             transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);
59.         }
60.
61.     }