- Home /
How can i pause gradually from timeScale 1.0 to 0.0 over a second?
Hello,
Noob here. I want to smoothly pause the game after pressing Esc. I tried Mathf.Lerp with no success. I assume it's tied to the fact that the timeScale updates only for a frame on pressing Esc. So, i want the timeScale to go from 1.0f after pressing Esc and decrease smoothly over a second to 0.0f during which i also move the camera a bit.
This is what i have attached to the Camera:
bool CanPause;
float smooth = 1;
void Start()
{
Time.timeScale = 1;
}
void Update()
{
if (Input.GetButtonDown("Cancel"))
{
if (CanPause)
{
smooth -= smooth * Time.deltaTime;
Time.timeScale = smooth;
CanPause = false;
}
else
{
Time.timeScale = 1;
CanPause = true;
}
}
Also I was getting some out of range values when experimenting with MathfLerp and tried the Mathf.Clamp to keep them between 1.0 and 0.0 to no avail. Please help!
Answer by chelupars · Jul 20, 2015 at 01:18 PM
Thanks to robertbu for answering a very similar topic. Modified the original a little and made it feel hackish but it works! Here is the answer:
IEnumerator ScaleTime(float start, float end, float time) //not in Start or Update
{
float lastTime = Time.realtimeSinceStartup;
float timer = 0.0f;
while (timer < time)
{
Time.timeScale = Mathf.Lerp (start, end, timer / time);
timer += (Time.realtimeSinceStartup - lastTime);
lastTime = Time.realtimeSinceStartup;
yield return null;
}
Time.timeScale = end;
}
void Update ()
{
if (Input.GetButtonDown("Cancel") && Time.timeScale == 1)
{
StartCoroutine(ScaleTime(1.0f, 0.0f, 1.0f));
}
if (Input.GetButtonDown("Cancel") && Time.timeScale == 0)
{
StartCoroutine(ScaleTime(0.0f, 1.0f, 1.0f));
}
Your answer
Follow this Question
Related Questions
Orbit camer while paused? 1 Answer
Camera zoom smoothing 1 Answer
How to pause only specific objects/prefabs? 3 Answers
Dramatic Camera effect with all physical gameobjects paused? 0 Answers