- Home /
Time.deltaTime is not smooth
Hi! I want to make smooth animations for my character so I used blend trees. In my "Walking" blend tree I have the animations for walking, and it's set to "2D Freeform Directional". As you can see down below, when I press the WASD key the variables change so I can smoothly go throw the animations. So the problem is that the Time.deltatime does not reset the "udspeed" back to 0 SMOOTHLY, when I release the "W" key, it is instant. Does anyone know any solution? Thank you in advance.
[SerializeField] Animator anim;
float udspeed = 0f;
float rlspeed = 0f;
// Start is called before the first frame update
void Start()
{
udspeed = 0f;
rlspeed = 0f;
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.W))
{
if (udspeed <= 1)
{
udspeed += 2f * Time.deltaTime;
}
}
else if (Input.GetKey(KeyCode.S))
{
if (udspeed >= -1)
{
udspeed -= 2f * Time.deltaTime;
}
}
else if (Input.GetKey(KeyCode.A))
{
if (rlspeed >=-1)
{
rlspeed -= 2f * Time.deltaTime;
}
}
else if (Input.GetKey(KeyCode.D))
{
if (rlspeed <= 1)
{
rlspeed += 2f * Time.deltaTime;
}
}
else if(Input.GetKeyUp(KeyCode.W))
{
if (udspeed > 0)
{
while (udspeed > 0)
{
udspeed -= 1f * Time.deltaTime;
}
}
}
//rlspeed = 0f;
anim.SetFloat("Vertical_f", udspeed);
anim.SetFloat("Horizontal_f", rlspeed);
}
Answer by Bunny83 · Apr 23, 2020 at 04:28 PM
Well, this code doesn't work.
else if(Input.GetKeyUp(KeyCode.W))
{
if (udspeed > 0)
{
while (udspeed > 0)
{
udspeed -= 1f * Time.deltaTime;
}
}
}
GetKeyUp is only true for one frame. So everything that happens inside that if statement only happens during one frame. You use a while loop which will loop until udspeed is lower or equal to 0. Again this happens during one frame. If you just want to make udspeed return to 0 when no key is pressed, just use
else
{
udspeed = Mathf.MoveTowards(udspeed, 0, 1*Time.deltaTime);
}
So when no key is down we will fall through all if statements and execute the final else clause every frame. MoveTowards will, when executed every frame, slowly take the variable towards the target value. In our case 0. You could actually replace all your cases with a similar logic. MoveTowards will actually ensure that the value does not exceed the target value. If the value is already at the target value, nothing will happen.